目录
实验目的:利用串口控制LED灯的亮灭,并进行提示
实验平台:正点原子精英板
一、串口简介
1.串口介绍
串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比特
字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双
方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括
RS-232、RS-422 和 RS-485 等。
2.波特率计算
二、HAL库的配置
1.时钟树的配置
参考第一篇文章即可
2.CubeMX配置
配置为UART模式即可,省去时钟线,大部分时候异步方式即可
补充一些知识:
UART与USART区别
1)硬件设计
USART:通用同步和异步收发器
UART:通用异步收发器
当进行异步通信时,这两者是没有区别的。区别在于USART比UART多了同步通信功能。
这个同步通信功能可以把USART当做SPI来用,比如用USART来驱动SPI设备。其中SPI IIC为同步通信 UART为异步通信, usart为同步&异步通信。
2)软件设计也存在同步发送和异步发送的区别:
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。同步是阻塞模式,异步是非阻塞模式。
3)单工\半双工\全双工
单工、半双工、全双工 单工数据传输只支持数据在一个方向上传输; 半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
I2C是半双工,SPI的全双工,uart是全双工。
开启NVIC对应的中断接口
配置波特率、停止位等参数,按下图配置即可,也可以按照自己需求配置。
LED的配置参考:https://blog.youkuaiyun.com/hdh546/article/details/132192856
配置完成后生成代码即可。
三、代码编写
使用HAL库后用户需要完成的工作是,在串口初始化里使能接收/发送中断,重定义编写接收/发送回调函数。注意,接收中断需要在下次使用中断前软件重复开启,本次实验放在了回调函数里,也可以放在中断公共服务函数UARTx_IRQHandler()中。
在uart.c的用户编码区编写回调函数和输出复用函数,方便打印信息。
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* 等待上一个字符发送完成 */
USART1->DR = (uint8_t)ch; /* 将要发送的字符 ch 写入到DR寄存器 */
return ch;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收中断服务函数
{
if(huart->Instance == USART1)//判断串口号
{
if(receive_arrary[0]=='A')
{
printf("LED_ON\r\n");
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_UART_Receive_IT(&huart1, (uint8_t *)receive_arrary, 1); //再开启接收中断
}
else if(receive_arrary[0]=='B')
{
printf("LED_OFF\r\n");
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
HAL_UART_Receive_IT(&huart1, (uint8_t *)receive_arrary, 1); //再开启接收中断
}
}
}
一定要在初始化里开启中断接收,如下图
实验现象:
欢迎大家交流与指正!!!