像练习数学和肌肉一样练习你的代码能力~
一、HAL_GPIO
点灯大师~
//点灯大师
HAL_GPIO_WritePin(RED_GPIO_Port,RED_Pin,GPIO_PIN_SET)
//这里的RED 就是RGB里面的自定义的User label
上面是写入gpio电平的代码,我们多写几遍~
下面是HAL_ReadPin,输入读取,可以用于按键:
// 如果KEY1按下,就点亮绿灯
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_SET);
}
// 否则,就熄灭绿灯
else{
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);
}
//自己写一遍
if(HAL_GPIO_ReadPin(KEY1_GPIO_PORT,KEY1_Pin) == GPIO_PIN_RESET)
{
HAL_GPIO_WritePin(RED_GPIO_Port,RED_Pin,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(RED_GPIO_Port,RED_Pin,GPIO_PIN_SET);
}
按键消抖~
有两种,一种是硬件消除抖,原理就是在按键旁边并联一个电容~
还有就是软件消抖,逻辑如下:
理论就是延迟检验,最后锁在空循环里面,条件都是一样的,按键控制加消痘~
//按键消抖代码:延迟检验-
// KEY2消抖
if (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) {
// 如果检测到KEY2低电平,先延时等待50ms
HAL_Delay(50);
// 再判断KEY2是否还处于低电平
if (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)) {
// 确认不是抖动,蓝灯亮灭翻转
HAL_GPIO_TogglePin(BLUE_GPIO_Port, BLUE_Pin);
// 在低电平时候保持空循环,等待KEY2松开到高电平,才能开始下一次检测
while (!HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin))
{
}
}
}
自己写一遍,加入KEY3按下,红灯亮灭翻转一次,正常是高电平,按下就是低电平。
if(!HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)
{
HAL_Delay(50);
if(!HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)
{
HAL_GPIO_TogglePin(RED_GPIO_Port,RED_Pin);
while(!HAL_GPIO_ReadPin(KEY3_GPIO_Port,KEY3_Pin)
{
//在空循环里面自己跑
}
}
}
循迹模块
原理和上述例子相同,说白了就是一个选择逻辑~
// 如果循迹模块输出高电平,说明没有检测到物体靠近(或检测到白线)
if (HAL_GPIO_ReadPin(TCRT_GPIO_Port, TCRT_Pin))
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_SET);
// 如果循迹模块输出低电平,说明检测到物体靠近(或检测到黑线)
else
HAL_GPIO_WritePin(GREEN_GPIO_Port, GREEN_Pin, GPIO_PIN_RESET);
这里就不自己写了
外部中断
通过外部中断实现按键检测:按KEY1让绿灯亮/灭翻转。
拿kk的视频举例子,本质上也就是delay()函数处理的时候不能直接检测外部输入,这和我们常规的思路是有差别的
所以我们需要一个方法,同时满足hal_delay这种耗时任务和按键按下这种需要及时反应的任务~
第一步就是配置管教,配成中断
按键按下,有下降沿,触发中断,下降沿触发,并且勾选操作
看看中断文件(interupt)
找到我们要用的函数,原理就是这里
这里基本不影响时序,我们把翻转亮灭代码写进去
但是这个没做消抖~,所以我们要做到的就是写一个消痘,但是关键来了,消抖本身要用到delay函数来二次判定,但是HAL_Delay依赖一个中断,它可以提供一个1ms基准的时钟,但是优先级不如触发的外部中断
解决方案~修改优先级加代码
但是这个部分其实一般不这么用,简单学一下过了就好~