stm32(新手村第二天)(宏的概念|定义宏|带参宏【续行符】)

天数:第二天

总内容: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的输入和输出

待补充

七、启动文件 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值