gpt4 book ai didi

c - 为什么这个函数不能正确地打开和关闭 LED?

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:25 24 4
gpt4 key购买 nike

我正在使用 Atmel SAM3x8E 微 Controller 并尝试在按下按钮时进行简单的 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 可能会多次打开/关闭并保持任意状态,这可能 - 碰巧 - 很远大多数时候。如果可用,请使用示波器检查。

这可以通过电容器在硬件中规避,或者在软件中使用定时器在对任何其他按钮事件使用react之前在相关边缘之后有死区时间来规避。死区时间取决于按钮的类型,但典型值为 5 到 20 毫秒,应在按钮的数据表中提及。如有疑问,请使用可接受的最高值。

关于c - 为什么这个函数不能正确地打开和关闭 LED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29871968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com