使用STM32CUBEMX实现串口不定长数据的不定长收发

通过STM32的MDA和空闲中断实现串口不定长数据的收发
首先使用STM32cubemx创建工程。

1、配置RCC:
使用STM32CUBEMX实现串口不定长数据的不定长收发_第1张图片
2、配置USART1:
在这里插入图片描述
3、在configuration中配置USART1:

配置串口波特率、数据位等基本信息
使用STM32CUBEMX实现串口不定长数据的不定长收发_第2张图片
添加DMA服务:方框右下方点击ADD添加
使用STM32CUBEMX实现串口不定长数据的不定长收发_第3张图片
勾选NVIC中断服务:
使用STM32CUBEMX实现串口不定长数据的不定长收发_第4张图片

点击OK或APPLY保存设置。

4、点击project -->setting或者alt+p进行工程文件配置

填写工程名字,以及选择编译器。使用keil5,选择MDK-ARM V5
使用STM32CUBEMX实现串口不定长数据的不定长收发_第5张图片
第二页配置
使用STM32CUBEMX实现串口不定长数据的不定长收发_第6张图片
之后ctrl+r编译生成keil文件。
打开工程,在usart.c中定义

/* 串口接收缓冲区 /
uint8_t rx_buffer[100] = “hello”;
/
串口接收完成标记 /
uint8_t recv_end_flag = 0;
/
串口接收数据长度 */
uint16_t rx_len =0;

在uasrt.h中,定义

#define BUFFER_SIZE 100
extern uint8_t rx_buffer[];
extern uint8_t recv_end_flag;
extern uint16_t rx_len;

在stm32l4xx_it.c中找到相对应的中断函数,修改如下:(需要添加usart.h头文件)

void USART1_IRQHandler(void)
{
/*
USER CODE BEGIN USART1_IRQn 0 /
uint32_t tmp_flag = 0;
uint32_t temp;
HAL_UART_IRQHandler(&huart1);
tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//idle标志被置位
{
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
temp= huart1.Instance->ISR; //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能
temp= huart1.Instance->RDR; //读取数据寄存器中的数据
HAL_UART_DMAStop(&huart1);
temp = hdma_usart1_rx.Instance->CNDTR;// 获取DMA中未传输的数据个数
rx_len= BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
recv_end_flag= 1; // 接受完成标志位置1
}
/

USER CODE END USART1_IRQn 0 /
HAL_UART_IRQHandler(&huart1);
/

USER CODE BEGIN USART1_IRQn 1 /
/

USER CODE END USART1_IRQn 1 */
}

在main.c文件中,添加printf重定向语句。

#ifdef GNUC
#define
PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define
PUTCHAR_PROTOTYPE int fputc(int ch, FILE f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t
)&ch, 1 , 0xffff);
return ch;
}

主函数while(1)循环前开启空闲中断和DMA服务

/开启串口空闲中断/
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
/启动串口DMA接收/
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);

在while(1)中添加

if(recv_end_flag==1)
{
printf(“rx_len=%d\r\n”,rx_len);//打印接收长度
HAL_UART_Transmit(&huart1,rx_buffer,
rx_len,200);//接收数据打印出来
memset(rx_buffer,0,rx_len); //清除数组,需要添加string.h头文件
rx_len=0;//清除计数
recv_end_flag=0;//清除接收结束标志位
}
HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收

编译烧录后就能实现串口不定长数据的收发。
使用STM32CUBEMX实现串口不定长数据的不定长收发_第7张图片

有问题发邮件[email protected]或者私信给我。
需要源码的留邮箱,有看到会发。

你可能感兴趣的:(单片机STM32)