软件中断请求在逻辑上比较简单,但相关程序的解释比较少,本文将在第一部分进行讲解。硬件中断逻辑比较复杂,但网上的例程比较多。虽然我们知道怎么配置单片机的中断,但估计很多人对它的细节还不是很理解,我将在后半部分讲解,但不会涉及寄存器的操作,有关中断时的寄存器操作机理请见文献[2],我也将在后续博客中进行实例分析。
文中的例子是在STM32H743单片机下进行的。
目录
1 软件中断
在中断的软件触发上,Cortex-M7并没有发现和Cortex-M4或Cortex-M3有不同。
简单的说,就是使用下面三个函数,
NVIC_SetPendingIRQ(TIM2_IRQn);
__DSB();
__ISB();
但我在HAL_TIM_PeriodElapsedCallback()中的函数并没有因为我的软件触发中断而运行定时器2。但在TIM2_IRQHandler()中就能实现我需要的软件触发并打印"hello1"。这是因为HAL_TIM_IRQHandler()中去读了TIM2的中断状态寄存器,并以此来判断这次中断是有那个事件引起的,并执行相应的事件回调函数。因此想要用软件触发中断,那这个中断线上不要使能太多事件而让自己不知道该如何处理。
/**
* @brief Sets Pending bit of an external interrupt.
* @param IRQn External interrupt number
* This parameter can be an enumerator of IRQn_Type enumeration
* (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32h7xxxx.h))
* @retval None
*/
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
/* Check the parameters */
assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
/* Set interrupt pending */
NVIC_SetPendingIRQ(IRQn);
}
void TIM2_IRQHandler(void)
{
Debug_IT_Printf("hello1\r\n");
HAL_TIM_IRQHandler(&TIM2_Handler);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM2_Handler))
{
Debug_IT_Pr

本文深入探讨STM32H743单片机的软件和硬件中断机制,解析软件中断触发条件及注意事项,阐述硬件中断的使能、挂起与激活属性关系,以及中断清除和使能/禁止属性的交互作用。
最低0.47元/天 解锁文章
1634

被折叠的 条评论
为什么被折叠?



