2047|1

2933

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

【RISC-V MCU CH32V103测评】使用EXIT中断 [复制链接]

 

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函数中调用一下初始化程序就可以中断了。

点赞 关注
 
 

回复
举报

2933

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 
本帖最后由 bigbat 于 2021-1-23 17:32 编辑

目前的测试还算正常。

 

 

image.png (27.6 KB, 下载次数: 0)

image.png

image.png (27.73 KB, 下载次数: 0)

image.png
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表