国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

解決STM32在延時時無法進入中斷的問題

這篇具有很好參考價值的文章主要介紹了解決STM32在延時時無法進入中斷的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題:

在使用zigbee模塊時,使用串口作為無線收發(fā)的載體,與stm32通信,使用DHT11作為簡單的受控源,出現(xiàn)了bug:

當(dāng)在while(1)里使用delay函數(shù),或者使用DHT11_Read_Data函數(shù)時,程序無法進入串口接收中斷,無法使用遠程控制

其中的while函數(shù)為:

while (1){
        DHT11_Read_Data(&temp,&humi);//DHT11讀取溫度
 ?      bufFun();
        if(dht11Res){
?
            USART2_SendByte('1');
            OLED_ShowNum(1,8,temp,2);
            temp++;
            
        }else{
            USART2_SendByte('2');
        }
        delay_ms(1000);
    }

解決思路:

一、常規(guī)檢查

檢查接線之后,我首先想到的是可能數(shù)據(jù)量過大無法進入中斷,或者是某一步出錯,使用STlink debug后,發(fā)現(xiàn)程序一直在主函數(shù)里,沒有進入串口接收中斷

二、延時函數(shù)

隨后我仔細排查函數(shù)體,發(fā)現(xiàn)DHT11_Read_Data 或者其他函數(shù)體內(nèi),都存在延時函數(shù),在之前的學(xué)習(xí)開發(fā)中,也遇到過因為滴答定時器優(yōu)先級問題而出現(xiàn)的奇怪bug,嘗試使用簡單的軟件延時代替:

//粗延時函數(shù),微秒
void delay_us(u16 time)
{ ? ?
 ? u16 i=0; ?
 ? while(time--)
 ? {
 ? ? ?i=10; ?//自己定義
 ? ? ?while(i--) ; ? ?
 ? }
}
//毫秒級的延時
void delay_ms(u16 time)
{ ? ?
 ? u16 i=0; ?
 ? while(time--)
 ? {
 ? ? ?i=12000; ?//自己定義
 ? ? ?while(i--) ; ? ?
 ? }
}

無果后嘗試另一種無需中斷的硬件延時:

