STM32
直播中

刘艳

8年用户 2487经验值
私信 关注
[问答]

如何使用DMA和中断去实现H750串口功能呢

如何使用DMA和中断去实现H750串口功能呢?H750串口是怎样发送并接收固定长度字节的?

回帖(1)

张娟

2021-12-1 09:43:04
STM32CUBEMX_HAL库 H750串口发送 接收固定长度

使用DMA和中断实现串口功能,接收固定长度字节。
若要实现任意长度字节,需要使用idle中断,后续补充。
使用stm32cubemx进行一些基础配置,生成初始化代码,
HAL_UART_Transmit(&huart1,tx_buf,size,100 );
发送函数,发送完直接接需要执行的操作,无需使用发送中断的函数HAL_UART_Transmit_IT();
关于发送字符串,printf等函数,只需要重新写一下即可,网上例程很多。
需要注意的是在keil工程下需要勾选上Use MicroLIB这个选项,(程序编译不会报错,但是烧录进入,便会出现死机的感觉)
DMA接收
HAL_UART_Receive_DMA(&huart1,rx_buf,1);
在初始化代码之后使用DMA接收函数,来使能中断,最后一个参数是size,表示接收到多少字节之后,进入回调函数,可以设置为1,那么接收到一个字节将进入中断,然后处理,但是这样会频繁进入中断,
串口中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
         HAL_UART_Receive_DMA(&huart1, rx_buf, 1);
        HAL_UART_Transmit(&huart1, rx_buf, 1,100);
}
在回调函数中需要使用HAL_UART_Receive_DMA(&huart1, rx_buf, 1); 重新使能中断,此处是将接收到的字节,再次发送。
还可以实现判断字节是否为帧尾,然后对一帧进行操作
***注意:***串口回调函数中,操作尽量少,否则频繁进入中断会出错,例如在回调函数中加printf的语句,串口便不工作了。
串口接收不定长数据后面再记录(idle+dma)。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分