[单片机芯片] CH32V003简单介绍EXIT并配置PD0测试EXIT0

[复制链接]
1753|0
 楼主| lilijin1995 发表于 2022-10-23 11:58 | 显示全部楼层 |阅读模式
本帖最后由 lilijin1995 于 2022-10-23 12:00 编辑

#申请原创#
@21小跑堂



3.4 Eg4_EXTI
这一节,我们将向大家介绍如何使用 CH32V003的外部输入中断。在前面几节的学习中,我们掌握了 CH32V003的 IO 口最基本的操作。本节我们将介绍如何将 CH32V003的 IO 口作为外部中断输入;
这一节的代码主要分布在固件库的 ch32v00x_exti.h 和 ch32v00x_exti.c 文件中。这里我们首先 CH32V003IO 口中断的一些基础概念。CH32V003的每个 IO 都可以作为外部中断的中断输入口,这点也是 CH32V003的强大之处。CH32V003的中断控制器支持9个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。CH32V003的9 个外部中断为:线 0~7:Px0~Px7(x=A/C/D),任何一个 IO 口都可以启用外部中断/事件功能,由 AFIO_EXTICRx 寄存器配置。线 8:PVD 事件,超出电压监控阀值线 9:自动唤醒事件。
3.4.1硬件设计:
本节配置PD0作为测试EXIT0的IO口;
1966993-20221015152112367-79777915.png
3.4.2 软件设计:
本节的代码设计,主要在我们的MyBSP目录下的EXIT.c中先介绍 EXIT_Init函数,该函数代码如下:
  1. void EXIT_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStructure = {0};
  4.     EXTI_InitTypeDef EXTI_InitStructure = {0};
  5.     NVIC_InitTypeDef NVIC_InitStructure = {0};

  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);

  7.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  8.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  9.     GPIO_Init(GPIOD, &GPIO_InitStructure);

  10.     /* GPIOA ----> EXTI_Line0 */
  11.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource0);
  12.     EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  13.     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  14.     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  15.     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  16.     EXTI_Init(&EXTI_InitStructure);

  17.     NVIC_InitStructure.NVIC_IRQChannel = EXTI7_0_IRQn;
  18.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  19.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  20.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  21.     NVIC_Init(&NVIC_InitStructure);

  22. }


最后是中断请求函数声明和进入中断的处理
  1. void EXTI7_0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

  2. /*********************************************************************
  3. * @fn      EXTI0_IRQHandler
  4. *
  5. * [url=home.php?mod=space&uid=247401]@brief[/url]   This function handles EXTI0 Handler.
  6. *
  7. * [url=home.php?mod=space&uid=266161]@return[/url]  none
  8. */
  9. void EXTI7_0_IRQHandler(void)
  10. {
  11.   if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  12.   {
  13.     printf("Run at EXTI\r\n");
  14.     EXTI_ClearITPendingBit(EXTI_Line0);     /* Clear Flag */
  15.   }
  16. }


这里打印提示进入了中断,也就是下降沿触发了,否则回到main函数的while循环;
3.4.3 下载验证:
打开串口调试助手可以看到,“Run at main”提示,拉低PD0后,“Run at EXTI”
file:///C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20221023110722940.png?lastModify=1666496354
image-20221023110722940.png
3.4.4 学习视频:

CH32V003简单介绍EXIT并配置PD0测试EXIT0:



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

本版积分规则

56

主题

165

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部