ST意法半导体
直播中

张昂笙

7年用户 1001经验值
私信 关注
[问答]

在定制的pcb上使用stm32l011K4U3微控制器,无法清除EXTI挂起寄存器怎么解决?

我无法清除 EXti 挂起寄存器,它始终保持高电平,可能这就是导致中断一次又一次触发的原因。我附上了代码片段。请帮助我找出问题所在。

  • #include "STM32l0xx.h"                  // Device header
  • #include "RTE_Components.h"             // Component selection
  • volatile int HPA,HPB,HPC,interrupt,interrupt1;
  • void clock_init(void);
  • void gpio_init(void);
  • void exti_interrupt_init(void);
  • int main(void){
  •         clock_init();
  •         gpio_init();
  • exti_interrupt_init();
  •         __enable_irq();
  •         while(1){
  •         //NOTHING TO DO
  •         }
  • }
  • void clock_init(void){
  •         RCC->APB1ENR|=RCC_APB1ENR_PWREN; //PWR clock enable
  •         PWR->CR=0x800;                                                                                //set vcore to 1.8V
  •         while((PWR->CSR & PWR_CSR_VOSF));                // wait till core voltage is setelled
  •         RCC->CR &=~(1<
  •         RCC->CSR&=~(1<        RCC->CR&=~(1<
  •         RCC->CR |= 1<        RCC->CFGR|=RCC_CFGR_PLLDIV2 | RCC_CFGR_SW_PLL | RCC_CFGR_PLLMUL4;//select pll as system clock, pllvco=hsi*6=16*6=96Mhz, core freq=pllvc0/plldiv=96Mhz/3=32Mhz
  •         RCC->CR|=RCC_CR_PLLON;        //enable pll
  •         while(!(RCC->CR & RCC_CR_PLLRDY));                // wait till pll is on
  •         //RCC->APB1ENR|=RCC_APB1ENR_TIM2EN | RCC_APB1ENR_I2C1EN |RCC_APB1ENR_LPTIM1EN |RCC_APB1ENR_USART2EN ;        //ENABLE clock for timer 2,i2c1
  •         RCC->APB2ENR=RCC_APB2ENR_SYSCFGEN;        //ENABLE clock for SYSCFGEN
  •         }
  •         void gpio_init(void){
  •         RCC->IOPENR |= 0b111;   //clk for portA,B,C
  •         /*hall sensor pins*/
  •         GPIOC->MODER &=~((0b11)<<28);        //PC14(HPC) AS INPUT
  • }
  • void exti_interrupt_init(void){
  •         SYSCFG->EXTICR[3]|=SYSCFG_EXTICR1_EXTI3_PC;
  •         EXTI->IMR|=1<        EXTI->RTSR|=1<        EXTI->FTSR|=1<        NVIC_EnableIRQ(EXTI4_15_IRQn);        //ENABLE IRQ4-15
  • }
  • void EXTI4_15_IRQHandler(void){
  •         interrupt++;        //        KEEP TRACK OF NUMBER OF INTERRUPTS
  •         if (EXTI->PR & (1<<14)) {                       // CLEAR PENDING INTERRUPT !!!!!!!! HERE IS THE ISSURE IT NEVER GETS CLEARED
  •     EXTI->PR = (1<<14);
  •         }
  •         HPC=(GPIOC->IDR & 0x8000);        //PC15
  •         HPB=(GPIOA->IDR & 0x0001);        //PA0
  •         HPA=(GPIOC->IDR & 0x4000);        //PC14
  • }






回帖(1)

陈炜

2023-1-10 09:26:18
尝试读取所有相关寄存器的内容(GPIOC、EXTI、SYSCFG),检查它们是否按照您的预期设置。
> SYSCFG->EXTICR[3]|=SYSCFG_EXTICR1_EXTI3_PC;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分