寒假学习(13)(HAL库4+模数电13)

还是尝试着用直接对于寄存器去操作设备,强迫自己去改变自己的编码规范,感觉这个是一件相对的事情,如果一开始随便写不考虑复用性和修改便利性,写的是很快,写出的代码只要是逻辑没有问题也是能用的,但是就想我写的如果一开始直接写在main()函数里面,同样的代码也能完成同样的效果,但是如果不能模块处理,我下一次想要用就还要重新写,这大大浪费了以后修改的时间加大工作量,所以还是建议大家把代码函数模块化然后把程序写在一个Bsp文见里面,然后再把Bsp放到main函数里面

cpp 复制代码
#ifndef __RGB_H
#define __RGB_H

#include "main.h"


enum  RGB 
{
	ALL_RGB =0,
	L_R ,
	L_G,
	L_B,
	
	R_R ,
	R_G,
	R_B,
};

void RGB_togle(int led_num);
void RGB_on(int led_num);
void RGB_off(int led_num);
void RGB_init(void);


#endif
cpp 复制代码
#include "Bsp.h"

void Bsp_init(void)
{
	 RGB_init();
}	


void Bsp_work(void)
{
	RGB_togle(L_R);
	HAL_Delay(250);
	
	RGB_togle(L_G);
	HAL_Delay(250);
	
	RGB_togle(L_B);
	HAL_Delay(250);
	
	RGB_togle(R_R);
	HAL_Delay(250);
	
	RGB_togle(R_G);
	HAL_Delay(250);
	
	RGB_togle(R_B);
	HAL_Delay(250);
}
cpp 复制代码
#ifndef __BSP_H
#define __BSP_H

#include "main.h"
#include "RGB.h"

void Bsp_init(void);

void Bsp_work(void);


#endif
cpp 复制代码
#include "RGB.h"

void RGB_init(void)
{
	
//    //配置RCC
//    RCC->APB2ENR |= RCC_APB2ENR_IOPGEN;
//	RCC->APB2ENR |= RCC_APB2ENR_IOPEEN;
//    //配置GPIO
//    GPIOG->CRL |= GPIO_CRL_MODE1;
//    GPIOG->CRL &= ~(GPIO_CRL_CNF1);//L_R
//    GPIOG->CRL |= GPIO_CRL_MODE2;
//    GPIOG->CRL &= ~(GPIO_CRL_CNF2);//L_B
//	GPIOE->CRL |= GPIO_CRL_MODE7;
//    GPIOE->CRL &= ~(GPIO_CRL_CNF7);//L_G
//	
//	GPIOE->CRL |= GPIO_CRL_MODE2;
//    GPIOE->CRL &= ~(GPIO_CRL_CNF2);//R_R
//    GPIOE->CRL |= GPIO_CRL_MODE3;
//    GPIOE->CRL &= ~(GPIO_CRL_CNF3);//R_G
//	GPIOE->CRL |= GPIO_CRL_MODE4;
//    GPIOE->CRL &= ~(GPIO_CRL_CNF4);//R_B
	
	
	
}

void RGB_on(int led_num)
{
//	switch(led_num)
//	{
//		case L_R: GPIOG->ODR |= GPIO_ODR_ODR1; break;
//		case L_B: GPIOG->ODR |= GPIO_ODR_ODR2; break;
//		case L_G: GPIOE->ODR |= GPIO_ODR_ODR7; break;
//		case R_R: GPIOE->ODR |= GPIO_ODR_ODR2; break;
//		case R_B: GPIOE->ODR |= GPIO_ODR_ODR3; break;
//		case R_G: GPIOE->ODR |= GPIO_ODR_ODR4; break;
//		default : GPIOG->ODR |= GPIO_ODR_ODR1; GPIOG->ODR |= GPIO_ODR_ODR2;GPIOE->ODR |= GPIO_ODR_ODR7;
//		          GPIOE->ODR |= GPIO_ODR_ODR2; GPIOE->ODR |= GPIO_ODR_ODR3; GPIOE->ODR |= GPIO_ODR_ODR4;break;
//	}
	
	switch(led_num)
	{
		case L_R: HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_SET); break;
		case L_B: HAL_GPIO_WritePin(GPIOG,GPIO_PIN_2,GPIO_PIN_SET); break;
		case L_G: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_SET); break;
		case R_R: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET); break;
		case R_B: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET); break;
		case R_G: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET); break;
	}
}

