小小的一個串口居然看了半天,原來對STM32系列的lib庫,好像是1.x版本感覺還不錯的。后來ST非要整個CUBEMx庫,往一個中斷接受函數(shù)里丟了一堆東西。
在rt-thread官網(wǎng)中給出了nano版本增加控制臺的示范例程,主要是增加了一個接受隊列。(如果用rt-thread studio配置控制臺,接受好像用的是查詢模式,如果只是單純一個控制臺,不干其他事情好像也沒啥事)
#ifdef RT_USING_FINSH
char rt_hw_console_getchar(void)
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&handle, UART_FLAG_RXNE) != RESET)
{
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0)
|| defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7)
|| defined(SOC_SERIES_STM32G4)
ch = handle.Instance->RDR & 0xff;
#else
ch = handle.Instance->DR & 0xff;
#endif
}
else
{
if(__HAL_UART_GET_FLAG(&handle, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&handle);
}
rt_thread_mdelay(10);
}
return ch;
}
用中斷模式+接受隊列接受大量數(shù)據(jù)可能會更健壯可靠些。問題是實驗了幾次,只要在串口助手中發(fā)送了2個字節(jié),中斷接受就出現(xiàn)問題,再也進入不了中斷函數(shù)了。后來關(guān)閉了控制臺的echo回應(yīng)功能,居然神奇的好了。
/* normal is echo mode */#ifndef FINSH_ECHO_DISABLE_DEFAULT shell->echo_mode = 1;#else shell->echo_mode = 0;#endif
多半定位到是串口發(fā)送導(dǎo)致的。原來這是ST的HAL庫的bug,在串口發(fā)送中進行了互斥操作,導(dǎo)致有接受中斷時不能再次啟動接受中斷。如下
/**
* @brief Sends an amount of data in blocking mode.
* @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
* the sent data is handled as a set of u16. In this case, Size must indicate the number
* of u16 provided through pData.
* @param huart Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @param pData Pointer to data buffer (u8 or u16 data elements).
* @param Size Amount of data elements (u8 or u16) to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
uint16_t *tmp;
uint32_t tickstart = 0U;
/* Check that a Tx process is not already ongoing */
if (huart->gState == HAL_UART_STATE_READY)
{
if ((pData == NULL) || (Size == 0U))
{
return HAL_ERROR;
}
/* Process Locked */
__HAL_LOCK(huart);
....
....
/* At end of Tx process, restore huart->gState to Ready */
huart->gState = HAL_UART_STATE_READY;
/* Process Unlocked */
__HAL_UNLOCK(huart);
國外論壇也有這個討論
[https://community.st.com/s/question/0D50X00009XkeOGSAZ/questions-surrounding-hallock]
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){... __HAL_UNLOCK(&HUART); ... }}
在中斷回調(diào)函數(shù)中加入個unlock就好了。
當(dāng)時是注意到RTT官方的文檔中斷發(fā)送函數(shù)中有unlock操作,看來接受 也得加個
/* 移植控制臺,實現(xiàn)控制臺輸出, 對接 rt_hw_console_output */
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = 'r';
__HAL_UNLOCK(&HUART);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == 'n')
{
HAL_UART_Transmit(&HUART, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&HUART, (uint8_t *)(str + i), 1, 1);
}
}
上一篇:使用STM32 ST-LINK Utility下載程序
下一篇:《嵌入式-STM32開發(fā)指南》第二部分 基礎(chǔ)篇 - 第6章串口通信(HAL庫)
推薦閱讀最新更新時間:2025-07-04 12:05


設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 適用于汽車應(yīng)用的 LT3973HMSE-3.3 3.3V 降壓轉(zhuǎn)換器的典型應(yīng)用
- R_08_V30基于IPS2電機換向傳感器的設(shè)計
- 使用 Microchip Technology 的 PIC16C782 的參考設(shè)計
- 使用 LT1054CSW 基本型電壓逆變器 / 穩(wěn)壓器的典型應(yīng)用
- 使用 LTC3637EDHC 4V 至 76V 輸入至 1.8V 超級電容器充電器的典型應(yīng)用
- 儀表用 ADC 驅(qū)動器
- EN6310QA 1A PowerSoC 電壓模式同步 PWM 降壓與集成電感器的典型應(yīng)用
- STEVAL-ISV012V1,使用 L6924D 高達 5 W 太陽能電池充電器的演示板,用于單節(jié)鋰離子和鋰聚合物電池
- 適用于汽車應(yīng)用的 A5974D 正降壓-升壓穩(wěn)壓器的典型應(yīng)用電路
- 使用 NXP Semiconductors 的 TDA2582Q 的參考設(shè)計
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動力電池項目齊刷進度條
- 現(xiàn)代汽車韓國建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機器人成資本焦點
- 艙駕一體“點燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬億蛋糕」,誰在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財報和電話會議時間安排