“NRF52832DK基础实验”的版本间的差异
(03_key按钮中断) |
(→实验现象) |
||
第106行: | 第106行: | ||
# 按下SW2,LED2亮;释放SW2,LED2灭 | # 按下SW2,LED2亮;释放SW2,LED2灭 | ||
# 按下SW3,LED3亮;释放SW3,LED3灭 | # 按下SW3,LED3亮;释放SW3,LED3灭 | ||
− | # | + | # 按下SW3,LED4亮;释放SW4,LED4灭 |
+ | |||
+ | === 03_按键中断输入实验(int) === | ||
+ | 02_按键输入实验是采用轮询方式不断查询引脚电平状态。引脚默认为高电平,当按下按键后,引脚会变成低电平。而此实验将使用nRF52832的GPIOTE边沿中断方式来监测按键动作。中断方式监测按键,带来了高灵敏性,主要原因是按键按下会产生电平抖动,为此要加入消抖。由02的原理图中可以见,没有硬件上的消抖,所以只能在驱动程序上进行消抖操作。 |
2019年6月27日 (四) 17:01的版本
nRF52832是Nordic公司推出一款高性能无线SOC芯片,在芯片上可以运行多种协议栈,包括蓝牙BLE,NFC,ANT,802.15.4G,其中BLE协议栈可以支持到BLE5.0。为此谷雨物联推出一款基于nRF52832芯片评估板,nRF52832DK。
nRF52832DK评估板上设计了丰富实用的外围设备。其中有4路LED,4路按键输入,一路MINI usb转UART,三路PWM RGB灯珠,一路有源蜂鸣器,一路光敏,一路振动马达,TFT显示器接口,NFC标签接口。
目录
1 nRF52832DK基础实验说明列表
方便开发者,更快,更容易上手nRF52832芯片的外设操作,为此我们提供和整理nRF52832DK外围电路实验说明。见下表所示。
实验名称 | 实验所需外设 | 实验简单说明 |
---|---|---|
01_LED亮灭实验 | GPIO | 熟悉GPIO操作 |
02_按键输入实验(poll) | GPIO | 熟悉GPIO操作 |
03_按键输入实验(int) | GPIO边沿中断 | 熟悉GPIO边沿中断 |
2 01_LED亮灭实验
LED亮灭实验是展示nRF52832的GPIO输出配置,使开发者更直观的了解GPIO输出。GPIO输出是熟悉一款MCU的开始。下面将简单的介绍并分析相关代码。在NRF52832DK评估板上有4路LED资源,分别处在PIN17,PIN18,PIN19,PIN20四个引脚上。LED电路原理图,如下图所示。其为低电平有效,即引脚为低电平时LED被点亮,引脚为高电平时LED熄灭。
2.1 代码分析
开发者打开谷雨物联提供的peripheral_ghostyu文件夹中01_led_blinkly工程(IAR工程)。
在IAR的Workspace中点开Application,双击main.c文件,打开main.c。
1 int main(void)
2 {
3 /* Configure board. */
4 bsp_board_init(BSP_INIT_LEDS);
5
6 /* Toggle LEDs. */
7 while (true)
8 {
9 for (int i = 0; i < LEDS_NUMBER; i++)
10 {
11 bsp_board_led_invert(i); //翻转LED状态
12 nrf_delay_ms(500); //延时500ms
13 }
14 }
15 }
其中bsp_board_init函数用于初始化LED引脚。BSP_INIT_LEDS常量表示初始化板级资源。除了BSP_INIT_LEDS之外还有BSP_INIT_BUTTONS。
1 #define BSP_INIT_NONE 0 /**< No initialization of LEDs or buttons (@ref bsp_board_init).*/
2 #define BSP_INIT_LEDS (1 << 0) /**< Enable LEDs during initialization (@ref bsp_board_init).*/
3 #define BSP_INIT_BUTTONS (1 << 1) /**< Enable buttons during initialization (@ref bsp_board_init).*/
在bsp_board_init内部根据BSP_INIT_LEDS常量,将调用bsp_board_leds_init函数。将LED引脚配置成输出模式。而低下最终是调用nrf_gpio_cfg函数,来配置引脚。
完成LED引脚配置,进入while循环。在循环中遍历所有的LED引脚,翻转引脚高低电平,达到闪烁的目的。nrf_delay_ms函数用于软件延时。bsp_board_led_invert对引脚电平进行翻转。在bsp_board_led_invert内部调用了nrf_gpio_pin_toggle,参数是LED引脚。在nrf_gpio_pin_toggle内部,先读取引脚当前的高低电平状态,然后根据返回的状态进行取反,再设置OUT寄存器。
2.2 实验现象
硬件准备:
- Jlink-Lite仿真器或J-Link仿真器
- NRF52832DK评估板
编译工程,点击IAR IDE工具栏中绿色三角仿真按钮,IAR便会将程序下载到nRF52832中,点击全速运行即可。此时NRF52832的LED便会每500ms依次点亮LED;当四个LED全部点亮后,再以500ms依次熄灭LED,直到全部熄灭。
3 02_按键输入实验(poll)
01_LED亮灭实验是操作GPIO引脚输出,而本实验是操作GPIO的输入。利用GPIO输入引脚电平变化,来监测按键按下动作。在NRF52832DE评估板上,提供了四路按键资源,分别占用PIN13,PIN14,PIN15,PIN16四个引脚上。按键电路原理图,如下图所示。由原理图可知,按键是低电平有效。当按键按下引脚为低电平,释放时会高电平。注,按键引脚必须要使能引脚上拉功能,否则可能告成按键识别不可靠。
3.1 代码分析
开发者打开谷雨物联提供的peripheral_ghostyu文件夹中02_key_press工程(IAR工程)。
在IAR的Workspace中点开Application,双击main.c文件,打开main.c。
1 int main(void)
2 {
3
4 bsp_board_init(BSP_INIT_LEDS|BSP_INIT_BUTTONS); //配置按键与LED
5
6 while (true)
7 {
8 //轮询按键引脚电平变化
9 for (int i = 0; i < BUTTONS_NUMBER; i++)
10 {
11 if(bsp_board_button_state_get(i))
12 {
13 //按钮按下,点亮相应LED
14 bsp_board_led_on(i);
15 }
16 else
17 {
18 //按键释放,熄灭LED
19 bsp_board_led_off(i);
20 }
21 }
22 nrf_delay_ms(100); //延时100ms
23 }
24 }
在bsp_board_init函数中,根据传入的BSP_INIT_LEDS和BSP_INIT_BUTTONS,将初始化NRF52832DK评估板LED与按键。其中LED将GPIO引脚初始化为输出,按键初始化上拉输入。此实验中只是用GPIO输入,所以只能采用轮询的方式,周期性查询按键引脚电平状态。当按键按下,bsp_board_button_state_get函数返回true,否则返回false。
为增加互动性,将用4个LED分别指示4个按键状态。按键按下点亮LED,按键释放熄灭LED。其代码实现如while中的for循环。bsp_board_led_on点亮指定LED,bsp_board_led_off熄灭LED。
3.2 实验现象
硬件准备:
- Jlink-Lite仿真器或J-Link仿真器
- NRF52832DK评估板
编译工程,点击IAR IDE工具栏中绿色三角仿真按钮,IAR便会将程序下载到nRF52832中,点击全速运行即可。此时NRF52832的LED是全灭状态。
- 按下SW1,LED1亮;释放SW1,LED1灭
- 按下SW2,LED2亮;释放SW2,LED2灭
- 按下SW3,LED3亮;释放SW3,LED3灭
- 按下SW3,LED4亮;释放SW4,LED4灭
4 03_按键中断输入实验(int)
02_按键输入实验是采用轮询方式不断查询引脚电平状态。引脚默认为高电平,当按下按键后,引脚会变成低电平。而此实验将使用nRF52832的GPIOTE边沿中断方式来监测按键动作。中断方式监测按键,带来了高灵敏性,主要原因是按键按下会产生电平抖动,为此要加入消抖。由02的原理图中可以见,没有硬件上的消抖,所以只能在驱动程序上进行消抖操作。