STM32串口收发、串口中断
- 一 、串口中断
- 二、使用DMA
- 三、串口波特率的理解
开发环境:stm32cubuMax +Keil5
一 、串口中断
1.当收到消息的时候,立即进入控制程序,实现通过串口控制硬件;
2.在stm32cubeMax中配置串口
配置全局中断
2.在main函数中开启中断
HAL_UART_Receive_IT(&huart2,getDataBuf,8);
//第一个参数:huart2 是配uart2后自动生成的串口2 的句柄,在usart.c中定义的;
//第二个参数为收到数据后保存的位置;
//第三个参数为接收数据的个数
3.重写回调函数
在main.c文件中重写下面函数
当收到消息后会进入下面函数
注意:当收到消息并处理数据后,需要再次开启中断HAL_UART_Receive_IT();
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)//这个里面写收到数据后的操作
{
printf("getdata: ");
for(int i=0;i<8;i++)
{
printf("%x ",getDataBuf[i]);
}
printf("<end>\r\n");
unpack(getDataBuf);
HAL_UART_Receive_IT(&huart2,getDataBuf,8);
}
}
二、使用DMA
1.DMA是什么?
为了减轻CPU负担,把一部分数据搬运工作交给DMA来完成
(1)常规串口收发,是通过CPU 来沟通串口寄存器和内存的;
(2)DMA方式串口收发数据
①CPU把数据传输任务交给DMA,串口发数据,DMA 把内存中的数据放到串口寄存器,收数据相反;
②当发送完毕后,产生中断,告诉CPU数据发送完毕;
2.在串口中断的基础上做修改
只添加两个DMA的设置就可以了
3.把之前中断中的函数改成DMA 处理函数
//main函数初始化时启动DMA
HAL_UART_Receive_IT(&huart2,getDataBuf,8);//改成下面函数
HAL_UART_Receive_DMA(&huart2,getDataBuf,8);
4.当中断产生后的接收数据的回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
printf("getdata: ");
for(int i=0;i<8;i++)
{
printf("%x ",getDataBuf[i]);
}
printf("<end>\r\n");
unpack(getDataBuf);
HAL_UART_Receive_DMA(&huart2,getDataBuf,8);
}
}
5.发送数据的回调函数
当串口发送完进入下面函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2)
{
}
}
三、串口波特率的理解
1.串口波特率表示串口传输数据的快慢,比如115200bps表示每秒传输1155200个bit位,则每一位传输需要1/115200 秒,为8.68us(微秒);当使用逻辑分析仪等分析工具时,就需要设置采样率在1Mhz,因为,1/1M=1us;
2.使用普通IO口模拟串口
(1)需要两路IO口,一路设置为输出为TXD,一路设置为输入为RXD;
(2)对于发送,输出1位数据时,IO口电平的保持时间根据波特率来计算,使用定时器精确延时;
(3)常用的串口数据帧为1位起始位+8位数据为+1位停止位,共10位数据,如下图;
(4)对于接收RXD端口,使用IO口外部中断,因为每一帧的起始位为低电平,所以,当检测到下降沿时产生中断,打开定时器开始计时,根据电平的保持时长来确定收到的数据是0还是1;