STM32F401 中断请求问题

问题描述 投票:0回答:1

我有一个核子板,上面有一个按钮。该按钮连接到引脚 C13,按下它后,我应该停止 PWM 信号的处理。有人能指出我正确的方向吗?

这是定义中断及其行为的代码。

void INTERRUPT_CONFIG(){

    RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN;
    SYSCFG->EXTICR[2]|=(0x2<<SYSCFG_EXTICR1_EXTI1_Pos);
    EXTI->IMR|=(0x1<<EXTI_IMR_MR1_Pos);
    EXTI->RTSR|=(0x1<<EXTI_RTSR_TR13_Pos);
    EXTI->FTSR|=(0x0<<EXTI_FTSR_TR13_Pos);
    NVIC_SetPriority(EXTI1_IRQn,1);
    NVIC_EnableIRQ(EXTI1_IRQn);


}
bool flag=false;
void EXTI1_IRQHandler(){
    if(EXTI->PR & EXTI_PR_PR13_Pos){
        EXTI->PR|=(0x0<<EXTI_PR_PR13_Pos);
        flag=!flag;
    }
}

...这是主要功能:

int main(void)
{
  TIM2_INIT();
  //button is pc13
  INTERRUPT_CONFIG();
     EXTI1_IRQHandler();
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
    GPIOC->MODER |= ( 0x0 << GPIO_MODER_MODE13_Pos);
    GPIOC->PUPDR |= ( 0x1 << GPIO_PUPDR_PUPD13_Pos);//defining the Pin c13

  while (1)
  {
      if(flag==true){
          TIM2->CR1&=~(TIM_CR1_CEN);
      }
      else{
      int x;
          for(x=0; x<500; x=x+1)
          {
            TIM2->CCR1=x;
            delayFunct(1);
          }
          for(x=500; x>0; x=x-1)
          {
              TIM2->CCR1=x;
              delayFunct(1);
  }
}

我知道这个问题有点冗长,但仍然希望得到一些帮助。提前谢谢你们了。

到目前为止我已经搞乱了EXTI寄存器值的内容,但没有效果

c arm embedded stm32 bare-metal
1个回答
0
投票

先说一下,根据导师的建议,有些东西已经做了相当大的改变,比如IRQ中的逻辑,union的使用,希望你们 还是能看懂代码

void Interrupt_Init(void){
EXTI15_10_Init(); 
NVIC->IP[EXTI15_10_IRQn] =  (1 << 4);    
NVIC->ISER[40 >> 5] |= (1 << (40 % 32)); 
}

union InterruptFlag {
struct {
   volatile bool flag: 1; // Just one bit for our flag
   volatile bool press: 1;
} bits_access;
uint32_t reg; // We'll use this for byte access
};
volatile union InterruptFlag flag = { .bits_access.flag = 0 }; // 
Initialize 
to 0
volatile uint16_t pressTime;
volatile bool lastButtonPress=0;
volatile bool buttonPress=1;

void EXTI15_10_IRQHandler(void){
flag.bits_access.flag = !flag.bits_access.flag;
EXTI->PR |= (1<<13);  // Clear PR to re-enable EXTI interrupt

}

void clearIR(void){
flag.bits_access.flag = 0;
buttonPress=0;

}

现在main函数的新内容,函数的定义是一样的,只是while循环发生了变化; 而 (1) {

  int x;
      for(x=0; x<500; x++)
      {
          if(flag.bits_access.flag== 1){
                    x=x-1;
                    TIM2->CCR1=x;
              }
          else{
                    TIM2->CCR1=x;
                    delayTRIP(1);
          }}

      for(x=500; x>0; x--)
      {
          if(flag.bits_access.flag== 1){
                      x=x+1;
                      TIM2->CCR1=x;
                          }
          else{
                      TIM2->CCR1=x;
                      delayTRIP(1);
      }

  }
 }}
© www.soinside.com 2019 - 2024. All rights reserved.