点灯一般是我们接触一个新的开发板最早进行的操作,实际上就是GPIO的操作,本开发板移动有4个可控制LED(全部是红色的),原理图如下:
我们以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);
- #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);
二、按键采集
这里我们采用的是外部中断的方式进行按键采集,实际上也是GPIO的特殊特殊模式,我们通过对应按键的中断梳理函数实现LED3的翻转。我们看一下按键原理图:
采用的是一个五向按键,大大的节省了板载空间,以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_mcu_irq_config(EXTI0_3_IRQn, 4, ENABLE);
- __enable_irq();
对应的引脚使用相应的中断服务函数,接下来编写中断服务函数就可以了:
- 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;
- }