正文
使用STM32CUBE_MAX配置工程,可以簡化編程工作量,但是這樣我們會遇到一些麻煩,比如利用串口接收不知道長度的數(shù)據(jù)的時(shí)候,我們可能會無從下手,前段時(shí)間看到他人程序中的串口不定長接收,此次特意總結(jié),包括3類芯片串口不定長配置。
STM32F103ZET6
配置工程:
選擇USART1,配置波特率為115200,并開啟串口中斷,DMA中斷
配置程序
在配置工程后,我們需要在工程中printf重定向函數(shù)fputc()和重寫串口接收函數(shù) UsartReceive_IDLE()代碼如下:
// 在頭文件中定義結(jié)構(gòu)體
#define RX_LEN 1024
typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag
uint16_t RX_Size; //receive length
uint8_t RX_pData[RX_LEN]; //DMA receive buffer
}USART_RECEIVETYPE;
void UsartReceive_IDLE(UART_HandleTypeDef *huart);
extern USART_RECEIVETYPE UsartType1;
//定義結(jié)構(gòu)體
USART_RECEIVETYPE UsartType1;
// printf重定向
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
// USART不定長接收
void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) // Checks whether the specified UART idle flag is set or not.
{
__HAL_UART_CLEAR_IDLEFLAG(huart); // Clears the UART IDLE pending flag.
HAL_UART_DMAStop(huart); // Stops the DMA Transfer.
temp = huart->hdmarx->Instance->CNDTR; // Read DMA stream x number of data register
huart->hdmarx->Instance->CNDTR = 0; // Clear DMA stream x number of data register
if(huart == &huart1) // Checks whitch USART
{
UsartType1.RX_Size = RX_LEN - temp;
UsartType1.RX_flag=1; // Set RX_flag
HAL_UART_Receive_DMA(&huart1,UsartType1.RX_pData,RX_LEN); // start DMA interrupt and receives an amount of data in non blocking mode.
}
}
}
配置完成后,需要在xxx_it.c中斷函數(shù)中添加相應(yīng)串口的UsartReceive_IDLE( ) 函數(shù)
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
UsartReceive_IDLE(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
在主函數(shù)中需要開啟DMA接收中斷,和串口空閑中斷,程序如下:
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN); // Receives an amount of data in non blocking mode.
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // Enable the specified UART interrupt.
printf('**************C print 重定向*************rn');
printf('**********USART_IDLE 不定長接收**********rn');
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(UsartType1.RX_flag )
{
UsartType1.RX_flag = 0;
HAL_UART_Transmit(&huart1, UsartType1.RX_pData, UsartType1.RX_Size, 0xffff);
}
}
運(yùn)行結(jié)果
STM32F429IGT6 & STM32F767IGT6
配置工程:
工程配置與 STM32F103ZET6 相同。
配置程序:
printf重定向函數(shù)fputc()和重寫串口接收函數(shù) UsartReceive_IDLE()代碼如下:
// 在頭文件中定義結(jié)構(gòu)體
#define RX_LEN 1024
typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag
uint16_t RX_Size; //receive length
uint8_t RX_pData[RX_LEN]; //DMA receive buffer
}USART_RECEIVETYPE;
void UsartReceive_IDLE(UART_HandleTypeDef *huart);
extern USART_RECEIVETYPE UsartTy// printf重定向
// printf重定向
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
// USART不定長接收
void UsartReceive_IDLE(UART_HandleTypeDef *huart)
{
uint32_t temp;
if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET)) // Checks whether the specified UART idle flag is set or not.
{
__HAL_UART_CLEAR_IDLEFLAG(huart); // Clears the UART IDLE pending flag.
HAL_UART_DMAStop(huart); // Stops the DMA Transfer.
temp = huart->hdmarx->Instance->NDTR; // Read DMA stream x number of data register
huart->hdmarx->Instance->NDTR = 0; // Clear DMA stream x number of data register
if(huart == &huart1) // Checks whitch USART
{
UsartType1.RX_Size = RX_LEN - temp;
UsartType1.RX_flag=1; // Set RX_flag
HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN); // start DMA interrupt and receives an amount of data in non blocking mode.
}
}
}
在xxx_it.c中斷函數(shù)中添加相應(yīng)串口的UsartReceive_IDLE( ) 函數(shù)
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
UsartReceive_IDLE(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
在主函數(shù)中需要開啟DMA接收中斷,和串口空閑中斷,程序如下:
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, UsartType1.RX_pData, RX_LEN);
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
printf('**************C print 重定向*************rn');
printf('**********USART_IDLE 不定長接收**********rn');
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(UsartType1.RX_flag)
{
HAL_UART_Transmit(&huart1, UsartType1.RX_pData, UsartType1.RX_Size, 0xff);
UsartType1.RX_flag = 0;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
上一篇:STM32407+LAN8720A+LWIP 實(shí)現(xiàn)TCP Client
下一篇:STM32——ST-LINK通過BIN文件燒錄STM32芯片
推薦閱讀最新更新時(shí)間:2025-05-27 17:34



設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- AM6TW-2409DH35Z ±9V 6 瓦單路輸出 DC-DC 轉(zhuǎn)換器的典型應(yīng)用
- 基于A6985F5V的38 V,0.5 A同步降壓型開關(guān)穩(wěn)壓器評估板
- LT4276BHUFD 25.5W(類型 2)PoE+ 電源在反激模式下的典型應(yīng)用電路,具有 12V、1.9A 輸出
- 【訓(xùn)練營】ESP8266時(shí)鐘+548151A
- 【涂鴉智能】涂鴉&立創(chuàng)EDA物聯(lián)網(wǎng)溫濕度傳感器
- LT1021DCN8-10 電壓基準(zhǔn)的典型應(yīng)用,將 10V 單元調(diào)整為 10.24V
- 具有 5V 輸出的 LT1074CT 正負(fù)轉(zhuǎn)換器的典型應(yīng)用
- LT6656BCDC-2.048、2.048V 低功率 ADC 電壓基準(zhǔn)的典型應(yīng)用
- SC1117 0.8 安培正固定穩(wěn)壓器的典型應(yīng)用
- 電路DIY驅(qū)動板DRSSTC
- 潤石科技推出RS3215-Q1系列低壓差線性穩(wěn)壓器
- CANape 23開啟智能測試新時(shí)代(下)
- 軟件定義汽車電源管理設(shè)計(jì):NXP的PMIC選型攻略解析
- 深度測評時(shí)空壺X1同聲傳譯器:全球最先進(jìn)AI同傳設(shè)備的非凡實(shí)力
- 作為領(lǐng)先的垂直整合制造商(IDM),英飛凌在 300mm氮化鎵生產(chǎn)路線圖方面取得突破
- 鐵威馬F6-424 Max:六盤位擴(kuò)容+國產(chǎn)系統(tǒng)兼容,小白也能玩轉(zhuǎn)NAS
- 開關(guān)電源給鉛酸電池恒流恒壓充電的電流跳動問題解析
- 自動駕駛中的激光雷達(dá)是否會傷害攝像頭?
- 觸覺技術(shù)助力企業(yè)在激烈的市場競爭中脫穎而出
- 芯片中的串?dāng)_噪聲有幾類
- 小米10 Pro DXOMARK自拍評分:83分
- 官方確認(rèn):一加Nord或搭載“旗艦級”攝像頭
- 微軟Surface老大Panos Panay曬Surface Duo真機(jī)
- 榮耀X10 Max上手 “5G時(shí)代的第一款大屏手機(jī)”體驗(yàn)如何?
- 美封殺華為造成洗牌效應(yīng),愛立信5G超車華為
- 小米、中微半導(dǎo)體等9家中國企業(yè)遭美國“拉黑”
- CES 2021--展會臨近尾聲,只見PC威風(fēng)
- 《2021年AR/VR市場10大預(yù)測》發(fā)布
- 蘋果又一新專利曝光
- 蘋果防丟追蹤器上線,UWB技術(shù)實(shí)現(xiàn)精準(zhǔn)定位!