CH32Vx 之GPIO实验

CH32Vx 之GPIO实验

  • 目录
    • 如何使用外部中断
    • GPIO如何使用
    • Main函数

目录

配合中断以及开发板的按钮实现LED的开灭,涉及知识点中断以及GPIO控制

如何使用外部中断

根据手册知识了解得到:

  1. 所有GPIO都可以被配置外部中断输入通道 ,但是一个中断通道只能对应一个GPIO;
  2. CH32V307有16个GPIO外部中断输入通道,但是 中断函数仅有7个
  3. 中断配置参考官方历程修改如下;
  4. 控制按钮对应的GPIO口为PB3,因此如下代码需要使能GPIOB,同时按钮是下降沿触发
void EXTI3_INT_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    EXTI_InitTypeDef EXTI_InitStructure = {0};
    NVIC_InitTypeDef NVIC_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* GPIOA ----> EXTI_Line0 */
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);
    EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    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 = EXTI3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

GPIO如何使用

根据官方例程. 我的开发板控制LED的GPIO口对应PA15

void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

Main函数

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    GPIO_Toggle_INIT();
    EXTI3_INT_INIT();
    while(1);
}

定义外部中断函数入口:
PB3 对应 EXIT3

void EXTI3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
volatile uint16_t LED_Status = 0; // 中断里使用的变量加 volatile 可当成全局变量
void EXTI3_IRQHandler(void)
{
   EXTI_ClearITPendingBit(EXTI_Line3);     /* Clear Flag */
   LED_Status = !LED_Status;
   GPIO_WriteBit(GPIOA, GPIO_Pin_15, LED_Status);
}

你可能感兴趣的:(单片机,c语言,risc-v)