本篇主要分为4部分:硬件分析、软件编程、演示效果和附录(GPIO接口)
1 硬件分析
在【FireBLE试用体验】环境篇(2)认识硬件开发环境 曾分析过FireBLE原理图,具体LED电路如下图所示,板上设计了3个LED灯,分别对应QN9021的P2_7、P0_6和P0_7,即可以通过控制对应引脚输出高低电平来控制LED的状态。
但需要说明2点:
(1)SWD接口的管脚线与LED3/LED4是复用,而系统默认是将P0_6和P0_7设置为SWD工作模式,所以如果使用该两脚控制LED,需要重新将其设置为GPIO工作模式,具体引脚功能如下表所示:
P0_7
0:SWD
1:Led
0: SWCLK (I):Default to SWCLK
(input with pull-up)
1: P0_7 (I/O):GPIO
2: AIN3 (AI):ADC input channel
3
3: ACMP1- (AI):Analog
comparator 1 negative input
P0_6
0:SWD
1:Led
0: SWDIO (I/O):Default to SWDIO
(input with pull-up)
1: P0_6 (I/O):GPIO
2: AIN2 (AI):ADC input channel
2
3: ACMP1+ (AI):Analog
comparator 1 positive input
(2)其实红色LED对应P0_7,绿色对应P0_6,蓝色对应P2_7
2 软件编程
(1)LED初始化
void LED_Init(void) { gpio_clock_on(); //启动GPIO时钟 gpio_pull_set(GPIO_P06,GPIO_PULL_UP); //由于引脚低电平有效,故设置为上拉械 gpio_pull_set(GPIO_P07,GPIO_PULL_UP); gpio_pull_set(GPIO_P27,GPIO_PULL_UP);; gpio_set_direction_field(GPIO_P27, (uint32_t)GPIO_OUTPUT); //设置为输出 gpio_set_direction_field(GPIO_P07, (uint32_t)GPIO_OUTPUT); gpio_set_direction_field(GPIO_P06, (uint32_t)GPIO_OUTPUT); gpio_write_pin_field(GPIO_P06,(uint32_t)GPIO_HIGH);//默认为高电平,即LED处于灭状态 gpio_write_pin_field(GPIO_P27,(uint32_t)GPIO_HIGH); gpio_write_pin_field(GPIO_P07,(uint32_t)GPIO_HIGH); }(2)控制LED的状态
void LED_Red(LedStatus status) { if(ON==status) //如果设置LED为点亮状态 { gpio_write_pin_field(GPIO_P07,GPIO_LOW); //则输出低电平 } else { gpio_write_pin_field(GPIO_P07,(uint32_t)GPIO_HIGH); } } void LED_Green(LedStatus status) { if(ON==status) { gpio_write_pin_field(GPIO_P06,GPIO_LOW); } else { gpio_write_pin_field(GPIO_P06,(uint32_t)GPIO_HIGH); } } void LED_Blue(LedStatus status) { if(ON==status) { gpio_write_pin_field(GPIO_P27,GPIO_LOW); } else { gpio_write_pin_field(GPIO_P27,(uint32_t)GPIO_HIGH); } }
(3)测试LED,该函数直接由main函数调用
void TestLed(void) { SystemInit();//系统初始化 GPIOReConfig();//重新配置P0_6和P0_7为GPIO工作模式 LED_Init(); //LED初始化 while(1) //每隔5ms,LED依次按照红、绿、蓝的顺序处于点亮状态 { LED_Red(ON); LED_Green(OFF); LED_Blue(OFF); delay(500000); LED_Red(OFF); LED_Green(ON); LED_Blue(OFF); delay(500000); LED_Red(OFF); LED_Green(OFF); LED_Blue(ON); delay(500000); } }3 演示效果
附录:GPIO驱动接口
extern void gpio_init(gpio_callback_t p_callback); extern enum gpio_level gpio_read_pin(enum gpio_pin pin); extern void gpio_write_pin(enum gpio_pin pin, enum gpio_level level); extern void gpio_set_direction(enum gpio_pin pin, enum gpio_direction direction); extern uint32_t gpio_read_pin_field(uint32_t pin_mask); extern void gpio_write_pin_field(uint32_t pin_mask, uint32_t level_value); extern void gpio_set_direction_field(uint32_t pin_mask, uint32_t direction_value); extern void gpio_toggle_pin(enum gpio_pin pin); extern void gpio_set_interrupt(enum gpio_pin pin, enum gpio_int_trig_type trig_type); extern void gpio_enable_interrupt(enum gpio_pin pin); extern void gpio_disable_interrupt(enum gpio_pin pin); extern void gpio_pull_set(enum gpio_pin pin, enum gpio_pull pull_state); extern void gpio_wakeup_config(enum gpio_pin pin, enum gpio_wakeup_type type); extern bool gpio_sleep_allowed(void);