91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

基于向上計數(shù)的單脈沖PWM模式

茶話MCU ? 來源:ST MCU 信息交流 ? 作者:ST MCU 信息交流 ? 2020-07-12 10:46 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

有人說在MCU的開發(fā)應(yīng)用過程中遇到過一次中斷事件觸發(fā)兩次中斷的奇怪事情。有這樣的事嗎?應(yīng)該說有真有假,這里以STM32為例來聊聊該話題。

所謂假的,就是指基于誤會以為一次事件觸發(fā)了兩次甚至多次中斷。比方按鍵事件沒有做好消抖處理,或者中斷請求標(biāo)志位沒有被及時清零等。順便說下,對于STM32芯片而言,如果中斷請求標(biāo)志沒有被清零會沒完沒了的循環(huán)進(jìn)相應(yīng)中斷服務(wù)程序。

這里重點聊聊真的,即一次中斷事件進(jìn)入兩次中斷服務(wù)程序,的確有機會碰到。偶爾也有人反映類似問題,比方做UART通信時,一個空閑事件進(jìn)入兩次空閑中斷,感覺相關(guān)標(biāo)志沒法清除;有人通過定時器觸發(fā)SPI傳輸,一個定時器事件竟然進(jìn)入兩次中斷連續(xù)給SPI數(shù)據(jù)寄存器賦值兩次。

發(fā)生這種一次觸發(fā)事件進(jìn)入兩次中斷的情況時,一般有個非常明顯的特征,那就是在中斷服務(wù)程序里對中斷請求標(biāo)志的清零代碼往往放在中斷服務(wù)程序的最末尾。我們不妨弄個具體的實例感受下。

下面以一個定時器更新中斷為例。我讓定時器工作在基于向上計數(shù)的單脈沖PWM模式,即啟動計數(shù)器后,當(dāng)發(fā)生溢出產(chǎn)生更新事件時即告停止。那么每次啟動定時器后按理有且只有一次進(jìn)入更新中斷服務(wù)程序。我在中斷服務(wù)程序里放個計數(shù)變量,統(tǒng)計進(jìn)入中斷的次數(shù)。我這里使用STM32F4的開發(fā)板測試的。

先看看中斷服務(wù)程序里清除中斷請求標(biāo)志的代碼不是放在最后一行的情況。其中變量counterX用來統(tǒng)計進(jìn)入中斷服務(wù)程序次數(shù)。

基于向上計數(shù)的單脈沖PWM模式

這次測試結(jié)果沒問題,一次更新事件對應(yīng)進(jìn)入一次中斷服務(wù)程序。我將上面的中斷服務(wù)程序稍微調(diào)整下代碼前后順序,讓清除中斷請求位的代碼放在最后,再看看下面結(jié)果。

基于向上計數(shù)的單脈沖PWM模式

嗯?counterX結(jié)果變?yōu)?了,一次觸發(fā)事件怎么進(jìn)了兩次中斷服務(wù)程序呢?!

這時不同的人往往會有不同的判斷或結(jié)論。比方中斷請求標(biāo)志一次清不掉啊;同樣的寫法別的系列或型號卻可以,認(rèn)為太莫名其妙啦!【其實,到底是不是完全相同的寫法只是感覺,就像我上面的寫法不細(xì)究的話也可以說是一樣的寫法】,或者說芯片很奇葩啊云云。

怎么會這樣呢?原因就在于那行清除中斷請求位的代碼放在最后,在第一次退出中斷服務(wù)程序時該請求位尚未完成被清零的狀態(tài)。程序指令執(zhí)行速度越快,這種可能性就越高。既然該中斷請求位依然保持置1的有效狀態(tài),經(jīng)硬件觸發(fā)再次進(jìn)入中斷服務(wù)程序就順理成章了。

有人會問,我在退出中斷服務(wù)程序之前不是已經(jīng)做了中斷請求位的清零操作嗎?怎么沒有立即生效呢?再怎么“立即”也是需要時間的,程序指令的執(zhí)行完畢和指令執(zhí)行后的狀態(tài)改變并不一定同步。比方你到包子鋪去跟老板說買3個饅頭,老板滿口應(yīng)諾后,你不能立即扭頭就走啊。他還需要點時間來處理,不然一輩子都買不到3個饅頭。具體結(jié)合到stm32芯片,程序執(zhí)行是基于哈佛結(jié)構(gòu)的流水線形式,前面代碼執(zhí)行時依然可以執(zhí)行后序的指令代碼。

談到這里,有人或許想到在清除中斷請求位的代碼后面加上一句內(nèi)存屏蔽指令,即DSB。應(yīng)該說加這個DSB指令是有效的,即該指令前的所有內(nèi)存訪問指令執(zhí)行完畢后才執(zhí)行后序指令代碼。不過,一般來講,在這個地方用不著它,我們只須注意別將清除中斷請求位的代碼放在服務(wù)程序的末尾,稍微給清零操作留點實現(xiàn)時間。就像上面打比方買饅頭一樣,給老板一點為你取饅頭的時間就行。

