欢迎光临散文网 会员登陆 & 注册

第十三届蓝桥杯嵌入式省赛

2023-03-02 19:42 作者:我是绿帽骏  | 我要投稿


硬件框架图
功能需求



在看过题目后可知,大致要用到LCD、LED小灯、按键、串口、定时器PWM等。



一、首先大致将需用到的GPIO、外设等使用CubeMX初始化配置

(1)按键配置

按键具体实现需求
原理图按键部分

        根据原理图可知PB0、PB1、PB2、PA0对应四个按键,直接将这四个IO口配置为输入

配置为输入模式

(2)PWM输出配置


        已知PA1输出,点击该Pin口发现有定时器2的通道2

PA1可实现的功能
配置定时器2通道2即PA1引脚输出1KHz的方波

        由于已将该芯片配置系统时钟为80MHz,后再1分频将APB1总线也设为80MHz,定时器2挂载在该总线上,所以要输出1KHz频率的方波,则80/(Pre+1)/(ARR+1)=1K,这里我将Pre设置为79,ARR设置为999。

        为了后续便于测试PWM输出是否正确,开启定时器4,使用输入捕获检测该输出

使用定时器4输入捕获功能检测输出波的参数
开启定时器中断


(3)开启串口,设置参数

串口具体要求


串口配置为9600波特率


          由于需要接收数据进行分析,我们直接开启串口中断,简单方便

开启串口中断

****Tips:

    

如果在配置栏中直接开启的串口需在芯片的图形界面配置中将TX、RX改为PA9、PA10



(4)设置为输出

LED需求
LED部分原理图

同理,将PC8~PC15、PD2设置OUTPUT,其余默认即可

考虑到LED实现需计时等功能,我们再开启定时器6开启中断,配置为1ms进入一次。


二、各个功能代码的实现

(1)LED代码的实现

LED1
LED2

*此处LED2的闪烁不要使用HAL_GPIO_TogglePin()这个函数

 由于G431的屏幕的IO与LED的IO复用,若使用该函数会导致LED的小灯状态不确定


(2)按键部分代码

按键检索
按键功能
具有消抖功能并可检测按键是按下还是弹起状态
判断当前是否为输入界面且按键是否弹起,此处我加unKey_Down和unKey_Val的判断是避免一个按键按下未松手再按另一个造成判断错误的问题
按键4按下抬起后,若输入密码与当前设置密码一致则改变重装载值,即改变频率(80MHz/(79+1)/(499+1)=2KHz),再重新设置占空比



(3)LCD屏幕

    直接将官方给的驱动移植到工程中使用

两个界面的显示实现


(4)定时器功能实现

定时器6每1ms进入一次中断,判断密码输入后的状态并进行相应的操作
定时器4输入捕获计算占空比与频率
main函数中需开启定时器



(5)串口功能

    

重写c库的printf便于调试(魔术棒勾选Microlib)
串口中断回调函数,一次接收7个字节数据然后判断是否符合要求(使用ASCII码),每次接受完清除字符数组缓存,并再次开启串口接收中断



三、测试输出频率占空比是否正确

PA11为输入采集通道,打印输入捕获计算所得的结果,与需求一致,默认状态1KHz,50%占空比
输入密码正确结果


四、演示视频

    在一系列调试修改后,功能实现视频如下(屏幕下方显示占空比与频率的代码在测试后注释即可):




第十三届蓝桥杯嵌入式省赛的评论 (共 条)

分享到微博请遵守国家法律