[HAL]代码积累练习(NID.1)

像练习数学和肌肉一样练习你的代码能力~

一、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基准的时钟,但是优先级不如触发的外部中断

解决方案~修改优先级加代码

但是这个部分其实一般不这么用,简单学一下过了就好~

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