#include "delay.h"
?
void delay_us(u32 nus)
{
 u32 temp;
 SysTick->LOAD = 9*nus;
 SysTick->VAL=0X00;//清空計數(shù)器
 SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鐘源
 do
 {
 ?temp=SysTick->CTRL;//讀取當(dāng)前倒計數(shù)值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達
 ? ? SysTick->CTRL=0x00; //關(guān)閉計數(shù)器
 ? ?SysTick->VAL =0X00; //清空計數(shù)器
}
void delay_ms(u16 nms)
{
 u32 temp;
 SysTick->LOAD = 9000*nms;
 SysTick->VAL=0X00;//清空計數(shù)器
 SysTick->CTRL=0X01;//使能,減到零是無動作,采用外部時鐘源
 do
 {
 ?temp=SysTick->CTRL;//讀取當(dāng)前倒計數(shù)值
 }while((temp&0x01)&&(!(temp&(1<<16))));//等待時間到達 
 ? ?SysTick->CTRL=0x00; //關(guān)閉計數(shù)器
 ? ?SysTick->VAL =0X00; //清空計數(shù)器
?
}

三、串口處理函數(shù)

經(jīng)過以上調(diào)試后,我開始注意到串口處理函數(shù):bufFun

原本的想法是把它放在主函數(shù)里,讀取數(shù)據(jù)幀,然后用來判斷命令

void bufFun(void){//數(shù)據(jù)幀接收
    
        if(res){
            
            switch(USARTReceIn){
            case 0:
                if(udata=='@'){//頭
                    databuf[USARTReceIn++] = udata;
                }
                else{
                    USARTReceIn = 0;
                }
                break;
        
            default:
                databuf[USARTReceIn++] = udata;
                break;
            }
            res=0;
        }
        
    if(USARTReceIn >= maxSizebuf)//數(shù)據(jù)幀接收完成
    {
        USARTReceFullFlag = 1;   
    }
    dataProcess();
        
    
}
void dataProcess(void){//數(shù)據(jù)幀處理
    
    if(USARTReceFullFlag)
    {
        //處理
        //USART_Send_Str(databuf,maxSizebuf); 
        func();
        //清空
            USARTReceFullFlag = 0;
            USARTReceIn = 0;
            memset(databuf,0x00,sizeof(udata));
    }
    
}

但是此處邏輯出現(xiàn)問題:

讀取數(shù)據(jù)幀的前提是,串口接收中斷成功接收一組數(shù)據(jù)幀,同時,while(1)里運行到bufFun,才可以識別一幀數(shù)據(jù)

但是當(dāng)有延時,或者while中出現(xiàn)大量代碼時,可能會出現(xiàn),數(shù)據(jù)已經(jīng)接收好,但是程序還沒有運行到讀取位,出現(xiàn)bug

嘗試修改為在USART2_IRQHandler中運行bufFun:

問題解決文章來源地址http://www.zghlxwxcb.cn/news/detail-658542.html

到了這里,關(guān)于解決STM32在延時時無法進入中斷的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32 hal庫編程定時器清除中斷標志位,開啟定時器中斷會立即進入中斷的問題

    1、如果不清除中斷標志位,開啟定時器中斷的話,不能完成相應(yīng)的計時,會立即進入中斷。 2、如果在開啟定時器中斷前清除了中斷標志位,就會等待計時完成再出發(fā)中斷。 3、主要是針對單次計時使用,尤其是對第一次計時有要求的程序。

    2024年02月01日
    瀏覽(22)
  • 關(guān)于STM32用DMA傳輸UART空閑中斷中接收的數(shù)據(jù)時無法接收數(shù)據(jù)問題以及解決辦法

    關(guān)于STM32用DMA傳輸UART空閑中斷中接收的數(shù)據(jù)時無法接收數(shù)據(jù)問題以及解決辦法

    ???????? 串口1相關(guān)的設(shè)置及printf函數(shù)的使用,這里沒放,建議先實現(xiàn)串口打印功能 可以參考:使用STM32 CUBE IDE配置STM32F7 用DMA傳輸多通道ADC數(shù)據(jù)_stm32cubeide 配置adc_一只小白啊的博客-CSDN博客 ????????普通模式和循環(huán)模式的區(qū)別在于,普通模式下,DMA只會接收一次數(shù)據(jù),

    2024年02月05日
    瀏覽(19)
  • 【STM32筆記】HAL庫低功耗STOP停止模式的串口喚醒(解決進入以后立馬喚醒、串口喚醒和回調(diào)無法一起使用、接收數(shù)據(jù)不全的問題)

    【STM32筆記】HAL庫低功耗STOP停止模式的串口喚醒(解決進入以后立馬喚醒、串口喚醒和回調(diào)無法一起使用、接收數(shù)據(jù)不全的問題)

    【STM32】HAL庫低功耗STOP停止模式的串口喚醒(解決進入以后立馬喚醒、串口喚醒和回調(diào)無法一起使用、接收數(shù)據(jù)不全、首字節(jié)錯誤的問題) 【STM32筆記】低功耗模式配置及避坑匯總 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32筆記】HAL庫低功耗模式配置(ADC喚醒無

    2024年02月14日
    瀏覽(26)
  • stm32 freertos多任務(wù)狀態(tài)遷移,中斷臨界段,任務(wù)延時

    stm32 freertos多任務(wù)狀態(tài)遷移,中斷臨界段,任務(wù)延時

    arm中SP,LR,PC寄存器以及其它所有寄存器以及處理器運行模式介紹 特權(quán)級與用戶級的區(qū)別主要是某些寄存器能不能訪問與修改: cortex M3/M4內(nèi)核 特權(quán)級與用戶級詳解 Cortex-M3雙堆棧MSP和PSP Cortex-M3雙堆棧MSP和PSP M3內(nèi)核何時使用MSP何時使用PSP? 特權(quán)級可以使用MSP 和PSP指針 用戶級

    2024年02月12日
    瀏覽(85)
  • STM32不使用中斷實現(xiàn)定時器微秒級精確延時

    STM32不使用中斷實現(xiàn)定時器微秒級精確延時

    我們在寫代碼的時候避免不了要使用延時函數(shù),很多延時函數(shù)都是使用中斷或者tick來實現(xiàn)的,tick的方式最大到毫秒ms級別,通過中斷方式的通用定時器來實現(xiàn),如果實現(xiàn)1us的延時那么每1us就來一次中斷,很影響cpu的效率。 本文提供一種 不使用中斷 ,并且很簡單的方式實現(xiàn)的

    2024年04月11日
    瀏覽(21)
  • 關(guān)于 STM32 在使用 C++ 進行編程時無法進行中斷(觸發(fā)中斷就死循環(huán))的問題

    他媽的?。?!就因為這破事導(dǎo)致我浪費了兩天的時間!??! 都是基礎(chǔ)不扎實的鍋,導(dǎo)致我沒能第一時間想到問題的關(guān)鍵 好了,平復(fù)一下心情,快速的寫一篇博客來記錄這個叼問題 先把結(jié)論放在這里:用 extern \\\"C\\\" {} 把中斷函數(shù)包起來 本來我是想寫一個 RS485 通信模塊的,但是

    2024年02月12日
    瀏覽(22)
  • STM32 HAL庫 中斷處理中使用延時函數(shù)(HAL_Delay)

    STM32 HAL庫 中斷處理中使用延時函數(shù)(HAL_Delay)

    今天在學(xué)習(xí)STM32 HAL庫外部中斷,使用的是按鍵觸發(fā)外部中斷,想在外部中斷里面寫一個按鍵消抖,也就是在HAL庫外部中斷處理函數(shù)中使用了HAL_Delay() 函數(shù),后來經(jīng)過實驗,在外部中斷處理函數(shù)(void EXTI1_IRQHandler(void))和中斷回調(diào)函數(shù)(void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin))里面都

    2024年03月16日
    瀏覽(32)
  • 【HAL庫】STM32CubeMX開發(fā)----非阻塞延時實驗----SysTick(滴答定時器)中斷

    【HAL庫】STM32CubeMX開發(fā)----非阻塞延時實驗----SysTick(滴答定時器)中斷

    STM32CubeMX 下載和安裝 詳細教程 【HAL庫】STM32CubeMX開發(fā)----STM32F103/F207/F407----目錄 HAL庫 有自帶的 ms級 延時函數(shù): HAL_Delay(); 缺點: 這是 阻塞延時 方式,就是延時期間,什么都不能干,這樣很浪費資源。 這篇文章主要介紹,利用 SysTick(滴答定時器)中斷 實現(xiàn) 非阻塞延時 的實驗

    2024年02月16日
    瀏覽(99)
  • stm32進入硬件錯誤中斷hardfault的原因剖析以及如何定位(必看)

    stm32進入硬件錯誤中斷hardfault的原因剖析以及如何定位(必看)

    指令集方面:arm一般高端處理器,比如cortex-a系列,都是32位的arm指令。而cortex-m0,1,3,4等低端處理器,也叫做單片機,為了增加代碼密度(同樣存儲器內(nèi)可以存更多指令),用的是thumb指令集(而且僅支持這個指令集),這個指令集大多數(shù)指令是16位的,少數(shù)是32位的。這就是為

    2023年04月09日
    瀏覽(22)
  • 通過串口中斷的方式進行ASR-01S模塊與STM32通信(問題與解決)

    最近在做一個智能家居的項目,需要實現(xiàn)語音控制的功能,于是我選用了ASR-01S模塊與STM32通信,這個模塊最大的好處在于有配套的編程軟件和語音庫,不用自己訓(xùn)練且編程簡單(少兒編程的程度)。ASR-01S的代碼架構(gòu)在這不多說,總之在收到語音后它會通過串口發(fā)送一串命令給

    2024年04月22日
    瀏覽(169)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包