[英]STM32 Interrupt Handeling if condition
我如何通過以下代碼使用一個處理程序進行2次中斷:
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI0_PB | SYSCFG_EXTICR1_EXTI1_PC;
EXTI->IMR = EXTI_IMR_MR0 | EXTI_IMR_MR1;
EXTI->RTSR = EXTI_RTSR_TR0| EXTI_RTSR_TR1;
/* Configure NVIC for External Interrupt */
/* (6) Enable Interrupt on EXTI0_1 */
/* (7) Set priority for EXTI0_1 */
NVIC_EnableIRQ(EXTI0_1_IRQn); /* (6) */
NVIC_SetPriority(EXTI0_1_IRQn,0); /* (7) */
這是處理程序執行的代碼:
void EXTI0_1_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1) /* Check line 1 has triggered the IT */
{
EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */
GPIOC->ODR |= 1<<0;
}
if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0) /* Check line 0 has triggered the IT */
{
EXTI->PR = EXTI_PR_PR0; /* Clear the pending bit */
GPIOC->ODR &= ~(1<<0);
}
}
當我點擊連接到PC1的按鈕時,代碼工作正常,LED亮起,當我點擊連接到PB0的按鈕時,LED熄滅。 在我的if結構中,我檢查哪條線是活動的,但我也希望LED只通過點擊PC1而不是點擊第1行的另一個引腳而打開,對於第0行也是如此,但我不知道如何更改if結構的條件。
微控制器是STM32F091。
第二:不要將IRQ用於服務按鈕。 你必須實現反彈過濾器,最好的想法是由定時器檢查按鈕的引腳狀態。 人體反應約200ms,真正按下按鈕會產生持續時間為100-200ms的脈沖。 因此,對於每個按鈕,您需要12-24ms的定時器和RAM中的兩個字節...請參閱下面的代碼示例:
uint8_t btn_state = (uint8_t)0x0, btn_mask = (uint8_t)0x1; void some_tim_irq_handler(void) { if (GPIOC->IDR & (uint16_t)0x1) { // PC0 up btn_state |= btn_mask; } else { // PC0 down btn_state &= (uint8_t)~btn_mask; } btn_mask <<= (uint8_t)0x1; // mask cycle if (btn_state == (uint8_t)0x0) { // One state return; } if (btn_state == (uint8_t)0xFF) { // Second state } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.