功能:软件中断实现LED每隔2s翻转一次
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
EXTI_HandleTypeDef hexti;
EXTI_ConfigTypeDef pExtiConfig;
pExtiConfig.Line = EXTI_LINE_0;
pExtiConfig.Mode = EXTI_MODE_INTERRUPT;
HAL_EXTI_SetConfigLine(&hexti, &pExtiConfig);
HAL_NVIC_SetPriority(EXTI0_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
HAL_Delay(2000);
HAL_EXTI_GenerateSWI(&hexti);
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
或者可以用void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti)处理中断
void Hexti_PendingCallback(void)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
}
EXTI_HandleTypeDef hexti;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
EXTI_ConfigTypeDef pExtiConfig;
pExtiConfig.Line = EXTI_LINE_0;
pExtiConfig.Mode = EXTI_MODE_INTERRUPT;
HAL_EXTI_SetConfigLine(&hexti, &pExtiConfig);
HAL_EXTI_RegisterCallback(&hexti, HAL_EXTI_COMMON_CB_ID, Hexti_PendingCallback);
HAL_NVIC_SetPriority(EXTI0_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
while (1)
{
HAL_Delay(2000);
HAL_EXTI_GenerateSWI(&hexti);
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void EXTI0_IRQHandler(void)
{
HAL_EXTI_IRQHandler(&hexti);
}
|