文章目录
项目介绍
*这里基于此项目,实现简单的《CSGO据点争夺战》比赛记录器(可以自行改变)
STM32CubeMX配置
1.选择芯片
2.GPIO设置
KEY1:PC4
KEY2:PB10
KEY3:PC13
KEY4:PA0
以上四个引脚设置为中断模式
*PD2/3/4/7为LED,本项目可忽略
3.NVIC设置
开启如上四个使能
*USART1设置见下文
4.RCC设置
高速时钟如上设置
5.USART1设置
该为启用串口收发功能
6.时钟设置
7.项目管理设置
恭喜你完成了STM32CubeMX的配置!
Keil代码实现
1.初始化
2.printf函数实现
1.引入头文件
2.重定向printf函数
3.启用LIB
3.中断回调函数实现(主要功能实现)
1.定义全局变量,用于存放A方与B方的值(flag见下文)
2.实现当不同的按键被按下时,执行相应的操作(红框内为核心代码)
*GPIO_PIN_4对应上文PC4(KEY1),仅以此举例
*以上代码未全部列举,需自己实现
4.按键消抖实现
1.定义变量flag
2.每隔500ms重置flag
3.仅当500ms内,中断回调函数被第一次调用时执行
5.项目美化
1.加入初始化提示
2.加入相应事件反馈
3.加入胜利判断
*__disable_irq()函数功能为:禁用中断回调函数(使按键无效)
*游戏结束后,只能重新开始游戏(reset程序)
4.加入比分情况反馈,提高游戏性(仅展示A方)
恭喜你,成功完成此项目!
技术细节
1.引脚中断模式和输入模式区别
中断模式:只有当按键被按下时才会触发相应事件,占用CPU资源低。
输入模式:一直检测按键是否被按下,占用CPU资源高。
2.printf实现解析
重定向:printf()和scanf()的底层实现是fputc()和fgetc()函数,该函数使输出流输出到屏幕(或从屏幕读入),使用重定向后,更改输出流输出到串口(或从串口读入)。
*这里未用到scanf()函数
3.volatile关键字解析
volatile:直接存取原始内存地址,使编译器对该变量不做优化
4.keil汉字乱码解决
*如无乱码,无需此步
*每次重构keil文件后引发的个别汉字或字符乱码,可以重写,无需此步
5.串口输出时存在"\r"或"\n"解决
\r前加入空格(英文)即可解决
*此问题可能为keil的兼容性问题
6.按键消抖解析
如上,按键被按下时,可能会多次调用中断回调函数,使得用户实际体验变差。
小结
又一次写到了12点,此过程让我满怀激动。同时也发现了自身存在的一些问题。
如有错误,敬请指正。如需获得完整代码,可私信作者。
感谢向我提供帮助的各位同志!