999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

STM32中SysTick延時中斷的優先級調整*

2017-04-14 09:42:36鄭忠楷蔣學程羅志灶
單片機與嵌入式系統應用 2017年3期
關鍵詞:單片機程序

鄭忠楷,蔣學程,羅志灶

(閩江學院 物理學與電子信息工程系,福州 350108)

STM32中SysTick延時中斷的優先級調整*

鄭忠楷,蔣學程,羅志灶

(閩江學院 物理學與電子信息工程系,福州 350108)

本文就STM32單片機的SysTick延時中斷及中斷處理中進行中斷優先級調整進行了一些討論,主要是在同時存在串口中斷時的情況下進行研究,并具體分析了一個Delay_us()庫函數和串行中斷響應的程序實例。在多個中斷并存的情況下,SysTick延時中斷的優先級直接影響中斷的CPU/系統資源占用和服務響應時間,因此對其研究很有必要。

SysTick中斷、中斷優先級、單片機、延時

引 言

自從ARM公司2007年首次推出Cortex內核,意法半導體公司推出了一款高性能的基于Cortex-M3內核的32位的STM32[1-3],其主頻可以達到72 MHz,有著十分方便易用的庫函數給用戶使用,但同時也帶來了許多意想不到的問題。比如說其中最常用到的SysTick延時中斷和與其相關的Delay_us()庫函數,在使用的時候就有很多需要注意的地方,不然有時會造成意外的錯誤,甚至有死機的可能。本文主要針對SysTick中斷在有串口中斷存在時如何調整二者優先級進行研究和討論。

1 STM32固件庫簡介

STM32固件庫是STM32庫函數集合的總稱,STM32固件庫可以從意法半導體官網下載。固件庫首先將MCU的各個設備中所有寄存器的配置字進行預先定義,然后封裝在對應的結構體或枚舉變量中,待用戶調用對應的固件庫函數時,會根據用戶傳入的參數從這些封裝好的結構體或枚舉變量中取出對應的配置字,最后寫入寄存器中,完成對底層寄存器的配置。采用固件庫形式,可以加速程序開發,用戶不必每個寄存器一個一個地細細分析,可直接面對程序功能的編寫程序。基于STM32的這個固件庫,程序員可以快速開發ARM微控制器,這個庫文件寫的非常齊全方便,可以讓程序員在外設的硬件配置上節省很多時間。但是程序員還是需要根據許多具體實際情況熟悉外設的硬件結構和寄存器結構功能來學習使用庫文件,而且要考慮具體使用時的軟件環境和對應版本,隨著硬件的更新升級,STM32固件庫也推出了2.02版、3.15版、3.5版等版本。

1.1 STM32 SysTick延時中斷簡介

幾乎每個版本中都有對應的SysTick延時中斷[4],它具有自動重載和溢出中斷的功能,所有基于Cortex-M3處理器的微控制器都可以由這個定時器獲得一定的時間間隔。采用SysTick延時中斷可以很容易地完成單片機系統的簡單延時、節拍確定,SysTick延時中斷實質上是對一個定時器的配置及其中斷函數的編寫,但是使用中有很多要注意的細節,在很多場合它被形象稱為“滴答定時器中斷”,因為它被直接用在軟件系統中提供節拍。在單任務的應用程序中,其程序架構決定了它執行任務的串行性,這就引出一個問題:當一個任務出現問題時,就會牽連到后續的任務,進而導致整個系統崩潰。要解決這個問題就要使用實時操作系統(RTOS),因為RTOS采用并行的任務架構,單一任務的崩潰并不會牽連到整個系統,但是RTOS的任務調度需要軟件系統為其提供一個節拍,這也就是SysTick延時中斷的重要性和“滴答定時器”名稱的由來。正因為此,在使用實時操作系統(RTOS)時為了保證任務調度的最高優先級,必須把SysTick延時中斷的優先級設置為最高。

1.2 Delay_us()庫函數簡介及其特點

即便在沒有采用實時操作系統(RTOS)的場合,程序依舊采用單任務串行架構,在一些簡單應用場合(比如控制LED的閃爍、鍵盤防抖等基本程序)還是要用到簡單的延時函數,這時其實就是讓CPU做一些簡單的無用工作,浪費一點CPU時間,等待外部中斷,等待一個確定的時間。這時如果用簡單的while()或者for()空循環,則不容易精確地控制時間的長短,STM32的固件庫非常體貼地給用戶提供了Delay_us()函數,這樣用戶可以方便地設計比較簡單準確的延時程序。