也許有人會說,我中斷服務(wù)程序里就只需做中斷請求位清零這一件事怎么辦呢?那你就隨便在清零操作代碼后面隨便一兩行無關(guān)緊要的代碼也行,確保不發(fā)生1次事件進(jìn)兩次中斷即可。

剛才前面說了,當(dāng)清除中斷請求位的代碼放在服務(wù)程序最后時,程序指令執(zhí)行速度越快,一次觸發(fā)事件進(jìn)入兩次中斷服務(wù)程序的可能性就越高。我們不妨看看下面基于STM32H7系列的一段中斷服務(wù)程序代碼。是TIM3的更新中斷服務(wù)程序,截圖里的兩行代碼為中斷服務(wù)程序的最末兩行。注意,清除中斷標(biāo)志的代碼沒有在最末一行。

基于向上計數(shù)的單脈沖PWM模式

其基本功能就是每進(jìn)一次更新中斷,先清中斷標(biāo)志,然后給SPI數(shù)據(jù)寄存器賦值令其發(fā)送一個16位數(shù)據(jù)。顯然,結(jié)合我們前面的分析,如果代碼這樣寫一般來講是不太可能發(fā)生一次事件觸發(fā)2次中斷的,事實上當(dāng)程序代碼在FLASH里運行時也的確沒有任何問題。

但當(dāng)將中斷服務(wù)程序放到RAM里,比方放到DTCM里去運行時發(fā)生了功能異常。結(jié)果變成了每次更新事件發(fā)送的數(shù)據(jù)不是16位而是32位了。這個32位數(shù)據(jù)正是因為一次更新事件連續(xù)兩次進(jìn)入中斷服務(wù)程序,兩次發(fā)送SPI數(shù)據(jù)。那為什么完全相同的代碼在FLASH里運行沒這個問題呢,因為代碼在DTCM的運行速率要比在FLASH里快,盡管在清中斷請求標(biāo)志的代碼后面已經(jīng)有了兼具延時功能的那句針對SPI數(shù)據(jù)寄存器的賦值語句,在退出中斷前該請求標(biāo)志位還是未完成清零而再進(jìn)了一次中斷。

看來,這里還得稍微加多點延時以保證中斷請求標(biāo)志在退出中斷前被清零。為了避免加延時代碼的盲目性,即要么短了要么長了,我們可以使用對標(biāo)志位的輪詢方式,將代碼稍加改動變成下面的樣子。

基于向上計數(shù)的單脈沖PWM模式

