打印
[RISC-V MCU 应用开发]

【RISC-V MCU CH32V103测评】使用EXIT中断

[复制链接]
822|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

RISC-V MCU CH32V103,外部中断测试。

如果想使用外部中断必须要进行必要的设置。如何设置呢?这是个很头疼的问题,因为手册里没有详细的说明,那没设么好办法只好分析例程啦。手册上只说

“芯片的外部中断/事件控制器(EXTI) 有20 个边沿检测器,用于产生中断/事件请求。每个中断线都可以独立地 配置其触发事件(上升沿或下降沿或双边沿),并能够单独地被屏蔽;挂起寄存器维持所有中断请求状 态。EXTI 可以检测到脉冲宽度小于内部 APB2 的时钟周期。多达 51 个通用 I/O 口都可选择连接到 16 个 外部中断线。”

那我的理解就是说有20个事件源,51个通用GPIO可以链接到这些中断源啦。

  • void EXTI0_INT_INIT(void)
  • {
  •   GPIO_InitTypeDef  GPIO_InitStructure;
  •         EXTI_InitTypeDef EXTI_InitStructure;
  •         NVIC_InitTypeDef NVIC_InitStructure;
  •   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
  •         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  •   GPIO_Init(GPIOA, &GPIO_InitStructure);
  •    /* GPIOA ----> EXTI_Line0 */
  •   GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  •   EXTI_InitStructure.EXTI_Line=EXTI_Line0;
  •   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  •   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  •   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  •   EXTI_Init(&EXTI_InitStructure);
  •         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  •   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  •   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  •   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  •   NVIC_Init(&NVIC_InitStructure);
  • }

首先定义三个结构,

  •   GPIO_InitTypeDef  GPIO_InitStructure;//GPIO数据结构
  •   EXTI_InitTypeDef EXTI_InitStructure;//外部事件中断结构
  •   NVIC_InitTypeDef NVIC_InitStructure;//中断管理器结构

本实验初始化步骤

1、GPIO定义为输入模式

2、EXIT管理器的EXTI_Line0号中断探测器定义为下降沿触发,并打开该功能,且允许中断。将EXTI_Line0和GPIO_PinSource0链接。

    不着急,到这里还不能中断呢!这只是把线和中断探测器链接上(这里比较模糊的是GPIO_PinSource0这个参数,这是具体的一根引脚吗?

3、初始化中断优先级管理器NVIC,将中断源EXTI0_IRQn启动,主优先级设置为1,次优先级为2。

  好了这就可以启动中断了。接下来就是编写中断服务程序了

4、中断服务程序。这个需要在ch32v10x_it.c这个文件中编写,虽然不是必须在此,但是这里比较好管理。

  • void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
  • /*******************************************************************************
  • * Function Name  : EXTI0_IRQHandler
  • * Description    : This function handles EXTI0 Handler.
  • * Input          : None
  • * Return         : None
  • *******************************************************************************/
  • void EXTI0_IRQHandler(void)
  • {
  •   if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  •   {
  •     printf("Run at EXTI\r\n");
  •     EXTI_ClearITPendingBit(EXTI_Line0);     /* Clear Flag */
  •   }
  • }

注意EXTI0_IRQHandler这个名字不要随便该,因为链接程序会找不到了。

到此中断就算完成了。

只要在main函数中调用一下初始化程序就可以中断了。


使用特权

评论回复

相关帖子

沙发
xdqfc| | 2021-1-28 11:16 | 只看该作者
点赞

使用特权

评论回复
板凳
发呆二极管| | 2021-2-3 07:02 | 只看该作者
wch给的文档资料和例程都太少了……最近我也是在中断上卡住了,还挺头疼的,PFIC中断也只有两级嵌套,这也太少了……

使用特权

评论回复
地板
xdqfc| | 2021-2-4 11:12 | 只看该作者
发呆二极管 发表于 2021-2-3 07:02
wch给的文档资料和例程都太少了……最近我也是在中断上卡住了,还挺头疼的,PFIC中断也只有两级嵌套,这也 ...

有两级嵌套,大部分项目购用了,我还以为是一级嵌套的呢,文档没有仔细的看,GD32VF103连中断嵌套都没有,那才是骚设计呢。

使用特权

评论回复
5
xdqfc| | 2021-2-4 11:37 | 只看该作者
xdqfc 发表于 2021-2-4 11:12
有两级嵌套,大部分项目购用了,我还以为是一级嵌套的呢,文档没有仔细的看,GD32VF103连中断嵌套都没有 ...

看文档,只能抢占一次,还不就是一级嵌套嘛。被搞糊涂了。

使用特权

评论回复
6
发呆二极管| | 2021-2-5 08:10 | 只看该作者
xdqfc 发表于 2021-2-4 11:37
看文档,只能抢占一次,还不就是一级嵌套嘛。被搞糊涂了。

可能这个说法是有争议的吧~
反正文档上写的可以嵌套数是2,这个2是对应的cortex-m系列的16级中断嵌套。
你说的抢占一次是说的只能低级中断被高级抢占的意思吧~那要是按照这个说法,cortex-m是15级嵌套了
不过不是什么大问题,只是说法不一样,大家的意思是一样的。只是我是习惯说2级嵌套,把低级中断也算进去了。毕竟按照手册的说法来不容易产生歧义。

使用特权

评论回复
7
MianQi| | 2021-2-10 11:03 | 只看该作者
不是EXTI吗,怎么成了EXIT?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2039

主题

7368

帖子

10

粉丝