RxState = H" />

娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月25日(星期二)

正在發生

2019年03月25日 | STM32的CubeMX關于串口中斷

發布者:SHow111time 來源: eefocus關鍵字:STM32  CubeMX  串口中斷 手機看文章 掃描二維碼
隨時隨地手機看文章

1、關于串口的初始化函數:


    MX_USART2_UART_Init()---波特率、奇偶校驗等配置


            HAL_UART_Init()---會將 huart->RxState = HAL_UART_STATE_READY;


    HAL_UART_MspInit()---GPIO,中斷優先級等配置


2、當需要使用中斷接收時需要調用


    HAL_UART_Receive_IT()---配置接收的緩沖區指針,數量,huart->RxState = HAL_UART_STATE_BUSY_RX;,最后使能相應中斷


3、當中斷發生時,執行


    HAL_UART_IRQHandler()--判斷中斷的類型,在此處我用到的是非空中斷,那么會繼續調用UART_Receive_IT(huart);


    這個函數會首先判斷串口的接收狀態huart->RxState == HAL_UART_STATE_BUSY_RX,若果為真就進行數據的保存,進 如     果達到規定的傳輸數量就會關閉中斷,改變huart->RxState = HAL_UART_STATE_READY;然后執行HAL_UART_RxCpltCallback();如果不為真,就清除接收中斷標志。


4、HAL_UART_RxCpltCallback()這個函數里盡可能的少些代碼否則影響效率,如果想再次開啟中斷,可以在這里調用       HAL_UART_Receive_IT(),進行再次接收


下面說說我遇到的問題:


初始化串口完畢后,調用一次HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE),進行一個字節的中斷接收,然后在HAL_UART_RxCpltCallback()函數里,進行幀頭的校驗和傳輸數量的計算,然后繼續開啟。代碼如下


           //如果計算的數量大于規定的數量,說明傳輸出錯。丟棄,判定上位機發送是否錯誤

            if(usRecLength > DMA_BUF_MAX)

            {

                uxComDMA.ucRxBuf[eMsg_DTH] = APP_NULL;

                uxComDMA.ucRxBuf[eMsg_DTL] = APP_NULL;

                uxComDMA.usRxLen = APP_NULL;

                PTCL_Dbg("計算數量大于規定數量");

            }

            //接收的數量大于等于計算的數量

            if(uxComDMA.usRxLen >= usRecLength)

            {

                uxComDMA.uxReceiveFlag = eAppTrue;//標記接收完成。---此時不再調用HAL_UART_Receive_IT()

            }

            else//繼續接受下一個數據

            {

                HAL_UART_Receive_IT(&huart2, uxComDMA.ucRxBuf+uxComDMA.usRxLen,ONE_BYTE);


            }


當正確接收一幀數據后,便不再開啟,直到這一陣數據處理完,主程序再次調用HAL_UART_Receive_IT()進行下一輪的接收。


那么問題來了:規定的協議是8個字節,在正確接收到8個字節后便不再開啟中斷接收,主函數執行數據幀的處理完畢后才會開啟。但是如果上位機一次一共發送了10個字節,前8個字節是正確的一幀,后面2個無用。當下位機接收到8個字節便關閉了中斷,處理完后再次開啟。然后上位機再發來數據,發現下位機再也不能執行HAL_UART_RxCpltCallback(),協議就報廢了。


調試后發現,后來接收數據時雖然可以進入中斷并且執行了UART_Receive_IT();但是huart->RxState 的值不是HAL_UART_STATE_BUSY_RX導致不能繼續執行傳輸完成回調。疑問是,最后一次開啟中斷接收時調用HAL_UART_Receive_IT()函數確實將 huart->RxState = HAL_UART_STATE_BUSY_RX;


 


PTCL_Dbg("初始化接收的狀態%d",HAL_UART_Receive_IT(&huart2,uxComDMA.ucRxBuf,ONE_BYTE));//串口2的接收中斷


函數返回值為HAL_OK


PTCL_Dbg("串口的接收狀態%#x\r\n",huart2.RxState);----確實不等于HAL_UART_STATE_BUSY_RX,而是等于                                                                                                                                                   HAL_UART_STATE_READY


//    huart2.RxState = HAL_UART_STATE_BUSY_RX; ----加上這句話,可以解決問題


這是為什呢?


解決上述問題:


關于上述問題的總結:后兩個字節傳輸時,已經關閉了中斷,但是硬件將ORE位(溢出標志,看數據手冊)置一和RXNE位置一。當調用HAL_UART_Receive_IT()函數時,會同時使能EIE、PEIE、RXNEIE三個中斷。第一次我手動將RXNE位清除,但是沒有清除ORE位,造成調用就會立即產生中斷(溢出中斷)。當執行HAL_UART_IRQHandler()函數時:      


 

    

關于HAL庫,更多的是考慮到安全性和兼容性所以代碼量比較大,一開始使用不會像我們使用寄存器那么隨意,所以必須深入看源碼,才能更好的使用。


關鍵字:STM32  CubeMX  串口中斷 引用地址:STM32的CubeMX關于串口中斷

上一篇:STM32F4CubeMX學習筆記之ADC不帶中斷
下一篇:基于CubeMX HAL庫CAN的配置

推薦閱讀

