打印
[STM8]

STM32CubeMX USART串口DMA,IDLE 空闲中断接收不定长接收详解

[复制链接]
671|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
piteqiu|  楼主 | 2020-6-27 18:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1.打开软件如下图;

使用特权

评论回复
沙发
piteqiu|  楼主 | 2020-6-27 18:54 | 只看该作者
2.选择单片机,如下图;

使用特权

评论回复
板凳
piteqiu|  楼主 | 2020-6-27 18:55 | 只看该作者
3.配置最大时钟,如下图

使用特权

评论回复
地板
piteqiu|  楼主 | 2020-6-27 18:55 | 只看该作者
4.选择usart1,配置异步通讯,并在DMA settings下添加USART1_RX和USART1_TX,DMA模式选择NORMAL就行,如下图;

使用特权

评论回复
5
piteqiu|  楼主 | 2020-6-27 18:56 | 只看该作者
5.添加usart1中断,如下图;

使用特权

评论回复
6
piteqiu|  楼主 | 2020-6-27 18:57 | 只看该作者
6.配置路径,.c.h 后再点击GENERATE CODE

使用特权

评论回复
7
piteqiu|  楼主 | 2020-6-27 18:57 | 只看该作者
7.生成工程代码后,while上面初始化;
if (HAL_UART_Receive_DMA(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
{
/* Transfer error in reception process */
Error_Handler();
}
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

//添加      #define RXBUFFERSIZE 50

//添加      uint8_t aRxBuffer[RXBUFFERSIZE];

/***************************下面添加printf第一段***************/

#ifdef __GNUC__
/* With GCC, small printf (option LD Linker->Libraries->Small printf
set to 'Yes') calls __io_putchar() */
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */

/***************************下面添加printf第二段***************/

PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART1 and Loop until the end of transmission */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

return ch;
}


使用特权

评论回复
8
piteqiu|  楼主 | 2020-6-27 18:58 | 只看该作者
8.编写,声明,定义,调用 void HAL_UART_IdleCallback(UART_HandleTypeDef*huart);
/***************************下面main.h内添加函数声明***************/

void HAL_UART_IdleCallback(UART_HandleTypeDef*huart);

/***************************下面main.c内添加库函数***************/

#include "string.h"
#include "stdio.h"

/***************************下面main.c内添加编写的回调函数***************/

void HAL_UART_IdleCallback(UART_HandleTypeDef*huart)
{
//清除标志位
__HAL_UART_CLEAR_IDLEFLAG(huart);
//停止DMA接收
HAL_UART_DMAStop(huart);
//返回发送回的数据
printf("%s",aRxBuffer);
printf("Helloorld!\n");
//清除缓存区
memset(aRxBuffer,0x00,50);
//开始DMA接收
if(HAL_UART_Receive_DMA(huart,(uint8_t*)aRxBuffer,RXBUFFERSIZE)!=HAL_OK)
{
Error_Handler();
}

}

/***********下面stm32f4xx_it.c内void USART1_IRQHandler(void)中添加编写的回调函数***************/

if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET)
{

//        HAL_UART_IdleCallback(&huart1);
HAL_UART_IdleCallback(&huart1); // HAL_IdleCallback(UART_HandleTypeDef*huart);       
}


使用特权

评论回复
9
wangjiahao88| | 2020-6-28 09:48 | 只看该作者
请问一下 这个空闲时间 可以设定吗?

还是默认的?

使用特权

评论回复
10
goodluck09876| | 2020-6-28 09:48 | 只看该作者
感觉空闲+DMA 才是很好的!

担心空闲时间 不能自由设置 就麻烦了。。。

使用特权

评论回复
11
Diyer2015| | 2020-6-28 09:55 | 只看该作者
超时IDLE,DMA+环形FIFO。总是最好的

使用特权

评论回复
12
杨寅辉| | 2020-6-28 11:56 | 只看该作者
支持下,谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

292

帖子

0

粉丝