目录
首言
本文主要内容
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
一、串口通信
1、分类
串口通信分为串行通信和并行通信、同步串行通信、异步串行通信
(1)并行通信
适用于多位数据同时传输,这种通信方式传输控制简单,传输速率快,但是在长距离传输下硬件成本高
(2)串行通信
数据逐位传输,传输线少,长距离传输时成本低,但数据的传输控制较复杂。按照实现数据同步的方式,可以分为同步串行和异步串行两种。
(3)同步串行通信
数据传输以数据块(一组字符)为单位,在一个数据块内,字符与字符间无间隔,收发双方依靠独立的时钟线进行信号的同步。
特点:适用于大批量的数据传输。
(4)异步串行通信
数据传输以单个字符为单位,字符和字符之间的间隙任意,字符内部每一位持续的时间相同。收发双方没有专门的时钟信号,而是依靠事先约定的字符格式和通信速率来完成通信。
异步串行通信的字符格式:
常用字符格式为:1位起始位、8位数据位、无奇偶校验、1位停止位
字符格式决定了字符中数据的传输形式。
异步串行通信的通信速率:表示的是每秒钟传送二进制数码的维数,以bit/s(bps)为单位。
波特率决定了字符中每一位数据的持续时间
2、工作方式
(1)轮询方式
CPU不断检测串口的状态标志来判断数据收发的情况。
特点:程序设计简单,但CPU在检测标志位期间,无法执行其他任务,CPU利用率较低。
(2)中断方式
使能中断后,接收一字节数据或发送一字节后申请中断,在ISR中完成后续处理。
特点:在数据收发期间,CPU可以执行其他任务,CPU利用率较高。
(3)DMA方式
初始化时设置相关参数,启动DMA传输后,数据传输过程不需要CPU的干预。传输完成后,再产生DMA中断,由CPU进行后续处理。
特点:传输效率最高。
对于stm32芯片来说,有2个DMA控制器
二、通过CubeMX配置工程
配置RCC
设置高速外部时钟HSE,然后选择外部时钟源
配置USART
使能串口(此时会自动配置输入输出串口,即PA9和PA10)设置波特率为115200,1位停止位,无校验位。
使能中断
设置时钟
创建工程
三、代码编写
1.相关函数说明
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_DMAPause();// 暂停串口DMA
HAL_UART_DMAResume(); //恢复串口DMA
HAL_UART_DMAStop(); //结束串口DMA
HAL库下的定义:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);
HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);
2.具体编写
任务一:
任务一只需要串口发送“hello windows!”即可,因此本文采用HAL_UART_Transmit();函数即可
对于HAL_UART_Transmit()函数的各个参数说明:
UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
*pData 需要发送的数据
Size 发送的字节数
Timeout 最大发送时间,发送数据超过该时间退出发送
结构体定义:
UART_HandleTypeDef huart1;
发送字符代码
while (1)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16,0xffff);
HAL_Delay(500);
}
任务二:
在任务一的基础上,在主函数写下下面代码
uint8_t receivedChar;
if (HAL_UART_Receive(&huart1, &receivedChar, 1, 0xffff) == HAL_OK)
{
switch (receivedChar)
{
case '#':
HAL_UART_Transmit(&huart1, (uint8_t *)"stop", 16 , 0xffff);
break;
case '*':
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
break;
}
}
三、结果呈现
任务一:
烧录.hex文件:具体烧录步骤见之前的文章
设置串肉软件:
波形观察:
任务二:
四、总结
此次实验在加入中断的串口通信实现不是很好,不能够持续发送,但是通过此次实验也学习到了很多东西,让嵌入式这个课程更加贴近于现实了。
同时也对于这个实验也收获了许多,比如在传输中要对UART_HandleTypeDef这个结构体进行重命名等。
五、参考
(1)https://blog.csdn.net/as480133937/article/details/104827639/
(2)https://blog.csdn.net/as480133937/article/details/99073783