串口调试工具 开发板
怎样通过串口调试工具向
开发板发送数据呢?
STM32f4是如何采用DMA方式进行不定长串口接收的呢?
回帖(1)
2021-12-9 13:36:56
功能:stm32f4采用DMA方式进行不定长串口接收
平台:STM32CubeIDE(STM32CubeMX)
1、新建工程
示例中采用的是stm32f401re,先设置调试接口(默认是关闭的,不设置的话调试一次就不能调试了)
设置时钟,示例中采用的是无源12M晶振
设置串口1
DMA选项,默认就可以
中断设置,需要打开中断
新建设置完成了,另外加句,关于工程我个人喜欢这样设置
2、修改源码
采用接收空闲中断方式,原库文件没有这个中断的代码,我的方法是改源代码,进入这个文件夹
修改stm32f4xx_hal_uart.c文件,打开该文件
找到HAL_UART_IRQHandler函数,在下图位置处添加
/* UART in mode Idle -------------------------------------------------*/
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_IdleCpltCallback(huart);
return;
}
在这个文件如下图的位置添加
__weak void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
}
进入这个文件夹
修改stm32f4xx_hal_uart.h文件,打开该文件
在下图位置处添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);
3、工程代码
回到工程文件,修改usart.c文件,添加
#include
#define RXBUF_1_SIZE 255
uint8_t rx1_len=0;
uint8_t recv1_end_flag=0;
uint8_t rx1_buffer[RXBUF_1_SIZE];
添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_DMAStop(huart);
if(huart->Instance == USART1)
{
rx1_len = RXBUF_1_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
recv1_end_flag = 1;
}
}
void UART_DMA_Init(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
void UART_Info(void)
{
if(recv1_end_flag ==1)
{
HAL_UART_Transmit(&huart1,rx1_buffer, rx1_len,500);//接收数据打印出来
memset(rx1_buffer,0,sizeof(rx1_buffer));
rx1_len=0;
recv1_end_flag=0;
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
}
在usart.h文件中,添加
void UART_DMA_Init(void);
void UART_Info(void);
main.c中添加
#include “usart.h”
添加
UART_Info();
完成了。
通过串口调试工具,向开发板发送数据,开发板接收什么数据就向串口调试工具发送什么数据。
功能:stm32f4采用DMA方式进行不定长串口接收
平台:STM32CubeIDE(STM32CubeMX)
1、新建工程
示例中采用的是stm32f401re,先设置调试接口(默认是关闭的,不设置的话调试一次就不能调试了)
设置时钟,示例中采用的是无源12M晶振
设置串口1
DMA选项,默认就可以
中断设置,需要打开中断
新建设置完成了,另外加句,关于工程我个人喜欢这样设置
2、修改源码
采用接收空闲中断方式,原库文件没有这个中断的代码,我的方法是改源代码,进入这个文件夹
修改stm32f4xx_hal_uart.c文件,打开该文件
找到HAL_UART_IRQHandler函数,在下图位置处添加
/* UART in mode Idle -------------------------------------------------*/
if(((isrflags & USART_SR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
HAL_UART_IdleCpltCallback(huart);
return;
}
在这个文件如下图的位置添加
__weak void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
}
进入这个文件夹
修改stm32f4xx_hal_uart.h文件,打开该文件
在下图位置处添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart);
3、工程代码
回到工程文件,修改usart.c文件,添加
#include
#define RXBUF_1_SIZE 255
uint8_t rx1_len=0;
uint8_t recv1_end_flag=0;
uint8_t rx1_buffer[RXBUF_1_SIZE];
添加
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_DMAStop(huart);
if(huart->Instance == USART1)
{
rx1_len = RXBUF_1_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
recv1_end_flag = 1;
}
}
void UART_DMA_Init(void)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
void UART_Info(void)
{
if(recv1_end_flag ==1)
{
HAL_UART_Transmit(&huart1,rx1_buffer, rx1_len,500);//接收数据打印出来
memset(rx1_buffer,0,sizeof(rx1_buffer));
rx1_len=0;
recv1_end_flag=0;
HAL_UART_Receive_DMA(&huart1,rx1_buffer,sizeof(rx1_buffer));
}
}
在usart.h文件中,添加
void UART_DMA_Init(void);
void UART_Info(void);
main.c中添加
#include “usart.h”
添加
UART_Info();
完成了。
通过串口调试工具,向开发板发送数据,开发板接收什么数据就向串口调试工具发送什么数据。
举报
更多回帖