天数:第二天
总内容:6400min
进度(剩余):5846min
今日进度:按键检测(19)
跟:野火
今日学习总结:
大纲
一、宏的概念
二、带参宏【续行符】
三、GPIO按键检测
四、翻转指令的实现:【异或的语法】
五、同时读取多位:(使用按位与)
六、位操作
七、启动文件
正文
一、宏的概念(使用户更明白填进去的是控制啥)
在stm32中,假设一个基地址会映射到GPIOB等等的寄存器,如果直接调用GPIOB不直观,如果将该寄存器映射宏定义为所需要进行的外设名字(如LED_G)则容易区分不同GPIO所对应的不同“器件”
#define LED_G_PIN GPIO_PIN_0
二、带参宏【续行符】
如果想达到
LED_G(ON)
这种效果,需要定义一个带有参数的宏
如:
#define LED_G(a) if(a == true) /*执行开灯函数 ; */ else /*执行关灯函数 ; */
如果嫌弃过长,则可添加续行符转行进行配置
//如果嫌弃长,则添加续行符
// \ //注意续行符后不可以添加任何字符,除了回车
#define LED_G(a) if(a == true) \
/*执行开灯函数 ; */\
else /*执行关灯函数 ; */
注意:假如突然出现十多个错误,极可能是续行符后出现其他的字符
?
三、GPIO按键检测
思考:能不能使用pwm的模式,让不同的按钮接不同的电阻,从而按下的时候给到io口的电平各有不同,则可以让一个io口,负责多个按钮,(例如1~9的按钮,各个给同一个io口不同的pwm,进行判断识别)
在其他单片机中,按键检测需要通过软件进行消抖
因为:按键按下的时候,具有一定时间才稳定IO口的电平
在stm32开发板中,一般并联一个电容
当按钮按下的时候,理应是电容左右端电压都相等,但是因为存在抖动,因此存在电位差。(前提)
一、当电平变高的时候,吸能(不让电位突变到很高)
二、当电平向下抖动的时候,便释放能量(使电位升高)
总体表现:减小抖动的波动值
检测到按钮按下后,要检测是否松手
一、使用while函数,当I口的电平一直在高的时候,进入死循环
二、当松手后,电平掉落到低电平,跳出循环,给出按钮被敲击的返回值
四、异或的使用
异或(^)
当位异或1则改变
当位异或0则不变
?五、同时读取多位:(使用按位与)
假如要同时读取四位
一、把头四位置1
二、按位移动到适合的位置
三、按位与运算后,得到的是目标地址的值
四、解码:如0011,1100,0101 有2^4 = 16的可能性,通过解码后读取
?六、位带操作
概念
ODR是一个16位的操作器,如果直接操作它就一下操作16位
如果要操作ODR中的某一个位,则使用到位带操作
在真正位带区,一个地址中有八个位(相当于直接控制寄存器的话,同时要改变32个位,也就是4个字节)
但是我仅仅想控制其中一个位?
如
但是难以根据根据地址进行控制
因此将位带区的八个位,每个位都膨胀成32倍(4个字节|4个地址)
但是实际上,膨胀后的4个地址中,仅有最低位的地址中的值(0/1)控制该bit位
这样就能根据地址找到相应的位,进行0/1控制
位带操作
范围:(图中的SRAM和片上外设)
?
公式统一为
?
?
寄存器地址:先找到外设地址+偏移量
位号:第几位
使用位带操作,实现GPIO的输入和输出
待补充
七、启动文件?
?
|