但是這個延時程序也是基于SysTick延時中斷的,仔細分析其庫函數源文件SysTick.C,不難發現其中Delay_us(__IO u32 nTime)函數中設置了一個名為TimingDelay的32位變量,再在SysTick延時中斷中將其遞減,然后又在Delay_us(__IO u32 nTime)中使用“while(TimingDelay !=0);”循環死等SysTick延時中斷,將其遞減為零。這里實際上留下了一個巨大的bug,如果有一個中斷的優先級比SysTick延時中斷高,打斷了SysTick延時中斷,則會導致SysTick延時中斷不能發生,系統就必然陷在while()循環中導致死機。若要避免出現這種情況,就必須保證SysTick延時中斷始終處在中斷優先級的最高一級,可以在每個時間片完成一次TimingDelay變量的遞減。

2 STM32系統的中斷優先級

幾乎所有的微處理器都具有中斷及響應、中斷處理的一套軟硬件設備和流程,為了實現多個中斷的響應,當然要對它們進行優先級劃分,STM32也不例外。STM32中的中斷優先級還有搶占優先級和響應優先級的區別[4],中斷搶占優先級是指當多個中斷同時發生時哪個中斷優先搶占資源,這里的資源指的是CPU處理時間和內存等資源。中斷響應優先級是指在相同的中斷搶占優先級中的優先級劃分,也就是說當多個搶占優先級中斷同時發生時,或者高優先級中斷結束后,同優先級的中斷中CPU優先處理哪個中斷。

在STM32中,可以人為地設定各個設備中斷的優先級,這樣就可以對它們的觸發、響應的優先級做出合理的規劃。同時,如果沒有合理的規劃好中斷優先級,很可能給單片機系統帶來不可預計的后果,也可能陷入不停地循環——遞歸的中斷調用中,甚至可能造成系統死機。前述的Delay_us()庫函數中的SysTick延時中斷被高一級中斷打斷之后進入死循環導致死機就是一個例子。

3 程序實例及其研究

3.1 實例程序分析

在一個簡單的單片機程序“串口接收數據-控制LED閃燈次數”中,要用到串口中斷和PC機通信以及Delay_us()函數完成LED閃燈延時,其中的Delay_us()函數就要用到SysTick中斷。最初,我們把Delay_us()函數簡單地寫在了串口中斷處理函數USARTx_IRQHandler()里,結果發現單片機常常意外死機。多次跟蹤調試后發現,只要進入USARTx_IRQHandler()中斷,延時程序Delay_us()函數就經常不再正常工作,LED也就不再繼續閃爍。可見在使用STM32時,不能像使用51單片機或者AVR單片機那樣用一個簡單使能中斷、禁止中斷指令來解決這個問題,問題的關鍵在于多個中斷之間的優先級調整來分配CPU資源。解決的辦法是,將SysTick中斷的搶占優先級設高,讓它能夠打斷USARTx中斷隨時獲得CPU資源,在一個系統中Delay_us()函數要完成最基本的延時功能,從前面對SysTick.C文件中它的分析可知,它往往需要獲得最高的中斷優先級才能保證不陷入“while(TimingDelay !=0);”死循環,因為SysTick中斷一旦被打斷,TimingDelay變量就不能完成遞減,“while(TimingDelay !=0);”死循環就會發生。

前述的LED閃燈程序死機,究其實質就是因為串口中斷USARTx服務子程序的優先級比SysTick中斷來的高,打斷了SysTick中斷,使得TimingDelay變量的遞減過程串口中斷USARTx服務子程序被破壞,所以在Delay_us()函數中發生了“while(TimingDelay !=0);”死循環,系統陷入了死機。

3.2 STM32的串口庫函數及其中斷設置

在STM32中有多個硬件串口設備可以訪問,因此當設置好串口設備的相應I/O口輸入/輸出特性后,在其硬件庫中可以直接調用串口發送函數USART_SendData(USARTx,data),將data發到串口USARTx,也可以在串口接收中斷函數USARTx_IRQHandler()里面寫下對應串口USARTx的接收中斷處理函數。但是,這里由于串口接收事件是被動的、未知的,所以我們采用了中斷的方式來完成,因此需要設置其對應的中斷優先級,具體代碼如下:

NVIC_SetPriority(SysTick_IRQn,0x00);

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;

//中斷搶占先等級1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

//中斷響應優先級2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

//打開中斷

NVIC_Init(&NVIC_InitStructure);

在這個程序實例中,用“NVIC_SetPriority(SysTick_IRQn,0x00);”將SysTick中斷的搶占優先級設置為0(最高),把“NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1”設置為次高(把串口中斷的搶占優先級設置為1),這樣既保證了SysTick中斷處于中斷優先級的最高一層不會被其他中斷打斷,Delay_us()函數不會進入死循環,又保證了串口函數的優先級為次高不被其他程序打斷,閃燈次數有著一定的實時性。

3.3 程序運行結果

經過以上優先級調整后,多次實驗結果表明:程序順利運行完成了PC上位機控制下位機完成LED閃燈次數的功能結果表明下位機沒有再次進入死循環。

結 語

