0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于TIMER3發(fā)生捕獲中斷丟失問題分析與總結(jié)

STM32單片機(jī) ? 來源:未知 ? 作者:伍文輝 ? 2018-01-15 15:11 ? 次閱讀

前言

在一洗衣機(jī)MC項(xiàng)目中,客戶選擇使用STM32F030作為主控芯片。使用TIMER3(CH3)來捕獲電機(jī)的HALL Sensor的中斷,同時(shí)使用TIMER3(CH2)的OC功能,在OC match中斷中調(diào)整轉(zhuǎn)速??蛻粼谡{(diào)試中發(fā)現(xiàn),當(dāng)捕獲中斷和OC中斷“同時(shí)發(fā)生(對(duì)齊)”時(shí),會(huì)發(fā)生捕獲中斷丟失。

問題分析

客戶最初發(fā)現(xiàn)使用該配置控制電機(jī)時(shí),在某一時(shí)刻會(huì)出現(xiàn)電機(jī)轉(zhuǎn)速異常。經(jīng)過抓取波形發(fā)現(xiàn),HALL Sensor和捕獲輸出波形(在中斷中翻轉(zhuǎn)IO)不匹配,在某個(gè)時(shí)刻,會(huì)出現(xiàn)“中斷丟失”現(xiàn)象,表現(xiàn)為捕獲輸出高電平或低電平周期被拉長(zhǎng),如圖1所示。黃色為HALL信號(hào),綠色為捕獲中斷輸出,紫色為OC中斷輸出,可以明顯看到在第四個(gè)上升沿之后,高電平長(zhǎng)度被拉長(zhǎng)半個(gè)周期。客戶懷疑是硬件Bug導(dǎo)致中斷“同時(shí)發(fā)生”時(shí),捕獲“中斷丟失”,從而導(dǎo)致該問題。

基于TIMER3發(fā)生捕獲中斷丟失問題分析與總結(jié)

圖 一

查看Erratasheet, 沒有相關(guān)的描述。另外,硬件BUG導(dǎo)致中斷丟失的可能性較小,因?yàn)橹袛嗤瑫r(shí)發(fā)生的概率很低而該現(xiàn)象很容易復(fù)現(xiàn)。

構(gòu)建測(cè)試環(huán)境

通過CubeMx構(gòu)建對(duì)應(yīng)的測(cè)試工程,分別在捕獲和OC中斷中翻轉(zhuǎn)IO來檢測(cè)中斷狀況。另外,通過其它開發(fā)板產(chǎn)生相應(yīng)的PWM來模擬HALL信號(hào)。經(jīng)過測(cè)試發(fā)現(xiàn),使用Cube庫生成的代碼,并沒有“丟失中斷”的現(xiàn)象,波形見下圖。

代碼分析

客戶的代碼,包括中斷服務(wù)函數(shù)都是通過直接操作寄存器的方式編寫。分析客戶的代碼發(fā)現(xiàn),客戶在中斷服務(wù)函數(shù)中清除相關(guān)中斷標(biāo)志位時(shí)是通過常用的寄存器操作方式“讀-修改-寫”來完成,如下:

TIM3->SR&= ~TIM_SR_CC3IF; /* Clear the flags */

而在HAL Driver中是通過對(duì)應(yīng)的位直接賦值的方式清除,如下:

#define__HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR= ~(__INTERRUPT__))

結(jié)合客戶觀察到的現(xiàn)象,懷疑可能的原因是捕獲中斷標(biāo)志在從讀狀態(tài)寄存器到寫入寄存器之間被置位,這樣的話,該標(biāo)志就可能未被檢測(cè)處理到就被清除掉了,從而導(dǎo)致異常的發(fā)生。

基于TIMER3發(fā)生捕獲中斷丟失問題分析與總結(jié)

將HAL Driver函數(shù)中的中斷服務(wù)函數(shù)修改成與客戶一樣的“讀-修改-寫”方式來清除對(duì)應(yīng)標(biāo)志位,該問題被復(fù)現(xiàn)。

小結(jié)

如果通過直接操作寄存器的方式來集成底層驅(qū)動(dòng),那么在通過“讀-修改-寫”方式操作此類會(huì)由硬件修改的寄存器時(shí),一定要加倍小心。根據(jù)寄存器具體的描述,可以采用直接寫入或者聯(lián)合體(按位修改)的方式修改。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    893

    瀏覽量

    41319
  • OC
    OC
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    12403
  • STM32F030
    +關(guān)注

    關(guān)注

    1

    文章

    33

    瀏覽量

    6597

原文標(biāo)題:TIMER3 “中斷丟失 ”現(xiàn)象分析

