[英]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);
}
}
所以我正在做我提取參考手冊的步驟:
我不確定為什么中斷不能正常工作,是否有設置它的步驟,我錯過了?
編輯:我剛剛注意到一些奇怪的事情,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.