[ACM32G103RCT6] 中断评测 及 BUG反馈
[复制链接]
本帖最后由 御坂10032号 于 2024-1-31 15:32 编辑
大家好,今天给大家带来ACM32G103RCT6的中断资源评测。
首先我们来看一下航芯提供的官方文档中的中断框图。
如上图所示,从左向右开始看,一共支持三种中断, 第一种是内部唤醒中断,第二种是停止中断,第三种就是我们常用的GPIO(中断线)
在通过边缘检测电路的时候,根据配置的上升沿或者下降沿寄存器,来检测端口电平的变化决定当前中断是否被触发。 之后经过一个逻辑或门,软件触发或者前三种中断触发都可以将中断信号传递到下一级电路。此时如果中断是一个普通的中断,比如说IO中断,那么将会进入上面的中断屏蔽寄存器处, 通过逻辑门与,来判断是否当前的中断被屏蔽掉了即不产生中断,或者是忽略当前的中断。如果当前的中断是没有被屏蔽了的情况即。中断屏蔽寄存器输出1, 中断输出1。 则会进到下一级电路。此时信号可以分为两个,第一个进入中断等待寄存器。来触发中断。第二个则进入选择器,来触发唤醒操作。
接着我们来看从第一个逻辑或门后的另一个电路。 首先如果这个中断是一个事件(event)中断, 那么当前的中断将会和事件屏蔽寄存器共同通过逻辑与门, 如果此时事件屏蔽寄存器输出1, 那么当前的事件中断信号将会走到下一级,来决定是执行唤醒或者是触发其他的事件。(此时事件屏蔽寄存器就类似开关的作用)
之后根据文档7.4外部中断及事件(EXTI)触发源我们可以找到ACM32G103RCT6支持的所有中断。(如下图所示)
上述文档还非常贴心的加上了对应中断的系统中断号。我们今天的测试Demo是航芯提供的官方demo exit 这一个章节。
首先,让我们来简单的解释一下demo中的代码,下图所示部分和中断无关,可以直接注释掉。
在 APP_Test function中, 我们可以看到这里初始化了一个LED,并且将其点亮。我们这里主要关注的是这个BSP_PB_Init function
我这里对核心代码加了注释:
/******************************************************************************
*[url=home.php?mod=space&uid=159083]@brief[/url] : PB init
*@param : none
*@return: none
******************************************************************************/
void BSP_PB_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//Open GPIOC clock
BSP_PB_CLK_ENABLE();
// init gpio pin 13
GPIO_InitStruct.Pin = BSP_PB_PIN;
// set the pin mode as GPIO_MODE_IT_FALLING
GPIO_InitStruct.Mode = BSP_PB_MODE;
// set pull up
GPIO_InitStruct.Pull = BSP_PB_PULL;
// set drive ability
GPIO_InitStruct.Drive = BSP_PB_DRIVE;
//set the gpio function as GPIO_FUNCTION_0
GPIO_InitStruct.Alternate = BSP_PB_ALTERNATE;
// init gpio
HAL_GPIO_Init(BSP_PB_GPIO, &GPIO_InitStruct);
// clear the pending bit
HAL_EXTI_ClearPending(BSP_PB_PIN);
// nciv clear pending bit
NVIC_ClearPendingIRQ(BSP_PB_IRQ);
// set it priority
NVIC_SetPriority(BSP_PB_IRQ, 0x00);
// enable it
NVIC_EnableIRQ(BSP_PB_IRQ);
}
总体意思是:
1-开启GPIOC时钟
2-设置GPIO pin 为13
3-设置GPIO的pin 模式为下降沿触发模式
4-设置PIN上拉
5-设置PIN驱动能力
6-设置PIN功能
7-初始化IO
8-清除中断等待位
9-清除中断向量控制请的中断等待位
10-设置当前io中断的优先级
11-开启中断
这里官方提供的代码可能有一点小问题,如果你正常烧录这个demo到你的开发板上。那么当你按下User Key的时候,开发板不会有任何操作,并不会退出停止状态。
此时你再也无法烧录代码到当前的开发板内,你只能断电,并且取消跳线帽JP7。 把开发板重新上电,然后下载程序,再接上跳线帽,然后按下reset,单片机才会正常工作。
所以让我们对这个代码做一点小小的修改来完成中断的demo示例。删除While内的所有代码。并且把这个代码烧录到你的单片机内。
那么具体的效果是什么呢 ,如下所示,当你按下user key的时候,led进行点亮或者熄灭。
7cb9c3d98b983aec92a4bd500e74ffd2
那么到底是怎么达成这个效果的呢,我们注意到在while循环内是空的,那么说单片机是一直在此循环。 其实答案就是上述定义的PIN13,当你按下的时候电平为低,然后触发了下降沿中断函数,在回调函数中进行了Led toggle操作。这个回调函数的定义可以在Hal_exit.c中找到
中断回调函数定义(需要用户自己实现)
到此为止,我们的中断实验已经做完。那么我们现在看下官方demo存在着什么问题
将官方demo烧录到单片机,打开串口助手并且reset 开发板
串口消息提示我们需要按下user key 来使单片机退出停止模式,可是当你按下后串口仍然无输出。
e216b8b66e1c1ec77598c94c1aebdf3b
此时你将无法再下载代码,断电重启无效。必须按照我上面说的重新下载恢复
如有错误欢迎各位大佬指正,谢谢
|