A. 對STM32中斷的理解
第一:STM32的中斷類型分為兩種:搶占優先順序和響應優先順序。搶占優先順序決定了搶占行為,即當系統正在響應某中斷L的時候,如果來了搶占優先順序更高的異常H時,則H可以搶佔L。而當搶占優先順序相同的異常不止一個觸發時,則最先響應響應優先順序高的異常。如果搶占優先順序和響應優先順序都是相同的,則根據中斷在中斷向量表中的順序進行響應。
第二:在對中斷優先順序進行定義時需要明確兩個值。
STM32把指定中斷優先順序的寄存器位減少到4位(AIRCR高四位),這四個思存器的分組方式可以有五種:
第0組:所有4位用於指定響應優先順序
第1組:最高1位用於指定搶占式優先順序,最低3位用於指定響應優先順序
第2組:最高2位用於指定搶占式優先順序,最低2位用於指定響應優先順序
第3組:最高3位用於指定搶占式優先順序,最低1位用於指定響應優先順序
第4組:所有4位用於指定搶占式優先順序
可以通過調用STM32的固件庫中的函數NVIC_PriorityGroupConfig()選擇使用哪種優先順序分組方式,這個函數的參數有下列5種:
NVIC_PriorityGroup_0 => 選擇第0組
NVIC_PriorityGroup_1 => 選擇第1組
NVIC_PriorityGroup_2 => 選擇第2組
NVIC_PriorityGroup_3 => 選擇第3組
NVIC_PriorityGroup_4 => 選擇第4組
中斷優先順序分組只是為了給搶占式優先順序和響應優先順序在中斷優先順序寄存器的高四位分配各個優先順序數字所佔的位數。
針對第二個問題即單獨定義每個中斷源的中斷級別。
中斷源優先順序是在中斷優先順序寄存器中設置的,只能設置及高四位,必須根據中斷優先順序分組中設置好的位數來在該寄存器中設置相應的數值。假如你選擇中斷優先順序分組的第3組:最高3位用於指定搶占式優先順序,最低1位用於指定響應優先順序,那麼搶占式優先順序就有000-111共八種數據選擇,也就是有八個中斷嵌套,而響應優先順序中有0和1兩種,總共有8*2=16種優先順序。
在設置了中斷優先順序分組的情況下,可以在規定的位數內指定每個中斷源的搶占優先順序和響應優先順序。
參考
B. STM32單片機使用定時器中斷產生1khz的方波
STM32有硬體PWM功能,但應用比較復雜,我也剛學,不知是否能產生1KHZ
用時器中斷比較簡單,但你要知道要添加哪些頭文件
int main(void)
{
LED_GPIO_Config();/* led 埠配置,也就是配置哪個管腳輸出方波這里以LED代替,這可是最基本 的操作,方法略 */
TIM2_Configuration(); /* TIM2 定時配置 */
TIM2_NVIC_Configuration();/* 定時器的中斷優先順序配置 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); /* TIM2 重新開時鍾,開始計時 */
while(1);
}
void TIM2_NVIC_Configuration(void)();/* 定時器的中斷優先順序配置 */
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* 設置TIM2CLK 為 72MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
//TIM_DeInit(TIM2);
/* 自動重裝載寄存器周期的值(計數值) */
TIM_TimeBaseStructure.TIM_Period=1000; //這里改成500就是0.5ms中斷一次了
/* 累計 TIM_Period個頻率後產生一個更新或者中斷 */
/* 時鍾預分頻數為72 */
TIM_TimeBaseStructure.TIM_Prescaler= 71;
/* 對外部時鍾進行采樣的時鍾分頻,這里沒有用到 */
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , DISABLE); /*先關閉等待使用*/
中斷程序:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
LED1_TOGGLE; //對LED1管腳取反0.5ms一次
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
}
}
還是把GPIO配置也帖出來吧,這里是3個引腳接3個LED,你可以只設一個引腳就可以了
void LED_GPIO_Config(void)
{
/*定義一個GPIO_InitTypeDef類型的結構體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟LED的外設時鍾*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
/*選擇要控制的GPIOB引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*設置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調用庫函數,初始化GPIOB0*/
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*選擇要控制的引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 關閉所有led燈 */
GPIO_SetBits(GPIOB, GPIO_Pin_0);
/* 關閉所有led燈 */
GPIO_SetBits(GPIOC, GPIO_Pin_4|GPIO_Pin_3);
}
C. STM32單片機程序死機,有哪些原因引起
1、意外中斷。是否打開了某個中斷,但是沒有響應和清除中斷標志,導致程序一直進入中斷,造成死機假象。
2、中斷變數處理不妥。若定義某些會在中斷中修改的全局變數,這時要注意兩個問題:首先為了防止編譯器優化中斷變數,要在這些變數定義時前加volatile。
其次在主循環中讀取中斷變數前應該首先關閉全局中斷,防止讀到一半被中斷給修改了,讀完之後再打開全局中斷;否則出現造成數據亂套。
其他原因:
1、地址溢出。常見錯誤為指針操作錯誤。要著重說的是數組下標使用循環函數中循環變數,如果循環變數沒控制好則會出現數組下標越界,意外修改系統的寄存器造成死機,這種情況下如果死機說明運氣好,否則後面不知道發生什麼頭疼的事。
2、無條件的死循環。比如使用while(x);等待電平變化,正常情況下x都會變成0,就怕萬一,因此最好加上時間限制;
3、看門狗沒有關閉。有的單片機即使沒使用看門狗開機時也有可能意外自動開啟了最小周期的看門狗,導致軟體不斷復位,造成死機,這個要看晶元手冊,最好在程序復位後首先應該顯式清除看門狗再關閉看門狗;
4、堆棧溢出。最難查找的問題,對於容量小的單片機,盡量減少函數調用層級,減少局部變數,從而減少壓棧的時候所需的空間。當把以上幾條都試過不能解決問題,試一試把被調用少函數直接內置到調用的地方並且把佔用RAM大的局部變數改成全局變數。
D. STM32單片機的中斷種類有哪些
各種中斷啊,可以看你使用的什麼晶元啦,
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; External Line[15:10]s
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
DCD ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD CAN2_TX_IRQHandler ; CAN2 TX
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
DCD OTG_FS_IRQHandler ; USB OTG FS
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
不是所有的中斷都存在,需要看晶元的外設有哪些,M3可以支持好像是256個中斷的,上面列出的是stm32f407支持的中斷,字數太多刪減了一些。。。。。