STM32 hal库使用笔记(二)中断—串口中断

目录

一、串口简介

1.串口介绍

2.波特率计算

二、HAL库的配置

1.时钟树的配置

2.CubeMX配置

三、代码编写


实验目的:利用串口控制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.csdn.net/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);   //再开启接收中断
			 }
    }
}

一定要在初始化里开启中断接收,如下图

 实验现象:

 欢迎大家交流与指正!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乱码小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值