通過STM32的MDA和空閑中斷實作序列槽不定長資料的收發
首先使用STM32cubemx建立工程。
1、配置RCC:
2、配置USART1:
3、在configuration中配置USART1:
配置序列槽波特率、資料位等基本資訊
添加DMA服務:方框右下方點選ADD添加
勾選NVIC中斷服務:
點選OK或APPLY儲存設定。
4、點選project -->setting或者alt+p進行工程檔案配置
填寫工程名字,以及選擇編譯器。使用keil5,選擇MDK-ARM V5
第二頁配置
之後ctrl+r編譯生成keil檔案。
打開工程,在usart.c中定義
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)
{
}
在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接收
編譯燒錄後就能實作序列槽不定長資料的收發。
有問題發郵件[email protected]或者私信給我。
需要源碼的留郵箱,有看到會發。