[1] 張炳先,王密,潘俊.基于卡爾曼濾波的光學遙感影像高精度復原處理[J].武漢大學學報:信息科學版,2015,40(7):964-969.

[2] 劉軍.例說STM32[M].北京:北京航空航天大學出版社,2012.

[3] Texas Instruments.德州儀器高性能模擬器件高校應用指南,2014.

[4] JosephYiu.Coretex-M3權威指南[M]. 宋巖,譯.北京:北京航空航天大學出版社,2013.

Priority Adjustment of SysTick Delay Interrupt in STM32

Zheng Zhongkai,Jiang Xuecheng,Luo Zhizao

(Department of Physics&Electronic Information Engineering,Minjiang University,Fuzhou 350108,China)

In the paper,the interrupt priority adjustment of STM32 MCU’s SysTick delay interrupt and reponse is discussed,in the case that the serial port interrupt at the same time happen.The Delay_us() library functions and a serial interrupt response example are analyzed.In the case of themultiple interrupts coexistence,the priority of SysTick delay interrupt directly affects the CPU/system resource usage and the service response time,so it is necessary to study the system.

SysTick interrupt;interrupt priority;microcontroller;delay

福建省科技廳農業科技計劃重點項目(2013N0027) 蔬菜大棚的智能化改造;福建省教育廳青年教師培育計劃項目(JB12166) 分布式太陽能面板自動跟蹤伺服系統;福建省教育廳青年教師培育計劃項目(JA09186) 基于電流刺激模型的新型電刺激儀。

TP368.1

A

?迪娜

2016-11-21)

猜你喜歡
單片機程序
基于單片機的SPWM控制逆變器的設計與實現
電子制作(2019年13期)2020-01-14 03:15:28
基于單片機的層次漸變暖燈的研究
電子制作(2019年15期)2019-08-27 01:12:10
基于單片機的便捷式LCF測量儀
電子制作(2019年9期)2019-05-30 09:42:02
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
小議PLC與單片機之間的串行通信及應用
電子制作(2018年12期)2018-08-01 00:48:04
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
基于單片機的平衡控制系統設計
電子制作(2017年19期)2017-02-02 07:08:27
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 国产一区二区网站| 国产精品亚洲欧美日韩久久| 久久精品中文字幕免费| 久久亚洲日本不卡一区二区| 国产乱子伦视频在线播放| 久久人搡人人玩人妻精品一| 无遮挡国产高潮视频免费观看| 国产精品无码制服丝袜| 午夜天堂视频| 亚州AV秘 一区二区三区| 黑色丝袜高跟国产在线91| 国产精品久久久精品三级| 亚洲AⅤ无码国产精品| 亚洲欧洲日本在线| 国产精品私拍在线爆乳| 国产成人亚洲精品无码电影| 国产网站一区二区三区| 亚洲一区二区三区麻豆| 九九九久久国产精品| 日韩欧美国产成人| 国产精品欧美激情| 色综合热无码热国产| 狠狠综合久久| 国产亚洲一区二区三区在线| 丁香六月激情综合| 欧美a网站| 亚洲中文字幕国产av| 亚洲欧美日韩精品专区| 亚洲一区网站| 91视频青青草| 亚洲综合亚洲国产尤物| 亚洲无限乱码一二三四区| 美女免费黄网站| 亚洲日本在线免费观看| 天堂亚洲网| 中文字幕在线永久在线视频2020| 国产一区二区精品福利| 国产免费网址| 日韩中文精品亚洲第三区| 国产日本欧美亚洲精品视| 久久国产黑丝袜视频| 国产精欧美一区二区三区| 伊人无码视屏| 四虎永久免费地址| 四虎综合网| 亚洲免费毛片| 国产福利免费在线观看| 婷五月综合| 日本亚洲最大的色成网站www| 欧美一级一级做性视频| 91尤物国产尤物福利在线| 无码在线激情片| 国产JIZzJIzz视频全部免费| 欧美第一页在线| 亚洲欧洲自拍拍偷午夜色| 黄色成年视频| 欧美在线国产| 波多野结衣中文字幕一区二区| 97国产成人无码精品久久久| 国产成人无码Av在线播放无广告| 国产色婷婷视频在线观看| 88国产经典欧美一区二区三区| 亚洲国产高清精品线久久| 国产精品美人久久久久久AV| 国产亚洲美日韩AV中文字幕无码成人 | 呦视频在线一区二区三区| 亚洲首页在线观看| 国产福利微拍精品一区二区| 片在线无码观看| 国产99欧美精品久久精品久久| 亚洲最大综合网| 特级欧美视频aaaaaa| 国产香蕉一区二区在线网站| 五月丁香在线视频| 一级毛片基地| 久久婷婷色综合老司机 | 日韩小视频网站hq| 青青草国产免费国产| 欧美午夜在线播放| 免费福利视频网站| 天堂在线视频精品| 国产成人凹凸视频在线|