gpt4 book ai didi

c - STM32F429 外部中断边沿

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

我正在使用 STM32F429I-Discovery 板,该板有一个连接到 PA0 的按钮,而 PA0 又连接到外部中断线 0 (EXTI0)。

使用 HAL 库,我可以使用外部中断在下降沿或上升沿切换 LED。例如,LED 要么在我按下按钮后立即改变状态,要么在我松开按钮后才改变状态。

我想做的是在上升沿中断,启动定时器,然后再次在下降沿中断,停止定时器。我不知道如何实现这一点?

还有一个选项可以在上升沿和下降沿触发。我不知道是否应该只有一个中断,然后我弄清楚它是上升沿还是下降沿(可能通过直接访问寄存器),或者是否应该有两个配置的中断 - 一个作为上升沿,一个作为下降沿边缘?

下面是外部中断代码;首先将 GPIO 设置为外部中断,然后检测中断,然后处理中断(回调)。

    static void EXTILine0_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Enable GPIOA clock */
__HAL_RCC_GPIOA_CLK_ENABLE();

/* Configure PA0 pin as input floating */
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_InitStructure.Pin = GPIO_PIN_0;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Enable and set EXTI Line0 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}


/* Clears the interrupt after calling this I think */
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(KEY_BUTTON_PIN);
}


/**
* @brief EXTI line detection callbacks
* @param GPIO_Pin: Specifies the pins connected EXTI line
* @retval None
*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == KEY_BUTTON_PIN)
{
/* Toggle LED3 */
BSP_LED_Toggle(LED3);
}
}

有人可以指出我如何实现这一目标吗?

最佳答案

你要找的是所谓的“输入捕获”,可以直接用定时器实现,不需要外部中断。在 STM32F429 上,PA0 内部映射到定时器 2 channel 1。

sConfigIC 结构负责处理与输入捕获相关的配置。

初始化看起来像这样:

/* TIM2 init function */
void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_IC_InitTypeDef sConfigIC;

/* Peripheral clock enable */
__TIM2_CLK_ENABLE();

/* Peripheral interrupt init*/
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM2_IRQn);

/**TIM2 GPIO Configuration
PA0/WKUP ------> TIM2_CH1
*/
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0xFFFFFFFF;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim2);

sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

HAL_TIM_IC_Init(&htim2);

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

/* Input capture stuff HERE
Change polarity as needed */
sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
sConfigIC.ICFilter = 0;
HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1);

}

还有中断函数:

/* IRQ */
void TIM2_IRQHandler(void)
{
// Check for interrupt flags here
}

在中断中,您必须检查 CC1IF 标志。计时器值存储在称为 CCR1 的捕获和比较寄存器中。

/编辑

不要忘记启动定时器和输入捕获 channel :

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

这会启用定时器、相应的输入捕获 channel 和中断。

关于c - STM32F429 外部中断边沿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35011016/

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