2015-02-10 29 views
0

我有一個關於我的stm32f10控制器的定時器中斷的問題。 當我啓用狀態寄存器設置爲 0x1F的,因爲以下標誌設置定時器的計數器:UIF,CC1IF,CC2IF,CC3IF,CC4IFSTM32F10X定時器

這裏是我做的:

#include <Compiler.h> 
#include <Debug.h> 
#include <STM32F10xxx.h> 

#include <Reset.h> 
#include "Example.h" 
#include <HW_TIM.h> 
#include <HW_NVIC.h> 
#include <HW_RCC.h> 
#include <RegBit.h> 

unsigned volatile int sr =0; 

static void SetBASEPRI(WORD const basepriVal) { 
    register WORD basepriReg __asm("basepri"); 

    basepriReg = basepriVal; 
} 

static void SetCONTROL(WORD const controlVal) { 
    register WORD controlReg __asm("control"); 

    controlReg = controlVal; 
} 

static void MainInit(void) { 
STM32F10xxx_Config(); 
SetBASEPRI(0U); 

PeripheryEnable(RCC_TIM2); 

SET_RBINDEX_REG_BIT(TIM, 2, DIER, UIE); 

SET_RBINDEX_REG_BIT(TIM, 2, DIER, CC1IE); 
SET_RBINDEX_REG_BIT(TIM, 2, DIER, CC2IE); 
SET_RBINDEX_REG_BIT(TIM, 2, DIER, CC3IE); 
SET_RBINDEX_REG_BIT(TIM, 2, DIER, CC4IE); 

InterruptEnable(NVIC_TIM2); 

SetCONTROL(1U); 
} 

void timInit(void){ 

TIM2.PSC = 0x0024; 
TIM2.ARR = 0xFFFF; 

TIM2.CCR[0] = 0x00FF; 
TIM2.CCR[1] = 0x0A00; 
TIM2.CCR[2] = 0x0F00; 
TIM2.CCR[3] = 0xF000; 

SET_RBINDEX_REG_BIT(TIM, 2, CR1, CEN); 

} 

__declspec(noreturn) int main() { 

    MainInit(); 

    timInit(); 

    while(1); 
} 

void IRQ_TIM2(void){ 
//Delet IFs in SR 
//trying to clear SR by reading the register 
sr = TIM2.SR; 
sr= GET_RBINDEX_REG_BIT(TIM,2,SR,UIF); 

//trying to clear SR by resetting the single bits 
RES_RBINDEX_REG_BIT(TIM, 2, SR, CC1IF); 
RES_RBINDEX_REG_BIT(TIM, 2, SR, CC2IF); 
RES_RBINDEX_REG_BIT(TIM, 2, SR, CC3IF); 
RES_RBINDEX_REG_BIT(TIM, 2, SR, CC4IF); 
RES_RBINDEX_REG_BIT(TIM, 2, SR, UIF); 

//trying to clear SR bei assigning 0 to SR 
TIM2.SR=0; 

} 

void IRQ_SysTick(void){ 
} 

void IRQ_HrdFault(void) { for (;;) DEBUG_BREAK(1); } 
void IRQ_UsgFault(void) { for (;;) DEBUG_BREAK(1); } 
void IRQ_BusFault(void) { for (;;) DEBUG_BREAK(1); } 
void IRQ_MemFault(void) { for (;;) DEBUG_BREAK(1); } 
void IRQ_NMI(void)  { for (;;) DEBUG_BREAK(1); } 

正如我所說的,問題在於,當計數器使能位(CEN)被置位時,所有的標誌都被置位。我不能在子程序中刪除它們。

回答

0

這有點晚,但我今天面對類似的問題,我認爲這可以幫助其他人。首先我懷疑問題是標誌UIF,CC1IF,CC2IF,CC3IF,CC4IF是否設置。如果您查閱第403頁的參考手冊,其中寫明這些標誌由硬件設置,因此當您重置硬件時(即使在調試時仍在運行)硬件會自動設置它們,您甚至不會注意到結果。如果你想看到用調試器清除標誌,我建議禁用定時器,然後執行一些操作。此外,它是檢查IRQ中的中斷源的推薦樣式:

//comment the next line before release 
#define DEBUG  
void IRQ_TIM2(void){ 
//disable the timer for debug purpose 
#ifdef DEBUG 
    TIM2->CR1 &= ~TIM_CR1_CEN; 
#endif 
//trying to clear SR by reading the register 
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { 

    TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //clearing UIF 
} 
if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { 
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //clearing CCIF 
} 
//etc... 
//enable the timer 
#ifdef DEBUG 
    TIM2->CR1 |= TIM_CR1_CEN; 
#endif 
}