全文大约1600字,阅读大约需要8分钟。
初始工程配置
选择本次需要用到的芯片STM32F407ZGT6,并且新建工程文件。
RCC中配置高速外部时钟HSE,并且选择外部晶振。同时,SYS中选择Serial Wire形式。
查阅原理图可以看到,本次使用的串口为USART3,对应的引脚为PC10以及PC11。点击MODE设置为异步通信(Asynchronous)。基础参数中Baud Rate(波特率)设置为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 ,接收和发送都使能。
最后选择Project Manager,对项目文件进行设置。需要设置的是项目文件名称,项目存储的路径,IDE选择使用的MDK-ARM,最后还需要选择一下对应的Firmware package。
串口中使用到发送/接收函数如下所示:
HAL_UART_Transmit();串口发送数据,使用超时管理机制
HAL_UART_Receive();串口接收数据,使用超时管理机制
HAL_UART_Transmit_IT();串口中断模式发送
HAL_UART_Receive_IT();串口中断模式接收
HAL_UART_Transmit_DMA();串口DMA模式发送
HAL_UART_Transmit_DMA();串口DMA模式接收
串口发送/接收数据
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
串口发送函数的作用为单片机发送指定长度的数据。如果超时数据没发送完成,则不再发送,同时返回超时标志位。接下来详细讲解一下函数中使用到的参数。
*huart是UART的别名,例如本次实验中使用到的是USART3,所以在填写函数参数的时候就是&huart3。
*pData是需要发送的数据。
Size是发送的字节数。
Timeout指的是最大发送时间,发送数据超过该时间退出发送。
串口的接收函数与前面串口发送函数类似,函数内部使用到的参数也一样,所以就不做过多解释。
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
在使用上面的发送/接收函数的时候,单片机处于轮询模式,CPU会不断查询状态,即使无数据传输也会占用时间,效率低下。因此,在串口发送/接收数据的时候还存在一种中断模式,CPU只有在有数据传输时工作,其余时间可休眠或者是处理其他的任务,实时性较好。
串口中断发送/接收数据
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
串口中断中,参数跟之前轮询模式基本上一样,只是少了个最大发送时间。在串口数据到达或者是串口数据发送完成时,就会触发中断。在串口接收中断函数中,同样的也需要事先确定数据存放位置,接收数据的长度。在接收到数据时,会触发串口中断函数处理,知道接收到指定长度数据,后关闭中断,进入中断接收回调函数,不再触发中断。
串口的接收中断回调函数如下所示:
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
在中断进行完之后,并不会直接退出,而是会进入该中断回调函数中,所以我们可以在中断回调函数中编写需要的代码。
需要注意的是,如果需要使用串口发送/接收中断函数的时候,我们需要在初始工程配置的时候,在NVIC Settings一栏打开串口中断,才可以进行使用。