廣告作為一種信息傳播活動,在內容、形式、傳播途徑中都有了許多重大的創新和改變,一個好的廣告能夠直接讓受眾者了解產品甚至是企業形象和企業文化獲得好感。但其在廣告標識方面的進步卻不是那么突出。一個成功的廣告標識也同樣可以做到產品和文化的宣傳,在這上面就要做到獨特、引人注目和視覺上的震撼,但傳統的標識模式卻無法達到理想中的3D效果。在科...
索尼Xperia 1(6.57英寸21:9屏)是2019年最讓我們感到驚喜的旗艦手機之一,這款手機之前傳出將推出一個小屏版本索尼Xperia 4(5.7英寸21:9屏)。現在又傳來了一個大屏旗艦版本——索尼Xperia 10 Ultra,它的屏幕尺寸竟然高達7英寸!還是21:9比例!三星Galaxy S10e、索尼Xperia 10 Plus、索尼Xperia 10 Ultra渲染圖  從曝光的渲...
全球領先的技術解決方案提供商安富利亞洲和AI軟件領域的創新企業Mipsology宣布,安富利將向其亞太區客戶推廣和銷售Mipsology的Zebra軟件平臺。Zebra消除了FPGA的技術復雜性,使得它們可以即插即用,并發揮超快的速度和出色的性能。該協議擴展了安富利的物聯網生態系統,為安富利的亞洲客戶帶來了Mipsology突破性的深度學習推理加速解決方案。希望部署人工...
蘋果公司今天獲得了一項夜視系統專利,該系統結合了可見光、近紅外(NIR)和長波紅外(LWIR)傳感器,可以全面觀察前方的情況。蘋果在專利描述當中表示,自動駕駛汽車在夜間視線方面與人類司機有同樣的局限性。夜間或低光環境給自動汽車控制系統帶來了挑戰。例如,夜間汽車前燈提供的照明水平可能受到法律或法規的限制,這反過來又會限制用于檢測車輛路徑中或...

史海拾趣

問答坊 | AI 解惑

基于Web的嵌入式設備管理

隨著互聯網絡硬件、軟件的迅猛發展,嵌入式系統被廣泛應用到工作和生活的各個領域中,如何對這些設備進行治理成為嵌入式系統軟件開發中的一個重要方面。用戶只有通過設備所提供的治理接口對共進行配置、治理和監控,因些治理接易用程度和效率成為衡 ...…

查看全部問答∨

FPGA開發資料大集合

altera FPGA設計初級篇   altera FPGA設計高級篇                                       https://bbs.eeworld.com.cn/thread-53288-1-2.h ...…

查看全部問答∨

電子工程師:如何把握風險與新技術的平衡?

人們可能會對電子產品的開發與設計方法堅持某種不變的觀念,甚至對解決不同問題所采用的器件這樣的小事都有某種思維 定勢,這是可以理解的。 我認識到,對于電子設計人員來說,“熟悉招致輕視”這樣的說法并不適用于他們。甚至那些我所認識的最有 ...…

查看全部問答∨

NXP LPC1343 開發板 學習之旅(二)

       在開始我的學習之旅第二篇之前,先來點題外話,今天下午,soso姐給我發了版主tiankai001的一篇帖子,讀起來感覺有點心酸啊。。。版主辛辛苦苦奮斗數載,打造良帖無數,怎奈看貼多數,回復寥寥。。。一股悲情 ...…

查看全部問答∨

請問A/D的輸入電壓范圍與參考電壓的關系?

1. 比如C8051F350,它的內部參考電壓為2.5V,如果我要測量的模擬電壓范圍是0~5V,那不是超過了量程? 2. 比如ADS1211,它的輸入模擬電壓范圍好像與A/D的增益因數有關系,還與參考電壓Vref,偏置電壓Vbias 有關系?       …

查看全部問答∨

315avr自制活動正在開展,已出原理圖,歡迎積極參與

315avr自制活動正在開展,已出原理圖,歡迎積極參與... 1. 自制\"M16/32標準學習開發板\"活動主題貼地址:http://www.315avr.com/bbs/dispbbs.asp?boardID=3&ID=191&page=1 2. \"自制USB AVR JTAGICE仿真器+AVRISP下載器\"活動主題貼地址:http:/ ...…

查看全部問答∨

mount 不上

root@arago:/# mount /dev/mtdblock4 /mnt/aaa/ mtdblock_open ok mtdblock: read on \"filesystem\" at 0x0, size 0x200 end_request: I/O error, dev mtdblock4, sector 0 FAT: unable to read boot sector mtdblock_release nand_sync: c ...…

查看全部問答∨

初始化,請教高手!

void Init(void) { // =============Basic Timer 中斷設置========================== BTCTL = BTDIV+BTIP0; // IE2|=0X80; // =============Timer A中斷設置========================== TACTL= ...…

查看全部問答∨

時鐘初始化do while語句跳不出來

// 時鐘初始化程序 void Clock_Init() {   unsigned char i;   P5SEL=0X0C;   P7SEL=0X00;   //_bis_SR_register(SCG0);   UCSCTL6=0X4001;         &nbs ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 黔西县| 呈贡县| 麻栗坡县| 茶陵县| 新昌县| 鄂尔多斯市| 广元市| 周至县| 伊宁县| 遂昌县| 铅山县| 武冈市| 太康县| 饶平县| 长沙县| 广饶县| 怀宁县| 华蓥市| 罗江县| 咸宁市| 诸城市| 涟水县| 德惠市| 榆社县| 且末县| 日土县| 资源县| 三台县| 剑阁县| 二连浩特市| 黔东| 临泽县| 福贡县| 平和县| 饶阳县| 理塘县| 涞源县| 东方市| 龙井市| 洛隆县| 台州市|