946|2

193

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

[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

 

此时你将无法再下载代码,断电重启无效。必须按照我上面说的重新下载恢复

 

 

 

如有错误欢迎各位大佬指正,谢谢

 

最新回复

水积分吗   详情 回复 发表于 2024-1-31 17:09
点赞 关注
 
 

回复
举报

193

帖子

4

TA的资源

纯净的硅(初级)

沙发
 
ozpin 发表于 2024-1-31 10:03 此时你再也无法烧录代码到当前的开发板内,你只能断电,并且取消跳线帽J27。 把开发板重新上电,然后下载程 ...

没有看明白,为什么复制我文章的内容

点评

水积分吗  详情 回复 发表于 2024-1-31 17:09
 
 
 

回复

41

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
御坂10032号 发表于 2024-1-31 15:30 没有看明白,为什么复制我文章的内容

水积分吗

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表