导读:开启新的专栏啦~希望大家可以多多支持呀!!!《蓝桥杯嵌入式》专栏文章是博主在自学stm32期间所做的学习笔记,同时为了备战蓝桥杯比赛,博主在学习期间所用的开发板为蓝桥杯嵌入式专用开发板。菜鸟思维,写的可能会有一点繁琐,但是我觉得学习是要一步一步来的,也希望自己可以把每一点都弄懂。希望可以对初学者有些帮助,如有错误,欢迎评论区留言指正哦~
一、按键
老规矩,我们还是先看一下按键部分的原理图:
然后在原理图上找一下对应的引脚:
初始化按键的思想和LED配置部分差不多,而且比LED的配置简单:配置端口时钟(时钟使能GPIOA和GPIOB),设置引脚号,配置端口模式。
这里说明一点:我们知道配置LED时是需要设置引脚速率的,那么初始化按键时为什么不需要设置引脚速率了呢?我们需要知道这里的引脚速率是输出速率,但是不是IO口输出信号的速率而是IO驱动电路的响应速度,这个速率是只有存在信号输出时才需要设置的,按键属于一个向单片机输入信号的模块,按下按键,将对应引脚拉低,相当于输入一个低电平的信号,所以这里是不需要设置引脚速率的。
话不多说,直接上代码:
LED的配置那篇博客里已经做了详细的说明,这里就不过多陈述了,不懂的话可以去看看我的那篇博客,嘻嘻~
初始化部分写完之后,再加上51按键部分的底层就可以了(下面给出完整的代码):
按键动作函数(KeyAction):
按键引脚定义(相当于51的sbit管脚定义):
二、蜂鸣器
原理图:
从原理图上可以看出:N_Buz为高电平时,蜂鸣器关闭;N_Buz为低电平时,蜂鸣器开启 ;
解释一下为什么是高电平关,低电平开: 这里涉及到了三极管的开关特性:当b、e之间的饱和管压降大于等于0.7v时,三极管就处于导通状态(e、c之间是导通的),相反,e、c之间不导通(可以理解为这个三极管在电路当中是断开的);
然后我们再来看原理图,很明显:只有当N_BUZ输入为低电平时,b、e之间才会产生一个大于0.7v的饱和管压降,三极管才会导通,蜂鸣器才会响。 对应引脚:
注意:PB4这个引脚是具有复用功能的引脚,也就是说它不仅可以作为普通的IO口使用,还具有别的功能,关于IO口的复用功能部分可以参照《STM32中文手册》8.3节的内容,看一下图:
stm32复位后引脚PB4默认配置为JTAG的RST引脚功能,所以我们在写初始化蜂鸣器函数时,要先把PB4设置成普通的IO口,这一过程也叫做端口重映射(通过配置重映射寄存器(AFIO_MAPR),将一些复用功能映射到其他引脚),stm32的库函数里有专门的开启重映射的函数:
这里要注意一点!!:重映射必须要使能AFIO时钟!!!就是说我们应该先使能AFIO时钟,然后再开启重映射
回到重映射函数,其中GPIO_Remap是GPIO端口重映射,我们要设置寄存器AFIO_MAPR的SWJ CFG[2:0]位,使PB4口重映射为普通IO口:
从表格上我们可以看到:当SWJ CFG[2:0]位为001时,JTAG使能,SWD使能,但是没有JNTRST,而且此时IO口是可以用的,也就是说把PB4重映射成了普通IO口。 我们来看一下库函数中对端口重映射的相关定义:
部分解释:
配置步骤: 配置端口时钟(时钟使能),端口重映射、设置引脚号,设置引脚速率,配置端口模式,配置输出数据。
初始化代码:
这里谈谈 GPIO_SetBits()这个函数,这个函数是在stm32的库函数中定义的,可以理解为一个引脚设置函数,我们来看看这个函数的函数体:
BSRR是端口位设置/清除寄存器,功能是单独设置引脚位, 该函数实现的功能我的理解是实现对应引脚置1;
相对应的还有一个GPIO_ResetBits()函数,这个函数的功能是:实现对应引脚置0, 可以看一下函数体:
可以看到该函数设置的寄存器是:BRR,BRR是端口位清除寄存器,功能是:单独清除引脚位
beep.h文件中我作了相应的定义:
51底层的移植:
希望大家可以多多点赞收藏,也不要忘记点一个大大的关注哦~感谢大家!!
祝您2021大吉大利,升职加薪~~