之后,再行驗證測試都是正常的。若有興趣的話,可以在清標(biāo)志位的代碼后面加DSB指令驗證測試下。
責(zé)任編輯:pj

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

    關(guān)注

    463

    文章

    54084

    瀏覽量

    467216
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18990

    瀏覽量

    399909
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2318

    瀏覽量

    98309
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    脈沖/頻率計數(shù)采集模塊:高速脈沖+頻率,支持?jǐn)嚯姳4?/a>

    脈沖/頻率計數(shù)采集模塊是工業(yè)里專門 “數(shù)脈沖、測頻率” 的小硬件,相當(dāng)于給傳感器、電機、流量計裝了一個高精度計數(shù)器 + 測速儀。 一、主要功能 脈沖
    的頭像 發(fā)表于 03-04 16:06 ?239次閱讀

    功率MOSFET器件的單脈沖雪崩能量參數(shù)解讀

    在功率MOSFET器件的設(shè)計與選型中,單脈沖雪崩能量(Single Pulse Avalanche Energy, EAS)是一個至關(guān)重要的參數(shù)。它量化了器件在極端過壓條件下,單次承受雪崩能量的能力,其單位是焦耳(J)。EAS值越大,意味著器件在遭遇瞬間電壓尖峰時越不易損壞。
    的頭像 發(fā)表于 01-20 15:28 ?4866次閱讀
    功率MOSFET器件的<b class='flag-5'>單脈沖</b>雪崩能量參數(shù)解讀

    CW32定時器及其中斷介紹

    / 比較通道,可實現(xiàn) 6 路獨立 PWM 輸出或 3 對互補 PWM 輸出或?qū)?6 路輸入進(jìn)行捕獲。可 用于基本的定時 / 計數(shù)、測量輸入信號的脈沖寬度和周期、產(chǎn)生輸出波形(
    發(fā)表于 01-14 06:42

    LAT1183+高精度定時器中 single-shot 計數(shù)模式不工作應(yīng)用筆記

    PWM 輸出,在調(diào)試模式下發(fā)現(xiàn)該子定時器的計數(shù)器一直為 0,即計數(shù)器一直沒有啟動,但如果將計數(shù)方式修改為continuous
    發(fā)表于 01-11 17:28 ?0次下載

    【乾芯QXS320F開發(fā)板試用】ePWM 模塊 Up-Down 計數(shù)模式與動態(tài)占空比控制

    使用的是 Up-Down Count(向上向下計數(shù)模式,計數(shù)器從 0爬升到 2000,再從 2000 回落到 0 才算一個周期。 PWM
    發(fā)表于 01-08 14:53

    CW32A030微控制器定時器

    脈沖寬度和周期、產(chǎn)生輸出波形(PWM、單脈沖、插入死區(qū)時間 的互補PWM 等)。 2 通用定時器(GTIM1..4) 內(nèi)部集成4 個通用定時器(GTIM),每個GTIM 完全獨立且
    發(fā)表于 12-04 06:47

    CW32L0開發(fā)板學(xué)習(xí)記錄四,高級定時器ATIM學(xué)習(xí)

    實現(xiàn)6路獨立 PWM 輸出或6對帶死區(qū)互補PWM 輸出或?qū)?路輸入進(jìn)行捕獲。可用于基本的定時/計數(shù)、測量輸入信號的脈沖寬度和周期、產(chǎn)生輸出波形(PW
    發(fā)表于 12-01 07:35

    如何通過PWM脈沖控制電機?

    通過單片機實現(xiàn)對電機自動化控制已經(jīng)在各行各業(yè)得到廣泛應(yīng)用,電機轉(zhuǎn)速靈活使用方便,控制性能好,易于大范圍調(diào)速。單片機通過PWM脈沖控制電機轉(zhuǎn)速,在現(xiàn)代化生產(chǎn)中起到重要作用。 單片機是一種集成電路芯片
    發(fā)表于 11-28 06:58

    HbirdV2-SoC自帶pwm配置介紹

    UPDOWNSEL域,該域用于控制TIMx計數(shù)到閾值時的行為。為0時,TIMx向上計數(shù)到閾值后繼續(xù)向下計數(shù);為1時,TIMx向上計數(shù)到閾值后將計數(shù)
    發(fā)表于 10-30 06:53

    【RA4M2-SENSOR】3、使用GPT定時器-PWM輸出

    結(jié)合起來使用的話可以實現(xiàn)更加豐富的功能, 可以對輸入信號進(jìn)行計數(shù),可以測量輸入信號的脈沖寬度,可以輸出單個脈沖、PWM 等波形,等等。 通過定時器生成
    發(fā)表于 09-01 15:20

    第二十章 TIM——基本定時器

    本章介紹了W55H32基本定時器TIM6、TIM7,16位向上計數(shù),含時鐘源、預(yù)分頻器等,講解定時計算及初始化結(jié)構(gòu)體。
    的頭像 發(fā)表于 06-20 13:51 ?1202次閱讀
    第二十章 TIM——基本定時器

    STM32H7開啟單脈沖模式 PWM脈沖寬度不受CCR控制怎么解決?

    我將定時器1作為從定時器 從定時器arr是49 也就是50us記完一圈 CCR是25并且把定時器配置成了OPM單脈沖模式(時鐘頻率分頻率我都已設(shè)置好了定時器計數(shù)一次都是1us)定時器15作為主定時器
    發(fā)表于 06-18 07:14

    開關(guān)電源三種控制模式PWM/PFM/PSM

    PWM/PFM/PSM 三種控制模式的定義通常來說,開關(guān)電源(DC-DC)有三種最常見的調(diào)制方式分別為: 脈沖寬度調(diào)制(PWM脈沖
    發(fā)表于 06-09 16:11

    MOSFET單脈沖雪崩擊穿能量的失效模式

    單脈沖雪崩擊穿能量(Energy during avalanche for single pulse),即 EAS。指的是MOSFET器件串聯(lián)感性負(fù)載時,在單次脈沖(工作到關(guān)斷)狀態(tài)下,所能承受的最大能量消耗,單位是焦耳(J),其值越大,器件在電路中遭遇瞬間過電壓或過電流
    的頭像 發(fā)表于 05-15 15:32 ?4608次閱讀
    MOSFET<b class='flag-5'>單脈沖</b>雪崩擊穿能量的失效<b class='flag-5'>模式</b>

    MCU定時器/計數(shù)

    架構(gòu)與功能特性? 定時器類型與配置? 高級控制定時器?:支持互補PWM輸出與剎車功能,適用于電機驅(qū)動等高精度控制場景。通用定時器?:集成輸入捕獲、輸出比較、單脈沖模式等基礎(chǔ)功能?。 系統(tǒng)定時器?:內(nèi)置64位SysTick(MTIME)
    的頭像 發(fā)表于 04-27 13:54 ?821次閱讀