簡體   English   中英

EXTI中斷被不停地拋出(stm32f1)

[英]EXTI Interrupt gets thrown non-stop (stm32f1)

我正在嘗試使用下降沿 EXTI 中斷簡單地關閉帶有按鈕的 LED。 不幸的是,LED 在沒有觸摸按鈕的情況下閃爍,使用 gdb 調試也顯示,ISR 被重復調用。 我之前測試過 LED(PA5)和按鈕(PC13:帶上拉電阻的輸入模式),它們的配置是正確的。

所以我認為EXTI中斷配置肯定有問題。

在使用以下函數調用main之前,在匯編中完成配置:

@ r0 = EXTI-line (0 .. 15)
@ r1 = Trigger Seleetion, LSBs (... : b1 : b0),
@        b0 = 1 -> Rising Trigger enabled, 
@        b1 = 1 -> Falling Trigger enabled 
.global  ConfigureEXTI
.type    ConfigureEXTI, %function
ConfigureEXTI:
   push  { r4, lr } 

   @ register value for bit $r0 in r4
   mov   r4, #1
   lsl   r4, r0
   ldr   r2, =EXTI

   ldr   r3, [r2, #EXTI_IMR]
   orr   r3, r4
   str   r3, [r2, #EXTI_IMR]

   tst   r1, #1
   ittt  ne 
   ldrne r3, [r2, #EXTI_RTSR]
   orrne r3, r4
   strne r3, [r2, #EXTI_RTSR]

   tst   r1, #2
   ittt  ne
   ldrne r3, [r2, #EXTI_FTSR]
   orrne r3, r4
   strne r3, [r2, #EXTI_FTSR]

   @ First 4 EXTI lines with own ISR
   cmp   r0, #4
   bhi   1f

   add   r0, #6
   b     2f
1: 
   cmp   r0, #9
   ite   ls 
   movls r0, #23     @ combined ISR for EXTI 5-9 (23) and EXTI 10-15 (40)
   movhi r0, #40
2:
   bl   EnableIRQ

   pop   { r4, pc }
.ltorg

EnableIRQ使用以下代碼啟用 NVIC_ISER1 寄存器中的中斷:

@ r0 = IRQ Number
.global  EnableIRQ
.type    EnableIRQ, %function
EnableIRQ:
   ldr   r1, =NVIC_ISER0

   movs  r2, #1
   and   r3, r0, #0x1f  @ r3 <- r0 mod 32
   lsls  r2, r2, r3

   @ calculating n = r0/32 to choose register NVIC_ISERn
   lsrs  r3, r0, #5
   lsls  r3, r3, #2

   str   r2, [r1, r3]

   bx    lr 
.ltorg

ConfigureEXTI從所謂Reset_Handler

Reset_Handler:
   @ ...
   mov   r0, #13
   mov   r1, #2
   bl    ConfigureEXTI

   b     main

main包含一個無限循環while(1) __WFI();

ISR 在 C 中實現:

void  EXTI15_10_IRQHandler(void)
{
   if((EXTI->PR & (1 << BUTTON_PIN)))
   {
      GPIOA->ODR ^= (1 << LED_PIN);  
      EXTI->PR |= (1 << BUTTON_PIN);
   }
}

所以我正在做我提取參考手冊的步驟:

  • 編程觸發寄存器 EXTI_RTSR 和 EXTI_FTSR
  • 在 EXTI_IMR 中啟用中斷請求
  • 在 NVIC 上配置中斷

我不確定為什么中斷不能正常工作,是否有設置它的步驟,我錯過了?

編輯:我剛剛注意到一些奇怪的事情,LED 閃爍僅在與 gdb 連接(通過 openocd)時發生,但如果我只是閃爍 .elf,LED 不會閃爍(但是按鈕不起作用)。 用於刷新/調試的命令:

$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program 
main.elf verify reset exit"

或調試

$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
$ arm-none-eabi-gdb main.elf
(gdb) target remote :3333

PC13:帶上拉電阻的輸入模式

不要使用內部上拉,這些(通常)電阻太高。 使用 1k-10k 范圍內的外部上拉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM