小小的一個(gè)串口居然看了半天,原來(lái)對(duì)STM32系列的lib庫(kù),好像是1.x版本感覺(jué)還不錯(cuò)的。后來(lái)ST非要整個(gè)CUBEMx庫(kù),往一個(gè)中斷接受函數(shù)里丟了一堆東西。
在rt-thread官網(wǎng)中給出了nano版本增加控制臺(tái)的示范例程,主要是增加了一個(gè)接受隊(duì)列。(如果用rt-thread studio配置控制臺(tái),接受好像用的是查詢模式,如果只是單純一個(gè)控制臺(tái),不干其他事情好像也沒(méi)啥事)
#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;
}
用中斷模式+接受隊(duì)列接受大量數(shù)據(jù)可能會(huì)更健壯可靠些。問(wèn)題是實(shí)驗(yàn)了幾次,只要在串口助手中發(fā)送了2個(gè)字節(jié),中斷接受就出現(xiàn)問(wèn)題,再也進(jìn)入不了中斷函數(shù)了。后來(lái)關(guān)閉了控制臺(tái)的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)致的。原來(lái)這是ST的HAL庫(kù)的bug,在串口發(fā)送中進(jìn)行了互斥操作,導(dǎo)致有接受中斷時(shí)不能再次啟動(dòng)接受中斷。如下
/**
* @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);
國(guó)外論壇也有這個(gè)討論
[https://community.st.com/s/question/0D50X00009XkeOGSAZ/questions-surrounding-hallock]
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){... __HAL_UNLOCK(&HUART); ... }}
在中斷回調(diào)函數(shù)中加入個(gè)unlock就好了。
當(dāng)時(shí)是注意到RTT官方的文檔中斷發(fā)送函數(shù)中有unlock操作,看來(lái)接受 也得加個(gè)
/* 移植控制臺(tái),實(shí)現(xiàn)控制臺(tái)輸出, 對(duì)接 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開(kāi)發(fā)指南》第二部分 基礎(chǔ)篇 - 第6章串口通信(HAL庫(kù))
推薦閱讀最新更新時(shí)間:2025-07-23 07:26





設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- LTC1436CGN-PLL 演示板、雙路輸出穩(wěn)壓器、5.5V 至 28V 輸入、5V @ 3A 和 3.3V @ 0.1A
- 用于 Intel 90MHz 和 100MHz Pentium 處理器的 LT1584CT-3.3 3.3V/7A 低壓差穩(wěn)壓器的典型應(yīng)用
- DER-258 - 5 mW空載輸入功率,2.1W CV/CC充電器
- 使用 LTC3639HMSE 高效 100 mA 降壓穩(wěn)壓器的典型應(yīng)用
- DC2183A-A,具有 LTC2107 16 位、210Msps 高性能 ADC 和 DDR LVDS 輸出的演示板
- DIL 24 MEMS傳感器板連接到SPC5 MCU探索板的轉(zhuǎn)接板
- LT8570IDD-1 700kHz、-15V 輸出反相轉(zhuǎn)換器的典型應(yīng)用接受 5V 至 35V 輸入
- RT9032可編程雙路輸出線性穩(wěn)壓器典型應(yīng)用電路
- 使用 ROHM Semiconductor 的 BM2P093 的參考設(shè)計(jì)
- FS84/FS85/FS66 12 V汽車安全SBC評(píng)估板
- 8-基于51單片機(jī)的二氧化碳檢測(cè)及調(diào)節(jié)系統(tǒng)仿真
- 優(yōu)派曲面電競(jìng)顯示器VX2716-2KC-PRO助你輕松開(kāi)啟暢玩模式
- mini LED芯片擴(kuò)產(chǎn)加速 晶元光電明年提升50%
- VIAVI為XL Axiata提供面向5G的遠(yuǎn)程光纖測(cè)試和監(jiān)控解決方案
- 出租車計(jì)價(jià)器的項(xiàng)目設(shè)計(jì)
- ATmega8 定時(shí)器 中斷 外部中斷 程序
- 混合信號(hào)示波器數(shù)字設(shè)計(jì)的查錯(cuò)
- 電動(dòng)汽車是否可以加裝增程器
- 籠型和繞線型異步電動(dòng)機(jī)的區(qū)別
- 使用HD44780讀寫單片機(jī)的C51程序詳細(xì)概述
- 高性能電動(dòng)滑板車 BLDC 電機(jī)驅(qū)動(dòng)器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測(cè)的實(shí)時(shí)聯(lián)動(dòng)
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時(shí)疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語(yǔ)義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢(shì)”多模態(tài)交互設(shè)計(jì)
- 工業(yè)機(jī)器人高精度力控的“雙模融合”傳感器設(shè)計(jì)
- 工業(yè)機(jī)器人集群的“數(shù)字孿生-物理實(shí)體”閉環(huán)優(yōu)化
- 工業(yè)以太網(wǎng)交換機(jī)的“時(shí)間敏感網(wǎng)絡(luò)(TSN)”改造
- 工業(yè)現(xiàn)場(chǎng)信號(hào)測(cè)試:耦合方式選擇實(shí)戰(zhàn)案例
- 從飽受爭(zhēng)議到領(lǐng)跑全球 京東方25年改寫中國(guó)“屏史”
- LG顯示器二季度虧損超2億美元 面板價(jià)格下跌所致
- 彩電半年總結(jié):動(dòng)蕩的成熟市場(chǎng),突圍的朝陽(yáng)產(chǎn)業(yè)
- Maxim發(fā)布超低功耗電源管理方案
- 更像占士邦地快速實(shí)施 USB-C 方案
- 人工智能會(huì)導(dǎo)致經(jīng)濟(jì)危機(jī)?
- 下一個(gè)DeepMind?看看這家人工智能創(chuàng)業(yè)公司有啥獨(dú)到之處
- 服務(wù)機(jī)器人發(fā)展遇困,該怎么存活?
- 為什么說(shuō)人工智能普及會(huì)造成經(jīng)濟(jì)危機(jī)?
- 關(guān)鍵核心技術(shù)是國(guó)之重器,是科技創(chuàng)新的根本