void RGB_off(int led_num)
{
//	switch(led_num)
//	{
//		case L_R: GPIOG->ODR  &= ~ GPIO_ODR_ODR1; break;
//		case L_B: GPIOG->ODR  &= ~ GPIO_ODR_ODR2; break;
//		case L_G: GPIOE->ODR  &= ~ GPIO_ODR_ODR7; break;
//		case R_R: GPIOE->ODR  &= ~ GPIO_ODR_ODR2; break;
//		case R_B: GPIOE->ODR  &= ~ GPIO_ODR_ODR3; break;
//		case R_G: GPIOE->ODR  &= ~ GPIO_ODR_ODR4; break;
//		default: GPIOG->ODR  &= ~ GPIO_ODR_ODR1; GPIOG->ODR  &= ~ GPIO_ODR_ODR2; GPIOE->ODR  &= ~ GPIO_ODR_ODR7;
//				 GPIOE->ODR  &= ~ GPIO_ODR_ODR2; GPIOE->ODR  &= ~ GPIO_ODR_ODR3; GPIOE->ODR  &= ~ GPIO_ODR_ODR4;break;
//	}
	
	switch(led_num)
	{
		case L_R: HAL_GPIO_WritePin(GPIOG,GPIO_PIN_1,GPIO_PIN_RESET); break;
		case L_B: HAL_GPIO_WritePin(GPIOG,GPIO_PIN_2,GPIO_PIN_RESET); break;
		case L_G: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_7,GPIO_PIN_RESET); break;
		case R_R: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET); break;
		case R_B: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET); break;
		case R_G: HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET); break;
	}
}

void RGB_togle(int led_num)
{

//	switch(led_num)
//	{
//		case L_R: 
//		{	    
//			if((GPIOG->IDR&GPIO_IDR_IDR1) != 0)
//			{
//				GPIOG->ODR &= ~GPIO_ODR_ODR1;
//			}
//			else
//			{
//				GPIOG->ODR |= GPIO_ODR_ODR1;
//			}
//		}
//		break;
//		case L_B: 
//		{	    
//			if((GPIOG->IDR&GPIO_IDR_IDR2) != 0)
//			{
//				GPIOG->ODR &= ~GPIO_ODR_ODR2;
//			}
//			else
//			{
//				GPIOG->ODR |= GPIO_ODR_ODR2;
//			}
//		}
//		break;
//		case L_G: 
//		{	    
//			if((GPIOE->IDR&GPIO_IDR_IDR7) != 0)
//			{
//				GPIOE->ODR &= ~GPIO_ODR_ODR7;
//			}
//			else
//			{
//				GPIOE->ODR |= GPIO_ODR_ODR7;
//			}
//		}
//		break;	
//		case R_R: 
//		{	    
//			if((GPIOE->IDR&GPIO_IDR_IDR2) != 0)
//			{
//				GPIOE->ODR &= ~GPIO_ODR_ODR2;
//			}
//			else
//			{
//				GPIOE->ODR |= GPIO_ODR_ODR2;
//			}
//		}
//		break;	
//		case R_B:
//		{	    
//			if((GPIOE->IDR&GPIO_IDR_IDR4) != 0)
//			{
//				GPIOE->ODR &= ~GPIO_ODR_ODR4;
//			}
//			else
//			{
//				GPIOE->ODR |= GPIO_ODR_ODR4;
//			}
//		}
//		break;	
//			
//		case R_G: 
//		{	    
//			if((GPIOE->IDR&GPIO_IDR_IDR3) != 0)
//			{
//				GPIOE->ODR &= ~GPIO_ODR_ODR3;
//			}
//			else
//			{
//				GPIOE->ODR |= GPIO_ODR_ODR3;
//			}
//		}
//		break;	
//				 
//	}

switch(led_num)
	{
		case L_R: HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_1); break;
		case L_B: HAL_GPIO_TogglePin(GPIOG,GPIO_PIN_2); break;
		case L_G: HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_7); break;
		case R_R: HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_2); break;
		case R_B: HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3); break;
		case R_G: HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_4); break;
	}

}
cpp 复制代码
void key_exit_init(void)
{
	RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;//开启相应时钟
	
	AFIO->EXTICR[0] &= ~AFIO_EXTICR1_EXTI3;
	AFIO->EXTICR[1] &= ~AFIO_EXTICR2_EXTI4;
	AFIO->EXTICR[1] &= ~AFIO_EXTICR2_EXTI5;
	
	
	AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI3_PG;
	AFIO->EXTICR[0] |= AFIO_EXTICR2_EXTI4_PG;
	AFIO->EXTICR[1] |= AFIO_EXTICR2_EXTI5_PG;//AFIO选择器
	
	EXTI->IMR |= EXTI_IMR_MR3_Msk;
	EXTI->IMR |= EXTI_IMR_MR4_Msk;
	EXTI->IMR |= EXTI_IMR_MR5_Msk;
	
	EXTI->RTSR |= EXTI_RTSR_TR3;
	EXTI->RTSR |= EXTI_RTSR_TR4;
	EXTI->RTSR |= EXTI_RTSR_TR5;//EXTI外部中断管理
	
	NVIC_SetPriorityGrouping(3);//NVIC中断向量分组,3是全为抢占
	NVIC_SetPriority(EXTI3_IRQn,0);
	NVIC_SetPriority(EXTI4_IRQn,2);
	NVIC_SetPriority(EXTI9_5_IRQn,4);
	NVIC_EnableIRQ(EXTI3_IRQn);
	NVIC_EnableIRQ(EXTI4_IRQn);
	NVIC_EnableIRQ(EXTI9_5_IRQn);
}

//void EXTI3_IRQHandler(void)
//{
//	//清除中断标志位
//	EXTI->PR |= EXTI_PR_PR3;
//	if((GPIOG->IDR & GPIO_IDR_IDR3) == GPIO_IDR_IDR3)
//	{
//		RGB_togle(L_R);
//		RGB_togle(R_R);
//	}
//}

//void EXTI4_IRQHandler(void)
//{
//	EXTI->PR |= EXTI_PR_PR4;
//	if((GPIOG->IDR & GPIO_IDR_IDR4) == GPIO_IDR_IDR4)
//	{
//		RGB_togle(L_G);
//		RGB_togle(R_G);
//	}
//}

//void EXTI9_5_IRQHandler(void)
//{
//	EXTI->PR |= EXTI_PR_PR5;
//	if((GPIOG->IDR & GPIO_IDR_IDR5) == GPIO_IDR_IDR5)
//	{
//		RGB_togle(L_B);
//		RGB_togle(R_B);
//	}
//}

uint8_t key_value = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_3)
	{
		key_value = 1;
	}
	if(GPIO_Pin == GPIO_PIN_4)
	{
		key_value = 2;
	}
	if(GPIO_Pin == GPIO_PIN_5)
	{
		key_value = 3;
	}
}

中断

中断解决了闭点轮询实时性差的问题

为实现多线程提供基础

电容串并联

串联

并联

相关应用

串联应用

耐压值

容值

代替电阻分压(浪费的少)

并联

大电容和小电容并联

大电容负责低频段,小电容负责高频段,两者并联可以拓宽电源去耦或滤波的有效频率范围。

阻容降压电路

阻容降压的本质是限流,交流电流过电容电流变小

相关推荐
一点程序1 小时前
基于微信小程序的英语词汇学习小程序
学习·微信小程序·小程序
嗯嗯**2 小时前
Neo4j学习2:概念、数据展示、CQL使用
数据库·学习·neo4j·数据存储·图数据库·序列化·cql
whale fall2 小时前
如何在同一台电脑里安装32 位 Python 和 64 位 Python
开发语言·笔记·python·学习
阿蒙Amon2 小时前
TypeScript学习-第9章:类型断言与类型缩小
javascript·学习·typescript
困死,根本不会2 小时前
OpenCV摄像头实时处理:稳定的红绿激光点实时检测工具
笔记·opencv·学习
Y1rong2 小时前
STM32之BKP和RTC
stm32·嵌入式硬件
lingggggaaaa2 小时前
安全工具篇&魔改二开&CheckSum8算法&Beacon密钥&Stager流量&生成机制
学习·算法·安全·web安全·网络安全·免杀对抗
YangYang9YangYan2 小时前
大数据与会计专业学习发展指南
大数据·学习
买辣椒用券2 小时前
STM32F407音频采集与播放实战:INMP441麦克风与MAX98357A扬声器
stm32·嵌入式硬件·音视频