Arm STM32F10X定时器

Arm STM32F10X定时器,arm,interrupt,stm32,cortex-m3,Arm,Interrupt,Stm32,Cortex M3,我的stm32f10控制器出现计时器中断问题。 当我启用计时器计数器时,状态寄存器设置为 0x1F,因为设置了以下标志:UIF、CC1IF、CC2IF、CC3IF、CC4IF 以下是我所做的: #include <Compiler.h> #include <Debug.h> #include <STM32F10xxx.h> #include <Reset.h> #include "Example.h" #include <HW_TIM.h&

我的stm32f10控制器出现计时器中断问题。 当我启用计时器计数器时,状态寄存器设置为 0x1F,因为设置了以下标志:UIF、CC1IF、CC2IF、CC3IF、CC4IF

以下是我所做的:

#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); }
#包括
#包括
#包括
#包括
#包括“Example.h”
#包括
#包括
#包括
#包括
无符号volatile int sr=0;
静态void SetBASEPRI(单词const basepriVal){
寄存器字basepriReg_uuasm(“basepri”);
basepriReg=basepriVal;
}
静态无效SetCONTROL(WORD const controlVal){
寄存器字controlReg__asm(“控制”);
controlReg=controlVal;
}
静态void MainInit(void){
STM32F10xxx_Config();
SetBASEPRI(0U);
可外围(RCC_TIM2);
设置索引位(TIM、2、DIER、UIE);
设置索引位(TIM,2,DIER,CC1IE);
设置索引位(TIM,2,DIER,CC2IE);
设置索引位(TIM、2、DIER、CC3IE);
设置索引位(TIM,2,DIER,CC4IE);
中断启用(NVIC_TIM2);
设置控制(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;
设置索引位(TIM,2,CR1,CEN);
}
__declspec(noreturn)int main(){
MainInit();
timInit();
而(1),;
}
无效IRQ_TIM2(无效){
//删除SR中的IFs
//试图通过读取寄存器来清除SR
sr=TIM2.sr;
sr=获取索引位(TIM,2,sr,UIF);
//试图通过重置单个位来清除SR
RES_RBINDEX_REG_位(TIM、2、SR、CC1IF);
RES_RBINDEX_REG_位(TIM、2、SR、CC2IF);
RES_RBINDEX_REG_位(TIM、2、SR、CC3IF);
RES_RBINDEX_REG_位(TIM、2、SR、CC4IF);
RES_RBINDEX_REG_位(TIM、2、SR、UIF);
//正在尝试将0分配给SR以清除SR
TIM2.SR=0;
}
无效IRQ_系统(无效){
}
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)时,所有标志都被设置。我不能在子程序中删除它们。

回答有点晚,但今天我遇到了一个类似的问题,我认为这可以帮助其他人。首先,我怀疑问题在于是否设置了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
}