【发布时间】:2015-04-25 23:40:22
【问题描述】:
我正在使用 Atmel SAM3x8E 微控制器,并尝试在按下按钮时进行简单的 LED 切换。我正在使用上拉配置按钮来触发中断程序。
这是中断的初始化:
// Set button pins as pull-up inputs
pio_set_input(PIOC, BUTTON_1, PIO_PULLUP);
pio_set_input(PIOC, BUTTON_2, PIO_PULLUP);
// Configure button input pin interrupt mode and handler (Rising Edge)
pio_handler_set(PIOC, ID_PIOC, BUTTON_1, PIO_IT_RISE_EDGE, button_press_handler);
pio_handler_set(PIOC, ID_PIOC, BUTTON_2, PIO_IT_RISE_EDGE, button_press_handler);
// Enable the interrupts
pio_enable_interrupt(PIOC, BUTTON_1);
pio_enable_interrupt(PIOC, BUTTON_2);
NVIC_EnableIRQ(PIOC_IRQn);
NVIC_EnableIRQ(PIOC_IRQn);
那么这是中断程序:
// Interrupt handler for button press
void button_press_handler(uint32_t a, uint32_t b)
{
pio_toggle_pin_group(PIOC, BLUE_LED4); // NOT TOGGLING LED (ONLY TURNS IT ON)
}
然而,当我运行它时,我无法让 LED 切换。它只是打开并保持打开状态。 pio_toggle_pin_group 调用的函数如下:
* \param p_pio Pointer to a PIO instance.
* \param ul_mask Bitmask of one or more pin(s) to configure.
*/
void pio_toggle_pin_group(Pio *p_pio, uint32_t ul_mask)
{
if (p_pio->PIO_ODSR & ul_mask) {
/* Value to be driven on the I/O line: 0. */
p_pio->PIO_CODR = ul_mask;
} else {
/* Value to be driven on the I/O line: 1. */
p_pio->PIO_SODR = ul_mask;
}
}
关于为什么我的 LED 没有按照我想要的方式切换有什么想法吗?我参考了Atmel ASF documentation,但我仍然无法弄清楚这一点。
【问题讨论】:
-
您是否检查过引脚是否实际更改了状态?中断真的被调用了吗?
-
是的,LED 最初设置为低,但是当我按下我的触觉按钮时,它会亮起,所以它一定是在调用中断。我可以通过在中断例程中更改它来打开已连接的任意数量的 LED (BLUE_LED1-4)。
标签: c interrupt gpio atmel atsam3x