**
【HAL库】STM32F407ZGT6实现串口中断发送和接收
(保姆级教写代码1)
**
前言
根据近期所做的项目,想给大家分享一些有关STM32的各类通信方式的代码教程,都是基于STM32HAL库的CUBEMX(以下简称粗鄙)开发方式,按照步骤做肯定能够通信。本期分享的是采用中断模式的串口发送和接收代码生成与实现。
粗鄙的配置
1.点这个选芯片型号。
2.选完芯片后第一步配置系统时钟,这里全部使用外部晶振。
然后进入时钟配置界面配置各个模块的时钟
3.开启串口1.
这里的波特率选用9600,注意变粉的选项不是报错,而是有其他的东西占用了这一项的功能。
4.生成代码
这里我用的是Keil MDKV5环境,注意这里的路径和工程名称里不能带有中文,带中文的话会生成没有启动文件的代码,会报错。
这里勾选上生成外设各自的头文件与源文件,否则所有的外设初始化配置全部在main里。
点击GENERATE CODE生成代码。
生成的工程文件位于路径下的MDK-ARM文件夹下。
至此基本配置就大功告成啦,小伙伴们快自己生成一下看看!
串口中断发送
首先定义一个数组,把你想发的数据存里面
然后发就完事了,很简单,就一行代码!巨简单有木有
我们看一下发送函数的源码
发送函数有三个参数,第一个是结构体UART_HandleTypeDef类型的指针,在usart.c文件里,包含了串口的初始化的各个参数。
第二个是uint8_t类型的指针,这里也就是我们要发送的数组名称
第三个是我们要发送的数组大小。
ok了,放在while(1)里编译下进去搞一下
连上TTL转USB模块,看下有没有收到
咔咔的收!
串口中断接收
我们来看一下开启中断接收的UART_Start_Receive_IT()的源码
第一个参数也是结构体UART_HandleTypeDef类型的指针,在usart.c文件里,包含了串口的初始化的各个参数。
第二个参数是uint8_t类型的指针,这里也就是我们要存放接收到的数据的数组名称
第三个参数就有些内涵了,是接收到Size个数据后进入串口接收中断。
这个函数每开启一次后就会进入串口中断回调函数中,然后关闭串口接收中断,所以正常情况下我们在执行一次UART_Start_Receive_IT()后,只有接收到Size个数据后才会进入中断回调函数,执行完回调函数后,如果不再次执行一次UART_Start_Receive_IT()的话,就不会再接收任何数据了。
因此,我们如果想接收变长数组怎么办呢?
解决办法是,每次仅中断接收1个Size的数据,定义一个足够大的数组,将接收到的单个数组一个个的放进去,然后每次在中断回调函数执行的末尾再次开启UART_Start_Receive_IT()。设置一个标志位,在中断回调函数里当收到0x0A(收到啥也可以自己定义)时,将标志位置位,0或1自己定,这时就别再开启接收中断了,在别的地方检测这个标志位,当标志位置位时读取那个足够大的数组里的数据就可!如果还想接收数据,就在程序的其他的地方再次执行UART_Start_Receive_IT()就行。
接下来在回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)里写代码就行!
然后编译成功后下进去搞一搞!
发送一串数据(注意16进制发送和发送新行)
成功接收
注意‘/n’为字符\n的ASCII码,也就是16进制的0x0A,接收到的16进制数后面的单引号里的东西也就是ASCII码为该16进制数的符号!