打印
[单片机芯片]

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

[复制链接]
1290|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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口;
3.4.2 软件设计:
本节的代码设计,主要在我们的MyBSP目录下的EXIT.c中先介绍 EXIT_Init函数,该函数代码如下:
void EXIT_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    EXTI_InitTypeDef EXTI_InitStructure = {0};
    NVIC_InitTypeDef NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD, ENABLE);

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

    /* GPIOA ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, 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 = EXTI7_0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

}


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

/*********************************************************************
* @fn      EXTI0_IRQHandler
*
* [url=home.php?mod=space&uid=247401]@brief[/url]   This function handles EXTI0 Handler.
*
* [url=home.php?mod=space&uid=266161]@return[/url]  none
*/
void EXTI7_0_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  {
    printf("Run at EXTI\r\n");
    EXTI_ClearITPendingBit(EXTI_Line0);     /* Clear Flag */
  }
}


这里打印提示进入了中断,也就是下降沿触发了,否则回到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

3.4.4 学习视频:

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



使用特权

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

本版积分规则

54

主题

162

帖子

7

粉丝