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

第八十一章、CH32V103应用教程——中断嵌套

[复制链接]
4328|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 RISCVLAR 于 2021-3-5 13:30 编辑

CH32V103应用教程——中断嵌套

本章教程主要在第四章EXTI基础上进行,主要进行两级中断嵌套测试实验。

1、EXTI简介及相关函数介绍
关于EXTI相关介绍,在前面章节已经进行过相关介绍,在此不再赘述。更多具体信息,可参考CH32V103应用手册。

2、硬件设计
本章教程主要进行两级中断嵌套测试,主要通过PA0、PA1引脚接地产生中断从而执行中断服务函数,连接方式如下:
  • 用杜邦线将PA0引脚与开发板GND引脚连接,产生中断之后拔下。
  • 用杜邦线将PA1引脚与开发板GND引脚连接,产生中断之后拔下。

3软件设计
本章教程主要进行两级中断嵌套测试,在前面第四章节基础上进行,具体程序如下:
exti.h文件
#ifndef  __EXTI_H
#define  __EXTI_H

#include "ch32v10x_conf.h"

void EXTI0_INT_INIT(void);

#endif
exti.h文件主要进行相关定义和函数声明;
exti.c文件
#include "exti.h"

void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void EXTI1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

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); //使能复用功能时钟和GPIOA时钟

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;       //配置GPIO引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;              //配置GPIO上拉输入模式
  GPIO_Init(GPIOA, &GPIO_InitStructure);                     //初始化GPIOA

   /* GPIOA ----> EXTI_Line0 */
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //指定中断/事件线的输入源,实际上是设定外部中断配置寄存器AFIO_EXTICRx的值,此处为PA0
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1);
  EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line1;        //EXTI中断/事件线选择,此处选择EXTI_Line0
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        //EXTI模式选择,此处选择为产生中断模式
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //EXTI边沿触发事件,此处选择为下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;                  //使能EXTI线
  EXTI_Init(&EXTI_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;           //使能EXTI0中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //设置抢占优先级为1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         //设置子优先级为1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);                            //中断优先级分组初始化

  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;           //使能EXTI0中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //设置抢占优先级为2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         //设置子优先级为1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);
}

void EXTI0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0)==SET)  //EXTI_GetITStatus用来获取中断标志位状态,如果EXTI线产生中断则返回SET,否则返回RESET
  {
    int i;
    Delay_Ms(1000);
    printf("Run at EXTI0\r\n");
    for(i=0;i<100;i++)
    {
        printf("%d\n",i);
        Delay_Ms(1000);
    }
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除中断标志位
  }
}

void EXTI1_IRQHandler(void)
{
  int i;
  if(EXTI_GetITStatus(EXTI_Line1)==SET)  //EXTI_GetITStatus用来获取中断标志位状态,如果EXTI线产生中断则返回SET,否则返回RESET
  {
    Delay_Ms(1000);
    printf("Run at EXTI1\r\n");
    for(i=100;i<1000;i++)
    {
        printf("%d\n",i);
        Delay_Ms(1000);
    }
    EXTI_ClearITPendingBit(EXTI_Line1);  //清除中断标志位
  }
}
exti.c文件与第四章exti.c文件类似,在此不再做具体介绍。
main.c文件
/********************************** (C) COPYRIGHT *******************************
* File Name          : main.c
* Author             : WCH
* Version            : V1.0.0
* Date               : 2020/10/22
* Description        : Main program body.
*******************************************************************************/
#include "debug.h"
#include "exti.h"

/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Return         : None
*******************************************************************************/
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
   
    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf("EXTI0 Test\r\n");
   
    EXTI0_INT_INIT();
    while(1)
    {
     Delay_Ms(1000);
     printf("Run at main\r\n");
    }
}
main.c文件主要进行函数初始化。

4下载验证
将编译好的程序下载到开发板并复位,打开串口调试助手,将PA0、PA1接地,可以看到EXTI0可以打断EXTI1的中断,而EXTI1不能打断EXTI0的中断,串口打印如下:

80、中断嵌套.rar

472.52 KB

使用特权

评论回复

相关帖子

沙发
jerow| | 2021-3-11 19:53 | 只看该作者
说实话虽然中断嵌套可以用但是一般人都不会中断嵌套的,大家都是根据它的优先级来调整

使用特权

评论回复
板凳
gejigeji521| | 2021-3-13 15:34 | 只看该作者
还没尝试过这种。

使用特权

评论回复
地板
jcky001| | 2021-3-16 14:32 | 只看该作者
坐沙发的说的很有道理哟

使用特权

评论回复
5
wwppd| | 2021-4-6 20:18 | 只看该作者
            

使用特权

评论回复
6
杨寅辉| | 2021-4-18 19:13 | 只看该作者
CH32V103支持几级的中断嵌套的呢?一般不会对他进行特别的配置,把显示或者定时器放到最高就好了。

使用特权

评论回复
评论
RISCVLAR 2021-4-19 13:34 回复TA
支持两级中断嵌套 
7
两只袜子| | 2021-4-19 09:41 | 只看该作者
感谢分享,学习一下

使用特权

评论回复
8
onlycook| | 2021-5-12 14:50 | 只看该作者
相当新鲜的教程

使用特权

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

本版积分规则

132

主题

293

帖子

41

粉丝