STM32的嵌套中斷系統NVIC和RCC詳細整理 用的是stm32f103的最新3.5的庫。
一、綜述:
1、STM32 (Cortex-M3) 中的優(yōu)先級概念
STM32(Cortex-M3)中有兩個優(yōu)先級的概念:搶占式優(yōu)先級和響應優(yōu)先級,也把響應優(yōu)先級稱作“亞優(yōu)先級”或“副優(yōu)先級”,每個中斷源都需要被指定這兩種優(yōu)先級。
1. 何為占先式優(yōu)先級(pre-emption priority)
高占先式優(yōu)先級的中斷事件會打斷當前的主程序/中斷程序運行—搶斷式優(yōu)先響應,俗稱中斷嵌套。
2. 何為副優(yōu)先級(subpriority)
在占先式優(yōu)先級相同的情況下,高副優(yōu)先級的中斷優(yōu)先被響應;
在占先式優(yōu)先級相同的情況下,如果有低副優(yōu)先級中斷正在執(zhí)行,高副優(yōu)先級的中斷要等待已被響應的低副優(yōu)先級中斷執(zhí)行結束后才能得到響應—非搶斷式響應(不能嵌套)。
3. 判斷中斷是否會被響應的依據
首先是占先式優(yōu)先級,其次是副優(yōu)先級;
占先式優(yōu)先級決定是否會有中斷嵌套;
Reset、NMI、Hard Fault 優(yōu)先級為負(高于普通中斷優(yōu)先級)且不可調整。
4. 優(yōu)先級沖突的處理
具有高搶占式優(yōu)先級的中斷可以在具有低搶占式優(yōu)先級的中斷處理過程中被響應,即中斷的嵌套,或者說高搶占式優(yōu)先級的中斷可以嵌套低搶占式優(yōu)先級的中斷。
當兩個中斷源的搶占式優(yōu)先級相同時,這兩個中斷將沒有嵌套關系,當一個中斷到來后,如果正在處理另一個中斷,這個后到來的中斷就要等到前一個中斷處理完之后才能被處理。如果這兩個中斷同時到達,則中斷控制器根據他們的響應優(yōu)先級高低來決定先處理哪一個;如果他們的搶占式優(yōu)先級和響應優(yōu)先級都相等,則根據他們在中斷表中的排位順序決定先處理哪一個。
5.Cortex-M3中對中斷優(yōu)先級的定義
既然每個中斷源都需要被指定這兩種優(yōu)先級,就需要有相應的寄存器位記錄每個中斷的優(yōu)先級;在Cortex-M3中定義了8個比特位用于設置中斷源的優(yōu)先級,這8個比特位可以有8種分配方式,如下:
所有8位用于指定響應優(yōu)先級
最高1位用于指定搶占式優(yōu)先級,最低7位用于指定響應優(yōu)先級
最高2位用于指定搶占式優(yōu)先級,最低6位用于指定響應優(yōu)先級
最高3位用于指定搶占式優(yōu)先級,最低5位用于指定響應優(yōu)先級
最高4位用于指定搶占式優(yōu)先級,最低4位用于指定響應優(yōu)先級
最高5位用于指定搶占式優(yōu)先級,最低3位用于指定響應優(yōu)先級
最高6位用于指定搶占式優(yōu)先級,最低2位用于指定響應優(yōu)先級
最高7位用于指定搶占式優(yōu)先級,最低1位用于指定響應優(yōu)先級
這就是優(yōu)先級分組的概念。
6.stm32中對中斷優(yōu)先級的定義
Cortex-M3允許具有較少中斷源時使用較少的寄存器位指定中斷源的優(yōu)先級,因此STM32把指定中斷優(yōu)先級的寄存器位減少到4位,這4個寄存器位的分組方式如下:
第0組:所有4位用于指定響應優(yōu)先級
第1組:最高1位用于指定搶占式優(yōu)先級,最低3位用于指定響應優(yōu)先級
第2組:最高2位用于指定搶占式優(yōu)先級,最低2位用于指定響應優(yōu)先級
第3組:最高3位用于指定搶占式優(yōu)先級,最低1位用于指定響應優(yōu)先級
第4組:所有4位用于指定搶占式優(yōu)先級
file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/03/clip_image001.jpg
AIRC(Application Interrupt and Reset Register)寄存器中有用于指定優(yōu)先級的 4bits。這4個bits用于分配preemption優(yōu)先級和sub優(yōu)先級,在STM32的固件庫中定義如下:
/*Preemption Priority Group */
#define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((u32)0x600) /* 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((u32)0x500) /* 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((u32)0x400) /* 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((u32)0x300) /* 4 bits for pre-emption priority
0 bits for subpriority */
可以通過調用STM32的固件庫中的函數NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級分組方式,這個函數的參數有下列5種:
NVIC_PriorityGroup_0=> 選擇第0組
NVIC_PriorityGroup_1 => 選擇第1組
NVIC_PriorityGroup_2 => 選擇第2組
NVIC_PriorityGroup_3 => 選擇第3組
NVIC_PriorityGroup_4 => 選擇第4組
接下來就是指定中斷源的優(yōu)先級,下面以一個簡單的例子說明如何指定中斷源的搶占式優(yōu)先級和響應優(yōu)先級:
// 選擇使用優(yōu)先級分組第1組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 定義NVIC的結構體變量
NVIC_InitTypeDef NVIC_InitStructure;
// 使能EXTI0 中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQ n ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定搶占式優(yōu)先級別1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定響應優(yōu)先級別0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中斷
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定搶占式優(yōu)先級別0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;// 指定響應優(yōu)先級別1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
-------------------------------------------------------------------------------
要注意的幾點是:
1. 如果指定的搶占式優(yōu)先級別或響應優(yōu)先級別超出了選定的優(yōu)先級分組所限定的范圍,將可能得到意想不到的結果;
2. 搶占式優(yōu)先級別相同的中斷源之間沒有嵌套關系;
3. 如果某個中斷源被指定為某個搶占式優(yōu)先級別,又沒有其它中斷源處于同一個搶占式優(yōu)先級別,則可以為這個中斷源指定任意有效的響應優(yōu)先級別。
2、開關總中斷
在STM32/Cortex-M3中是通過改變CPU的當前優(yōu)先級來允許或禁止中斷。
PRIMASK位:只允許NMI和hardfault異常,其他中斷/異常都被屏蔽(當前CPU優(yōu)先級=0)。
FAULTMASK位:只允許NMI,其他所有中斷/異常都被屏蔽(當前CPU優(yōu)先級=-1)。
在STM32固件庫中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定義了四個函數操作PRIMASK位和FAULTMASK位,改變CPU的當前優(yōu)先級,從而達到控制所有中斷的目的。
下面兩個函數等效于關閉總中斷:
voidNVIC_SETPRIMASK(void);
voidNVIC_SETFAULTMASK(void);
下面兩個函數等效于開放總中斷:
voidNVIC_RESETPRIMASK(void);
voidNVIC_RESETFAULTMASK(void);
上面兩組函數要成對使用,但不能交叉使用。
例如:
第一種方法:
NVIC_SETPRIMASK(); //關閉總中斷 ,只允許NMI和hard fault異常
NVIC_RESETPRIMASK();//開放總中斷
第二種方法:
NVIC_SETFAULTMASK(); //關閉總中斷 ,只允許NMI
NVIC_RESETFAULTMASK();//開放總中斷
常常使用:
NVIC_SETPRIMASK(); //Disable Interrupts
NVIC_RESETPRIMASK(); // Enable Interrupts
可以用:
#define CLI() __set_PRIMASK(1) //關閉總中斷
#define SEI() __set_PRIMASK(0) //打開總中斷
來實現開關總中斷的功能。
二、寄存器介紹:
1 、 在 core_cm3.h 中定義了:
…………………………
…………………………
…………………………
五、實例詳解
void NVIC_config()// 配置中斷
{
NVIC_InitTypeDef NVIC_InitStructure;
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 選擇中斷分組 1
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;// 選擇串口 1 中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;// 搶占式中斷優(yōu)先級設置為0
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 3;// 響應式中斷優(yōu)先級設置為3
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;// 使能中斷
NVIC_Init(&NVIC_InitStructure);
}
STM32的時鐘系統
本文檔由“~風中的葉~”整理;QQ:654705188
一、綜述:
1、時鐘源
在 STM32 中,一共有 5 個時鐘源,分別是 HSI 、 HSE 、 LSI 、 LSE 、 PLL 。
①HSI 是高速內部時鐘, RC 振蕩器,頻率為 8MHz ;
②HSE 是高速外部時鐘,可接石英 / 陶瓷諧振器,或者接外部時鐘源,頻率范圍是 4MHz –16MHz ;
③LSI 是低速內部時鐘, RC 振蕩器,頻率為 40KHz ;
④LSE 是低速外部時鐘,接頻率為 32.768KHz的石英晶體;
⑤PLL 為鎖相環(huán)倍頻輸出,嚴格的來說并不算一個獨立的時鐘源, PLL 的輸入可以接 HSI/2 、 HSE 或者 HSE/2 。PLL倍頻可選擇為 2– 16 倍,但是其輸出頻率最大不得超過 72MHz 。
其中, 40kHz 的 LSI 供獨立看門狗 IWDG 使用,另外它還可以被選擇為實時時鐘 RTC 的時鐘源。另外,實時時鐘 RTC 的時鐘源還可以選擇 LSE ,或者是 HSE 的 128 分頻。
STM32 中有一個全速功能的 USB 模塊,其串行接口引擎需要一個頻率為 48MHz 的時鐘源。該時鐘源只能從 PLL 端獲取,可以選擇為 1.5 分頻或者 1分頻,也就是,當需使用到 USB 模塊時, PLL 必須使能,并且時鐘配置為 48MHz 或 72MHz 。
另外 STM32 還可以選擇一個時鐘信號輸出到 MCO 腳 (PA.8) 上,可以選擇為 PLL 輸出的 2分頻、 HSI 、 HSE 或者系統時鐘。
系統時鐘 SYSCLK ,它是提供 STM32 中絕大部分部件工作的時鐘源。系統時鐘可以選擇為 PLL 輸出、 HSI 、 HSE 。系系統時鐘最大頻率為 72MHz ,它通過 AHB 分頻器分頻后送給各個模塊使用, AHB 分頻器可以選擇 1 、 2 、 4 、 8 、 16 、 64 、 128 、 256 、 512 分頻,AHB分頻器輸出的時鐘送給 5大模塊使用:
①送給 AHB 總線、內核、內存和 DMA 使用的 HCLK 時鐘;
②通過 8分頻后送給 Cortex 的系統定時器時鐘STCLK;
③直接送給 Cortex 的空閑運行時鐘 FCLK ;
④送給 APB1 分頻器。 APB1 分頻器可以選擇 1 、 2 、 4 、 8 、 16 分頻,其輸出一路供 APB1 外設使用( PCLK1 ,最大頻率 36MHz ),另一路送給定時器 (Timer)2 、3 、4 倍頻器使用。該倍頻器根據PCLK1的分頻值自動選擇 1或者 2倍頻,時鐘輸出供定時器 2、 3、 4使用。
⑤送給 APB2 分頻器。 APB2 分頻器可以選擇 1 、 2 、 4 、 8 、 16 分頻,其輸出一路供 APB2 外設使用( PCLK2 ,最大頻率 72MHz ),另外一路送給定時器 (Timer)1 倍頻使用。該倍頻器根據PCLK2的分頻值自動選擇1 或2 倍頻,時鐘輸出供定時器 1使用。另外 APB2 分頻器還有一路輸出供 ADC 分頻器使用,分頻后送給 ADC 模塊使用。 ADC 分頻器可選擇為 2 、 4 、 6 、 8 分頻。
需要注意的是定時器的倍頻器,當 APB 的分頻為 1 時,它的倍頻值為 1 ,否則它的倍頻值就為 2 。
file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg
2、APB1和APB2連接的模塊
①連接在 APB1( 低速外設 )上的設備有: 電源接口、備份接口、 CAN 、 USB 、 I2C1 、 I2C2 、 UART2 、 UART3 、 SPI2 、窗口看門狗、 Timer2 、 Timer3 、 Timer4 。 注意 USB模塊雖然需要一個單獨的48MHz的時鐘信號,但是它應該不是供USB模塊工作的時鐘,而只是提供給串行接口引擎(SIE)使用的時鐘。USB模塊的工作時鐘應該是由APB1提供的。
②連接在 APB2 (高速外設)上的設備有: UART1 、 SPI1 、 Timer1 、 ADC1 、 ADC2 、 GPIOx(PA~PE) 、第二功能IO 口。
file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg
二、寄存器介紹:
typedefstruct
{
__IO uint32_t CR;
__IO uint32_t CFGR;
__IO uint32_t CIR;
__IO uint32_t APB2RSTR;
__IO uint32_t APB1RSTR;
__IO uint32_t AHBENR;
__IO uint32_t APB2ENR;
__IO uint32_t APB1ENR;
__IO uint32_t BDCR;
__IO uint32_t CSR;
#ifdefSTM32F10X_CL
__IO uint32_t AHBRSTR;
__IO uint32_t CFGR2;
#endif /*STM32F10X_CL */
#if defined(STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined(STM32F10X_HD_VL)
uint32_t RESERVED0;
__IO uint32_t CFGR2;
#endif /*STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */
}RCC_TypeDef;
1、時鐘控制寄存器(RCC_CR):(復位值為0x0000 xx83,內部低速時鐘使能和就緒,內部時鐘校準)
主要功能:內外部高速時鐘的使能和就緒標志(含內部高速時鐘校準調整),外部高速時鐘旁路,時鐘安全系統CSS使能,PLL使能和PLL就緒標志。
2、時鐘配置寄存器(RCC_CFGR):(復位值為0x0000 0000)
主要功能:系統時鐘源切換及狀態(tài),AHB、APB1、APB2、ADC、USB預分頻,PLL輸入時鐘源選擇及HSE輸入PLL分頻選擇,PLL倍頻系數,MCO(PA8)引腳微控制器時鐘輸出。
3、時鐘中斷寄存器 (RCC_CIR):(復位值: 0x0000 0000)
主要功能:LSI、LSE、HIS、HSE、PLL就緒中斷標志,HSE時鐘失效導致時鐘安全系統中斷標志,LSI、LSE、HIS、HSE、PLL就緒中斷使能,清除LSI、LSE、HIS、HSE、PLL就緒中斷,清除時鐘安全系統中斷。
4、APB2外設復位寄存器 (RCC_APB2RSTR):(復位值: 0x0000 0000)
主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3復位。
5、APB1外設復位寄存器 (RCC_APB1RSTR) :(復位值: 0x0000 0000)
主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC復位。
6、AHB外設時鐘使能寄存器 (RCC_AHBENR) :(復位值: 0x0000 0014睡眠模式時SRAM、閃存接口 電路時鐘開啟)
主要功能:DMA1、DMA2、SRAM、FLITF、CRC、FSMC、SDIO時鐘使能。
7、APB2外設時鐘使能寄存器(RCC_APB2ENR) :(復位值: 0x0000 0000)
主要功能:AFIO、IOPA、IOPB、IOPC、IOPD、IOPE、IOPF、IOPG、ADC1、ADC2、TIM1、SPI1、TIM8、USART1、ADC3時鐘使能。
8、APB1外設時鐘使能寄存器(RCC_APB1ENR) :(復位值: 0x0000 0000)
主要功能:TIM2、TIM3、TIM4、TIM5、TIM6、TIM7、WWDG、SPI2、SPI3、USART2、USART3、USART4、USART5、I2C1、I2C2、USB、CAN、BKP、PWR、DAC時鐘使能。
9、備份域控制寄存器 (RCC_BDCR) :(復位值: 0x0000 0000)
主要功能:外部低速振蕩器使能和就緒標志及旁路、RTC時鐘源選擇和時鐘使能、備份域軟件復位。
10、控制/狀態(tài)寄存器 (RCC_CSR) :(復位值: 0x0C00 0000 NRST引腳復位標志、上電/掉電復位標志)
主要功能:內部低速振蕩器就緒、清除復位標志、NRST引腳復位標志、上電/掉電復位標志、軟件復位標志、獨立看門狗復位標志、窗口看門狗復位標志、低功耗復位標志。
三、初始化設置
采用8MHz 外部HSE 時鐘,在 MDK 編譯平臺中,程序的時鐘設置參數流程如下:
將 RCC 寄存器重新設置為默認值:RCC_DeInit();
打開外部高速時鐘晶振 HSE : RCC_HSEConfig(RCC_HSE_ON);
等待外部高速時鐘晶振工作: HSEStartUpStatus= RCC_WaitForHSEStartUp();
設置 AHB 時鐘 (HCLK): RCC_HCLKConfig(RCC_SYSCLK_Div1);
上一篇:STM32的庫如何實現對同一組IO口的一部分引腳進行讀寫
下一篇:基于STM32的USB程序開發(fā)筆記(四)——USB設備的枚舉(上)
推薦閱讀
史海拾趣
在Auris公司的發(fā)展歷程中,2017年夏天的一次收購事件具有重要意義。Auris以8000萬美元的價格收購了Hansen Medical,這是一家專門開發(fā)工具來操控導管的公司。這次收購不僅增強了Auris在手術機器人領域的技術實力,也為其后續(xù)的產品研發(fā)和市場拓展提供了更多可能性。
在某一時期,MACOM宣布收購Applied Micro Circuits Corp.,這一舉動標志著公司在業(yè)務領域上的又一次重要擴張。收購完成后,MACOM迅速進行了業(yè)務分拆,將不感興趣的服務器芯片業(yè)務與自身的主營業(yè)務進行剝離。這一戰(zhàn)略調整使得MACOM能夠更專注于自身擅長的領域,同時也為被剝離的業(yè)務提供了更好的發(fā)展機會。
在電子行業(yè)中,產品質量是企業(yè)生存和發(fā)展的關鍵。成都成電硅海公司深知這一點,因此在生產過程中嚴格把控每一個環(huán)節(jié)。公司引進了先進的生產設備和技術,建立了完善的質量檢測體系。每一批產品出廠前都要經過嚴格的質量檢測,確保產品性能的穩(wěn)定和可靠。這種對品質的執(zhí)著追求,使得成都成電硅海公司的產品在市場上贏得了良好的口碑。
隨著市場競爭的加劇,Chip Supply Micro Devices意識到成本控制的重要性。公司開始著手優(yōu)化供應鏈管理,通過引入先進的生產管理系統和自動化設備,提高了生產效率,降低了生產成本。同時,公司還與供應商建立了長期穩(wěn)定的合作關系,確保了原材料的穩(wěn)定供應和優(yōu)質品質。這些措施使得Chip Supply Micro Devices在價格上具備了競爭優(yōu)勢,進一步提升了市場份額。
隨著電子技術的飛速發(fā)展,Comair不斷投入研發(fā),力求在技術上取得突破。在某次關鍵的技術研發(fā)中,公司成功開發(fā)出了一種新型高效風扇,其性能遠超當時市場上的同類產品。這一技術突破為Comair贏得了更多電子行業(yè)客戶的青睞,公司的市場份額也逐漸擴大。
Cristek Interconnects Inc公司自成立以來,一直致力于電子連接器技術的研發(fā)與創(chuàng)新。在早期的發(fā)展階段,公司憑借其出色的研發(fā)團隊,成功開發(fā)出一種新型的高性能連接器,這種連接器具有更高的導電性和更低的信號衰減,極大地提高了電子設備的性能。這一技術突破為公司贏得了市場的廣泛認可,也奠定了Cristek在電子行業(yè)中的重要地位。
PXA270核心板方案: CPU:PXA270 SDRAM:128M FLASH:32M 接口:USB、SDCARD、SERIAL等 LCD+TOUCH:3.5‘ 支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE ...… 查看全部問答∨ |
|
弄了一個導航儀,里面是WinCE 4.2的操作系統; 自己的EVC只有5.0的SDK ,想找個4.2的SDK,找了好久都找不到啊,怎么辦?。俊? 查看全部問答∨ |
畢設要做一個ARM終端采集靜態(tài)圖像壓縮后經GPRS模塊以彩信的方式發(fā)送到用戶手機,最近看了一些資料,懂了一點,但還是有很多不是很明白,望各位做過這方面的朋友多指點一下,謝謝了,呵呵 我現在能夠控制GPRS模塊撥號上網 ...… 查看全部問答∨ |
我有個客戶需要 在對倉庫的貨物掃描時能及時判斷是不是 正確。但是由于現在買的掃描槍 無法 于服務器上的數據庫交換數據,所以無法及時判斷。請哪位高手能幫忙給點建議, 能告訴我用什么樣的硬件 和 如何能夠無線 連接數據庫 & ...… 查看全部問答∨ |
三菱 PLC MX Component 編程 讀取塊的函數 readBlock(),在C# 中如何調用 三菱 PLC MX Component 編程 讀取塊的函數 readBlock(),在C# 中如何調用。 在三菱編程手冊上 有C++格式的函數的格式說明是 readBlock(string szdevice,int size,out lplData) C# 的沒有說明。對這個格式有點疑問   ...… 查看全部問答∨ |