串口通信实验
Keil初见
警告
建议严格按照群文件内的安装方法来安装Keil,否则容易出现无法识别烧写器/无法烧录等问题B就是这样踩了坑的
- 运行
MDK529.exe
安装Keil本体 - 关闭
Pack Installer
,在主界面找到File -> License Management
- 复制License Management窗口上的
CID
项 - 打开
Keygen.exe
,在CID
项粘贴,Target项选择ARM
,点击Generate
如果发现这个程序没了,说明你杀毒软件没关(比如Microsoft Defender)
- 将生成的代码复制到Keil的
LIC
处,点击Add LIC
完成破解 - 打开文件夹
MDK芯片固件包
,运行三个pack安装包
打开Keil,可以看到一些常用的按键:
- File 打开/关闭/保存 文件, 查看许可证状态
- 编译(Build) c语言在运行前必须先经过编译才能够运行
- 下载(Download) 将编译后的代码下载到单片机中。如果你修改了一段代码而没有再次编译,下载时会下载之前已经编译过的代码
- 魔法棒工具(Options for Target) 对当前的项目进行设置
- Debug 必须在连接了单片机的情况下才可用;可以运行代码并监看数据
- 设置(Configuation) 能调整以什么编码方式打开文件(比如UTF-8),界面颜色等等
- 文件资源树 一般只关注
Application/User/Core
中的文件(其他文件都是CubeMX生成的快说谢谢CubeMX)
先点击魔法棒工具,转到Debug
,对我们所使用的烧写器进行配置
将右上方的USE
项改成CMSIS-DAP Debugger
,然后点击旁边的Settings
如果可以成功连接到烧写器,那么弹出的新窗口的SWDIO
处会显示一串地址;否则,会像图中显示No Debug Unit Device found
在新窗口选择上方的Flash Download
,点亮选项
再点击下方的按钮ADD,添加
STM32H750xx

设置完以上的选项后,关闭魔法棒界面,点击编译
,编译完成后点击下载
不出意外的话Keil会在左下方显示下载进度条,下载完成后进度条会自己消失
完成代码的烧写之后就可以点击Debug
来调试运行代码了
调试模式中原先的编译键会替换为Reset
,Start
,Stop
等键,分别代表程序停止并重置,开始/继续运行,暂停运行
可以在代码中选中变量,右键将其加入Watch
中来监看变量的值
中断
了解了中断的理论之后,来看看代码中是怎么体现,实现中断的
正常进程
处在main()
中的死循环while(1)
中的代码就是单片机运行的正常进程
1 |
|
值得注意的是,用户(也就是我们这些编写者)只能在注释/* USER CODE BEGIN n */
和/* USER CODE END n */
之间填写代码
如果在这个注释以外的地方编写代码,Keil在编译时会将注释外的代码删除(来防止你改了什么东西导致代码不能正常跑)
也就是说你可以简单的理解为:USER CODE 3中的代码就是正常进程运行的代码
定时器中断
处在 定时器中断回调函数HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
中的代码即为触发定时器中断会执行的代码
在项目的代码库中,这个函数以弱函数的方式被定义
因此要使用它,我们需要自己再定义一次,并填入我们想要的功能
一定要写在 USER CODE 0中,不然会被清除
另外,要使用定时器中断,应该在USER CODE 2中写上HAL_TIM_Base_Start_IT(&htim_n);
来打开对应计时器的计时器中断
1 |
|
定时器中断回调函数执行的频率由你在CubeMX中的设置决定
指针htim
指向触发此回调函数的定时器,比如在这个项目中,我们设置打开的定时器是TIM14
,那么就有
1 |
|
可以通过加入一个cnt
变量来得到当前的时间
1 |
|
串口收发通信中断
处在 串口接收通信中断函数HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
中的代码即为触发串口收发通信中断时执行的代码
当一个串口的tx
端向另外一个串口的rx
端发送一串uint8_t
的数据,接收到数据的串口会调用一次串口接收通信中断函数
同样的,在项目的代码库中这个函数以弱函数的方式被定义,因此我们在USER CODE 0中可以重新定义一个串口接收通信中断函数
也不要忘了要在USER CODE 2中打开中断接收HAL_UART_Receive_IT(&huart_n,rxbuffer,sizeof(rxbuffer));
哦
其中rxbuffer是用来接收数据的数组,变量类型必须是uint8_t
除了要写接收端的代码,我们当然还要写发送端的代码
在USER CODE 3中写数据发送函数HAL_UART_Transmit_IT(&huart_n,txbuffer,sizeof(txbuffer));
来发送函数
1 |
|
串口接收中断回调函数中的指针huart
指向接收到数据并触发此次中断的串口
利用这个指针可以判断到底是哪个串口接收到了数据
1 |
|