wuyage

NXP BLE QN902x 之GPIO 控制

0
阅读(4259)

一款新的MCU最先使用的一般都是GPIO,下面让我们来看看QN9021的GPIO如何使用。在\FireBLE\Driver\gpio 目录里有GPIO的例子。

在第一篇博客里介绍了使用UART下载程序的方法,但是在实际调试中使用SWD接口更方面一点,Firefly开发板上留出了SWD接口:

SWD~~.jpg

我们只需要外部连接一个Jlink就可以在线调试了。

大家如果遇到Jlink连接不成功的问题,可以参考:http://developer.t-firefly.com/forum.php?mod=viewthread&tid=1653&highlight=Jlink 

具体原因是:P0_6 和P0_7 脚之前被复用成了其他功能,所以SWD功能无法使用。

4444.jpg
解决办法很简单:

重新用串口烧写一个把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 bin .rar

如果烧写了这个程序还是无法正常连接的话,那么就得仔细检查下硬件是否连接正确了。


在GPIO的例程中,默认有以下宏定义:

#define GPIO_INTERRUPT_EXAMPLE      FALSE
#define GPIO_INPUT_EXAMPLE          FALSE
#define GPIO_OUTPUT_EXAMPLE         TRUE

它演示的是GPIO输出的功能,使用和学习其他功能打开相应宏就可以。

具体代码我就不一一解释了,下面让我们来实现一个最简单的功能:点亮和熄灭板子上的LED1灯。 首先查看原理图,LED1灯使用的管脚是P2_7

LED1.jpg


此引脚对应GPIO23


270.jpg

设置输入输出可以调用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);