一、点灯
       点灯一般是我们接触一个新的开发板最早进行的操作,实际上就是GPIO的操作,本开发板移动有4个可控制LED(全部是红色的),原理图如下:
image.png

       我们以PA15对应的LED3为例进行测试,进行阻塞式的LED闪烁,首先配置时钟:
/* Initialize ALD */
  •     ald_cmu_init();
  •     /* Configure system clock */
  •     ald_cmu_pll_config(ALD_CMU_PLL_INPUT_HOSC8M, ALD_CMU_PLL_OUTPUT_72M);
  •     ald_cmu_clock_config(ALD_CMU_CLOCK_PLL, 72000000);

  •     /* Enable ALL peripheral */
  •     ald_cmu_perh_clock_config(ALD_CMU_PERH_ALL, ENABLE);
  • 复制代码
          接下来进行对应IO口的初始化:
    #define LED_PORT GPIOA
  •     #define LED_PIN  ALD_GPIO_PIN_15
  •    
  •     ald_gpio_init_t gpio_init;

  •     /* initialize the gpio_init */
  •     memset(&gpio_init, 0x0, sizeof(gpio_init));
  •     /* Initialize LED pin */
  •     gpio_init.mode  = ALD_GPIO_MODE_OUTPUT;
  •     gpio_init.od    = ALD_GPIO_PUSH_PULL;
  •     gpio_init.pupd  = ALD_GPIO_FLOATING;
  •     gpio_init.odrv  = ALD_GPIO_OUT_DRIVE_NORMAL;
  •     gpio_init.flt   = ALD_GPIO_FILTER_DISABLE;
  •     gpio_init.type  = ALD_GPIO_TYPE_CMOS;
  •     gpio_init.func  = ALD_GPIO_FUNC_1;
  •     ald_gpio_init(LED_PORT, LED_PIN, &gpio_init);
  • 复制代码
          相关的应用层的BSP是ald_gpio.c中,相关IO口的宏定义在ald_gpio.h中,以上的初始化可以看出IO配置的内容还是挺多的,不过我们主要关注的还是模式,类型上下拉情况这些基本内容,接下来就可以通过ald_gpio_write_pin();进行输出操作了。
    二、按键采集
           这里我们采用的是外部中断的方式进行按键采集,实际上也是GPIO的特殊特殊模式,我们通过对应按键的中断梳理函数实现LED3的翻转。我们看一下按键原理图:
    image.png

           采用的是一个五向按键,大大的节省了板载空间,以SW_MID为例,对应的引脚为PD2,首先对GPIO进行初始化:
        #define KEY_PORT GPIOD
  •     #define KEY_PIN  ALD_GPIO_PIN_2
  •    
  •     ald_gpio_init_t gpio_init;

  •     /* Initialize KEY pin */
  •     memset(&gpio_init, 0x0, sizeof(gpio_init)); /* initialize the gpio_init */
  •     gpio_init.mode = ALD_GPIO_MODE_INPUT;
  •     gpio_init.pupd = ALD_GPIO_FLOATING;
  •     gpio_init.flt  = ALD_GPIO_FILTER_DISABLE;
  •     gpio_init.type = ALD_GPIO_TYPE_CMOS;
  •     gpio_init.func = ALD_GPIO_FUNC_1;
  •     gpio_init.odrv = ALD_GPIO_OUT_DRIVE_NORMAL;
  •     ald_gpio_init(KEY_PORT, KEY_PIN, &gpio_init);
  • 复制代码
          接下来进行外部中断的配置:
    ald_exti_init_t exti;
  •     /* Initialize external interrupt */
  •     exti.filter      = ENABLE;
  •     exti.filter_time = 10;
  •     ald_gpio_exti_init(KEY_PORT, KEY_PIN, &exti);

  •     /* Configure interrupt */
  •     ald_gpio_exti_interrupt_config(KEY_PIN, ALD_EXTI_TRIGGER_RISING_EDGE, ENABLE);
  •     /* Clear interrupt flag */
  •     ald_gpio_exti_clear_flag_status(KEY_PIN);
  • 复制代码
          相关的中断配置函数依然在ald_gpio.c中,配置完了注意开启中断:
    ald_mcu_irq_config(EXTI0_3_IRQn, 4, ENABLE);
  •     __enable_irq();
  • 复制代码
          我们看一下中断函数分布:
    image.png

           对应的引脚使用相应的中断服务函数,接下来编写中断服务函数就可以了:
    void __attribute__((interrupt)) EXTI0_3_Handler(void)
  • {
  •     /* Nested IRQ start : Save CSR and enable global interrupt. */
  •     ALD_NEST_INT_START();

  •     if (ald_gpio_exti_get_ie_status(KEY_PIN) && ald_gpio_exti_get_flag_status(KEY_PIN))
  •     {
  •         ald_gpio_exti_clear_flag_status(KEY_PIN);  /* clear exit2 interrupt flag */
  •         ald_gpio_toggle_pin(LED_PORT, LED_PIN);    /* toggle LED pin */
  •     }

  •     /* Nested IRQ end : Restore CSR and disable global interrupt. */
  •     ALD_NEST_INT_END();

  •     return;
  • }
  • 复制代码
          效果如下:
    image.png