之前分别尝试了LED、SENSOR、BLE程序,今天来试了下GPIO中断程序,也就是按键程序。
源码位置:samples\basic\button,查看Makefile文件,默认开发板是nucleo_f103rb,执行make编译程序。
因为我的是一个精简的STM32F103开发板,除了电源、时钟、LED、USB外无任何其它外设,只是把所有能够使用的GPIO全部通过排针的形式引出来了,所以要看要下源码找出使用的是哪个GPIO引脚作为按键,main.c中定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/* change this to use another GPIO port */
#ifdef SW0_GPIO_NAME
#define PORT SW0_GPIO_NAME
#else
#error SW0_GPIO_NAME needs to be set in board.h
#endif
/* change this to use another GPIO pin */
#ifdef SW0_GPIO_PIN
#define PIN SW0_GPIO_PIN
#else
#error SW0_GPIO_PIN needs to be set in board.h
#endif
/* change to use another GPIO pin interrupt config */
#ifdef SW0_GPIO_INT_CONF
#define EDGE SW0_GPIO_INT_CONF
#else
/*
* If SW0_GPIO_INT_CONF not defined used default EDGE value.
* Change this to use a different interrupt trigger
*/
#define EDGE (GPIO_INT_EDGE | GPIO_INT_ACTIVE_LOW)
#endif
|
在boards\arm\nucleo_f103rb\board.h中定义如下:
|
/* USER push button */
#define USER_PB_GPIO_PORT "GPIOC"
#define USER_PB_GPIO_PIN 13
/* Create aliases to make the basic samples work */
#define SW0_GPIO_NAME USER_PB_GPIO_PORT
#define SW0_GPIO_PIN USER_PB_GPIO_PIN
|
从以上代码可以看出按键是GPIOC13,下降沿触发,将我的开发板接一个外部按键到GPIOC13和GND,烧录zephyr.bin,复位运行后出现了奇怪的现象,中断信息“Button pressed at….”并不是在我每次按下按键的时候输出的,而是当我手每次触碰相关引脚后就重复输出,而我按下按键后会停止输出。
这个现象很明显是PIN脚电平波动引起的,而程序未设置上拉导致即使没有将GPIOC13与地短路也会有中断产生,再次查看main.c
|
/* change this to enable pull-up/pull-down */
#define PULL_UP 0
|
而在gpio.h中,上拉是如下定义的
|
#define GPIO_PUD_POS 8
/** Enable GPIO pin pull-up. */
#define GPIO_PUD_PULL_UP (1 << GPIO_PUD_POS)
|
可以看到代码中未并设置内部上拉,而我的开发板上也没有外部上拉电阻,修改定义
|
#define PULL_UP GPIO_PUD_PULL_UP
|
重新编译、烧录后验证功能正常。
分析代码之所以PULL_UP为0估计是nucleo_f103rb开发板的相应引脚有外部上拉电阻,到ST官网下载原理图后果然验证了我的猜测,如图:
然后又修改代码测试了上升沿和下降沿都触发中断,且在callback函数中读取PIN脚状态是按下还是释放。
至此按键程序测试完成,虽然目前只测试了几个小程序,但是已经能够感受到Zephyr的易用性,后续会针对目前所做的程序验证做一个简单的总结。