寒假学习(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;
	}
}

中断

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

为实现多线程提供基础

电容串并联

串联

并联

相关应用

串联应用

耐压值

容值

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

并联

大电容和小电容并联

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

阻容降压电路

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

相关推荐
踏着七彩祥云的小丑2 小时前
嵌入式——认识电子元器件——温度开关系列
单片机·嵌入式硬件
嵌入式小企鹅2 小时前
CPU供需趋紧、DeepSeek V4全链适配、小米开源万亿模型
人工智能·学习·开源·嵌入式·小米·算力·昇腾
宣宣猪的小花园.2 小时前
C语言重难点全解析:内存管理到位运算
c语言·开发语言·单片机
三品吉他手会点灯7 小时前
C语言学习笔记 - 20.C编程预备计算机专业知识 - 变量为什么必须的初始化【重点】
c语言·笔记·学习
sakiko_8 小时前
UIKit学习笔记1-创建项目(使用UIKit)、使用组件
笔记·学习
生信碱移8 小时前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
FreakStudio9 小时前
亲测可用!可本地部署的 MicroPython 开源仿真器
python·单片机·嵌入式·面向对象·并行计算·电子diy·电子计算机
星幻元宇VR10 小时前
VR航空航天科普设备【VR时空直升机】
科技·学习·安全·生活·vr
_李小白10 小时前
【android opencv学习笔记】Day 2: Mat类(图片数据结构体)
android·opencv·学习
rit843249911 小时前
STM32 + DS3231 + TM1640 实时时钟数码管显示系统
stm32·单片机·嵌入式硬件