寒假学习(13)(HAL库4+模数电13)
还是尝试着用直接对于寄存器去操作设备,强迫自己去改变自己的编码规范,感觉这个是一件相对的事情,如果一开始随便写不考虑复用性和修改便利性,写的是很快,写出的代码只要是逻辑没有问题也是能用的,但是就想我写的如果一开始直接写在main()函数里面,同样的代码也能完成同样的效果,但是如果不能模块处理,我下一次想要用就还要重新写,这大大浪费了以后修改的时间加大工作量,所以还是建议大家把代码函数模块化然后把程序写在一个Bsp文见里面,然后再把Bsp放到main函数里面
#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
#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);
}
#ifndef __BSP_H
#define __BSP_H
#include "main.h"
#include "RGB.h"
void Bsp_init(void);
void Bsp_work(void);
#endif
#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;
}
}
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;
}
}
中断
中断解决了闭点轮询实时性差的问题
为实现多线程提供基础
电容串并联
串联

并联

相关应用
串联应用
耐压值
容值
代替电阻分压(浪费的少)
并联
大电容和小电容并联
大电容负责低频段,小电容负责高频段,两者并联可以拓宽电源去耦或滤波的有效频率范围。
阻容降压电路
阻容降压的本质是限流,交流电流过电容电流变小
本文地址:https://www.yitenyun.com/5399.html
上一篇:Explain的使用和索引解析
下一篇:计算机网络1