文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    TIMER3設(shè)置成外部捕獲模式,T3_EXT引腳每秒輸入10個(gè)脈沖,為什么得到的CNT寄存器和CAP寄存器的值這么大?

    TIMER3設(shè)置成外部捕獲模式,T3_EXT引腳 每秒輸入10個(gè)脈沖,但是得到的CNT寄存器和CAP寄存器的值怎么會(huì)這么大呢 TIMER3 CNT=8367060,CAP=51211
    發(fā)表于 01-17 07:40

    STM32入門篇之通用定時(shí)器徹底研究(新手教程,含11個(gè)例程,全面剖析TIMER,另外有個(gè)2.0庫的

    的,希望能給你帶來點(diǎn)幫助。例程列表:TIMER-1 : 定時(shí)器上溢。TIMER-2 : 強(qiáng)置輸出模式。TIMER-3 : 輸出比較模式。TIMER-4 : PWM1模式。
    發(fā)表于 11-27 09:07

    請(qǐng)問CC2540 timer3 timer4 的PWM怎么用?有沒有例程參考?

    本帖最后由 一只耳朵怪 于 2018-6-6 17:11 編輯 你好timer.h內(nèi)的API貌似不能用,請(qǐng)問 timer3 timer4 的PWM怎么用?有沒有例程參考?
    發(fā)表于 06-06 00:10

    輸入捕獲模塊中斷發(fā)生會(huì)重置Time3值嗎?

    ,如果Time3當(dāng)前值為65000,輸入捕獲發(fā)生在這里,在65536發(fā)生溢出計(jì)數(shù)器嗎?我的意思是說我還在檢查溢出計(jì)數(shù)器來識(shí)別低頻信號(hào)。它誤導(dǎo)了我嗎?我應(yīng)該在第一個(gè)輸入
    發(fā)表于 09-18 14:58

    stm32F207 APB1輸出最大時(shí)鐘給TIMER3問題

    ”。AHB:即HPRE[3:0],PLL作為系統(tǒng)時(shí)鐘輸出為120M)(2)現(xiàn)象:配置TIMER3,120分頻,溢出中斷次數(shù)為1000,中斷產(chǎn)生周期是1ms(APB1,未分頻)。(
    發(fā)表于 12-11 09:01

    使用TMRxH和TMRxL中相同內(nèi)容的Timer1和Timer3的工作方式截然不同

    這個(gè)問題,THX! 以上來自于百度翻譯 以下為原文 Hi, I was trying to use two timer(timer1 and timer3) to blink LED0
    發(fā)表于 03-01 07:25

    STM32F0 Timer3作為定時(shí)器輸出

    設(shè)置Timer3 中斷void TIM3_INT_Config(void){ NVIC_InitTypeDef NVIC_InitStructure; /* TIM3 clock en
    發(fā)表于 08-16 08:23

    NXP LPC1768 timer3定時(shí)器問題

    我配置timer3定時(shí)器,打印信息,結(jié)果只發(fā)現(xiàn)打印出了0,1打印不出來,感覺就是寫了一下寄存器就不行了,有大佬指點(diǎn)下么
    發(fā)表于 08-28 18:19

    STM32F0 Timer3是怎樣作為定時(shí)器輸出的

    STM32F0 Timer3是怎樣作為定時(shí)器輸出的?STM32F0 Timer3是怎樣作為中斷輸出的?
    發(fā)表于 11-16 06:03

    如何用timer3模擬霍爾信號(hào)TIH1、TIH2、TIH3出來?

    如何用timer3模擬霍爾信號(hào)TIH1、TIH2、TIH3出來?
    發(fā)表于 12-21 06:40

    MSP432定時(shí)器異常進(jìn)捕獲中斷并沒有發(fā)生捕獲事件怎么解決

    MSP432定時(shí)器異常進(jìn)捕獲中斷的問題問題描述:使用msp432定時(shí)器捕獲外接信號(hào)的上升沿,設(shè)斷點(diǎn)調(diào)試時(shí)發(fā)現(xiàn)總是會(huì)進(jìn)中斷服務(wù)函數(shù),但是并沒有發(fā)生
    發(fā)表于 02-15 07:02

    Timer3上設(shè)置定時(shí)器中斷無法生成PWM信號(hào)咋辦呢

    我正在使用 Bluepill 開發(fā)板。我想在 Timer2 上生成 PWM 信號(hào),并在 Timer3 上以 20ms 的間隔設(shè)置一個(gè)定時(shí)器中斷。我意識(shí)到,如果我在 Timer3 上設(shè)置
    發(fā)表于 12-22 07:28

    BSP\\TIMER_Capture范例中,Timer0和Timer3的輸出頻率和手冊(cè)的不一致是為什么?

    各位大大安安,在官方BSP\\TIMER_Capture范例中,提到Timer0和Timer3的輸出頻率各位500Hz和1Hz,但是實(shí)際上則是1000Hz和2Hz,這其中是不是有什么誤會(huì)???,謝謝
    發(fā)表于 06-27 15:05

    TIMER3設(shè)置成外部捕獲模式,得到的CNT寄存器和CAP寄存器的值怎么會(huì)這么大呢?

    TIMER3設(shè)置成外部捕獲模式,T3_EXT引腳 每秒輸入10個(gè)脈沖,但是得到的CNT寄存器和CAP寄存器的值怎么會(huì)這么大呢 TIMER3 CNT=8367060,CAP=51211
    發(fā)表于 08-29 07:09

    MSP432定時(shí)器異常進(jìn)捕獲中斷的問題

    MSP432定時(shí)器異常進(jìn)捕獲中斷的問題問題描述:使用msp432定時(shí)器捕獲外接信號(hào)的上升沿,設(shè)斷點(diǎn)調(diào)試時(shí)發(fā)現(xiàn)總是會(huì)進(jìn)中斷服務(wù)函數(shù),但是并沒有發(fā)生
    發(fā)表于 12-16 16:53 ?8次下載
    MSP432定時(shí)器異常進(jìn)<b class='flag-5'>捕獲</b><b class='flag-5'>中斷</b>的問題