NXP BLE QN902x 之GPIO 控制
0赞一款新的MCU最先使用的一般都是GPIO,下面让我们来看看QN9021的GPIO如何使用。在\FireBLE\Driver\gpio 目录里有GPIO的例子。
在第一篇博客里介绍了使用UART下载程序的方法,但是在实际调试中使用SWD接口更方面一点,Firefly开发板上留出了SWD接口:
我们只需要外部连接一个Jlink就可以在线调试了。
大家如果遇到Jlink连接不成功的问题,可以参考:http://developer.t-firefly.com/forum.php?mod=viewthread&tid=1653&highlight=Jlink
具体原因是:P0_6 和P0_7 脚之前被复用成了其他功能,所以SWD功能无法使用。
解决办法很简单:
重新用串口烧写一个把P0_6 和P0_7 用作SWD接口的程序就可以了。
GPIO例子就是把P0_6 和P0_7 复用成SWD功能的。
static void SystemIOCfg(void) { // pin mux syscon_SetPMCR0(QN_SYSCON, P00_GPIO_0_PIN_CTRL | P01_GPIO_1_PIN_CTRL | P02_GPIO_2_PIN_CTRL | P03_GPIO_3_PIN_CTRL | P04_GPIO_4_PIN_CTRL | P05_GPIO_5_PIN_CTRL | P06_SW_DAT_PIN_CTRL | P07_SW_CLK_PIN_CTRL
我这里把它的bin文件放在这里了,如果遇到Jlink无法连接的情况可以用UART重写烧写下程序。
如果烧写了这个程序还是无法正常连接的话,那么就得仔细检查下硬件是否连接正确了。
在GPIO的例程中,默认有以下宏定义:
#define GPIO_INTERRUPT_EXAMPLE FALSE #define GPIO_INPUT_EXAMPLE FALSE #define GPIO_OUTPUT_EXAMPLE TRUE
它演示的是GPIO输出的功能,使用和学习其他功能打开相应宏就可以。
具体代码我就不一一解释了,下面让我们来实现一个最简单的功能:点亮和熄灭板子上的LED1灯。 首先查看原理图,LED1灯使用的管脚是P2_7
此引脚对应GPIO23
设置输入输出可以调用gpio_set_direction_field或者gpio_set_direction函数,
gpio_set_direction(GPIO_P27, GPIO_OUTPUT);
或者
gpio_set_direction_field(GPIO_P01 | GPIO_P02, (uint32_t)GPIO_OUTPUT);
如果要点亮LED1的话可以调用以下函数:
gpio_write_pin(GPIO_P27, GPIO_LOW);
或者
gpio_write_pin_field(GPIO_PIN_ALL, ~(0x1<<23));
关于GPIO的相关接口函数可以参考Docs 文件夹下的QN9020 API Programming Guide v1.1.pdf
P.s 代码和资料 我上传到Github上了:https://github.com/Wangwenxue/Firefly-BLE
补充一点:刚开始必须要调用
/* Initialize GPIO (sets up clock) */
gpio_init(NULL);
这个初始化函数,GPIO才可以正常工作。
GPIO做输入的话:
gpio_pull_set(GPIO_P14, GPIO_PULL_UP);
gpio_set_direction(GPIO_P14, GPIO_INPUT);
gpio_set_interrupt(GPIO_P14, GPIO_INT_RISING_EDGE);
gpio_enable_interrupt(GPIO_P14);
/* read P1.4 input level*/
result_level = gpio_read_pin(GPIO_P14);