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

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

  6.     /* Enable ALL peripheral */
  7.     ald_cmu_perh_clock_config(ALD_CMU_PERH_ALL, ENABLE);
      接下来进行对应IO口的初始化:
  1. #define LED_PORT GPIOA
  2.     #define LED_PIN  ALD_GPIO_PIN_15
  3.    
  4.     ald_gpio_init_t gpio_init;

  5.     /* initialize the gpio_init */
  6.     memset(&gpio_init, 0x0, sizeof(gpio_init));
  7.     /* Initialize LED pin */
  8.     gpio_init.mode  = ALD_GPIO_MODE_OUTPUT;
  9.     gpio_init.od    = ALD_GPIO_PUSH_PULL;
  10.     gpio_init.pupd  = ALD_GPIO_FLOATING;
  11.     gpio_init.odrv  = ALD_GPIO_OUT_DRIVE_NORMAL;
  12.     gpio_init.flt   = ALD_GPIO_FILTER_DISABLE;
  13.     gpio_init.type  = ALD_GPIO_TYPE_CMOS;
  14.     gpio_init.func  = ALD_GPIO_FUNC_1;
  15.     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进行初始化:
  1.     #define KEY_PORT GPIOD
  2.     #define KEY_PIN  ALD_GPIO_PIN_2
  3.    
  4.     ald_gpio_init_t gpio_init;

  5.     /* Initialize KEY pin */
  6.     memset(&gpio_init, 0x0, sizeof(gpio_init)); /* initialize the gpio_init */
  7.     gpio_init.mode = ALD_GPIO_MODE_INPUT;
  8.     gpio_init.pupd = ALD_GPIO_FLOATING;
  9.     gpio_init.flt  = ALD_GPIO_FILTER_DISABLE;
  10.     gpio_init.type = ALD_GPIO_TYPE_CMOS;
  11.     gpio_init.func = ALD_GPIO_FUNC_1;
  12.     gpio_init.odrv = ALD_GPIO_OUT_DRIVE_NORMAL;
  13.     ald_gpio_init(KEY_PORT, KEY_PIN, &gpio_init);
      接下来进行外部中断的配置:
  1. ald_exti_init_t exti;
  2.     /* Initialize external interrupt */
  3.     exti.filter      = ENABLE;
  4.     exti.filter_time = 10;
  5.     ald_gpio_exti_init(KEY_PORT, KEY_PIN, &exti);

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

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

  5.     if (ald_gpio_exti_get_ie_status(KEY_PIN) && ald_gpio_exti_get_flag_status(KEY_PIN))
  6.     {
  7.         ald_gpio_exti_clear_flag_status(KEY_PIN);  /* clear exit2 interrupt flag */
  8.         ald_gpio_toggle_pin(LED_PORT, LED_PIN);    /* toggle LED pin */
  9.     }

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

  12.     return;
  13. }
      效果如下:
image.png