STM32CubeMX USART串口DMA,IDLE 空閑中斷接收不定長接收詳解(stm32f407zg)


1.打開軟件如下圖;

 

2.選擇單片機,如下圖;

3.配置最大時鍾,如下圖

4.選擇usart1,配置異步通訊,並在DMA settings下添加USART1_RX和USART1_TX,DMA模式選擇NORMAL就行,如下圖;

 

 

 

5.添加usart1中斷,如下圖;

6.配置路徑,.c.h 后再點擊GENERATE CODE

 

 

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.編寫,聲明,定義,調用 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.結束。 例:發送123。返回123 ;          發送5909.返回5909; 

 

10. 添加DMA發送 

10.1 

添加:#define TXBUFFERSIZE 50 

添加:uint8_t aTxBuffer[TXBUFFERSIZE];

開啟發送中斷:

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)aTxBuffer, lslong);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_TC);

 

添加 發送回調函數:

//發送結束回調函數,使能485接收;
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

 //開始DMA接收
if(HAL_UART_Receive_DMA(huart,(uint8_t*)aRxBuffer,RXBUFFERSIZE)!=HAL_OK)
{
Error_Handler();
}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM