SDK:nRF5_SDK_12.2.0

1. 概述

  实验一用于讲解 nRF52832 SDK v12.2.0 关于 LED 灯及 BUTTON 按键的板级支持函数及使用方法。利用板级支持函数可以控制在硬件上设置 LED 灯的有效状态(高电平亮还是低电平亮),在软件上配置 LED 的管脚和数量则可以方便地读取并设置 LED 的状态,达到快速开发的目的,BUTTON 按键与 LED 灯实现原理类似。

1.1 工程目录

  • 进入官方 SDK 外设工程目录的 blinky 例程,该例程提供 LED 闪烁的模板;
    ..\nRF5_SDK_12.2.0_f012efa\examples\peripheral\blinky\
  • 依次进入 pca10040 板型,s132 版本协议栈,arm5(MDK5) 开发环境目录 ,打开 Keil 工程文件。
    …\blinky\pca10040\s132\arm5_no_pack\blinky_pca10040_s132.uvprojx

1.2 工程讲解

  官方例程代码入口 MDK5 Project:Application\main.c 中,如下文代码所示,在主函数 main() 中调用 bsp_board_leds_init() 函数初始化 LED 设备,while 循环任务中每隔 500ms 反转一次所有的 LED 灯(共 LEDS_NUMBER 个 LED 灯)的亮灭。

int main(void)
{/* Configure board. */bsp_board_leds_init();/* Toggle LEDs. */while (true){for (int i = 0; i < LEDS_NUMBER; i++){bsp_board_led_invert(i);nrf_delay_ms(500);}}
}

2. 定义与声明

  上文例程的 bsp 前缀函数位于在 MDK5 Project:Board Definition\boards.c 文件中,该文件用于存放板级支持函数(如 LED、BUTTON),其头文件为 boards.h。

2.1 宏定义

  在 board.c 跟 board.h 文件中引用了一些 LED 前缀的宏定义,这些宏定义被定义在 pca10040.h(选择哪块板就是哪个板级配置头文件) 中,如下所示:

// LEDs definitions for PCA10040
#define LEDS_NUMBER    4                            /*!< 定义 LED 的个数 */
#define LED_START      17                           /*!< 定义第一个 LED 的控制管脚号 */
#define LED_1          17                           /*!< 定义 LED_1 的管脚号 */
#define LED_2          18                           /*!< 定义 LED_2 的管脚号 */
#define LED_3          19                           /*!< 定义 LED_3 的管脚号 */
#define LED_4          20                           /*!< 定义 LED_4 的管脚号 */
#define LED_STOP       20                           /*!< 定义最后一个 LED 控制管脚号 */#define LEDS_ACTIVE_STATE 0                         /*!< 定义 LED 有效状态:0-低电平,1-高电平 */#define LEDS_LIST { LED_1, LED_2, LED_3, LED_4 }    /*!< LED 列表,上面定义的 LED 应填入列表 */

2.1 LED 数组缓冲区

  在 board.c 声明了一个静态常量全局数组 m_board_led_list,用于存放 LED 列表,空间大小为 LEDS_NUMBER,内容为上文宏定义中的 LEDS_LIST ,由此我们可知当 led_idx = 0 时,m_board_led_list[led_idx] 为 LED_1,其他 LED 依次类推。

static const uint8_t m_board_led_list[LEDS_NUMBER] = LEDS_LIST;

3. 函数接口

● void bsp_board_leds_init(void)

用途:初始化所有的 LED 灯设备
参数:无
返回:无

● bool bsp_board_led_state_get(uint32_t led_idx)

用途:获取 led_idx 的 LED 的当前状态
参数:- led_idx:LED列表序号,最大等于LEDS_NUMBER-1
返回:- true(1):LED 亮
   - flase(0):LED 灭

  这里值得注意的是:在硬件上板级 LED 统一使用同一种有效状态,即 LEDS_ACTIVE_STATE 配置高电平亮(有效)或者低电平亮(有效),默认为0-低电平亮(有效),调用该函数对高低电平亮做了兼容,用户在软件上只需关注 true 跟 flase 就可以。
● void bsp_board_led_on(uint32_t led_idx)

用途:设置 led_idx 的 LED 亮
参数:- led_idx:LED列表序号,最大等于LEDS_NUMBER-1
返回:无

● void bsp_board_led_off(uint32_t led_idx)

用途:设置 led_idx 的 LED 灭
参数:- led_idx:LED列表序号,最大等于LEDS_NUMBER-1
返回:无

● void bsp_board_led_invert(uint32_t led_idx)

用途:反转 led_idx 的 LED 状态
参数:- led_idx:LED列表序号,最大等于LEDS_NUMBER-1
返回:无

● void bsp_board_leds_off(void)

用途:关闭所有的 LED 灯
参数:无
返回:无

● void bsp_board_leds_on(void)

用途:打开所有的 LED 灯
参数:无
返回:无

● uint32_t bsp_board_pin_to_led_idx(uint32_t pin_number)

用途:将 LED 的管脚序号转化成 LED 的灯序号
参数:- pin_number :GPIO管脚序号
返回:- 0xFFFFFFFF 无效管脚序号
   - 其他值: LED 的灯序号

● uint32_t bsp_board_led_idx_to_pin(uint32_t led_idx)

用途:将 LED 的灯序号转化成 LED 的管脚序号
参数:- led_idx:LED列表序号,最大等于LEDS_NUMBER-1
返回:- GPIO管脚序号

  具体函数实现方式在board.c,相对比较简单,可自行通过阅读代码学习,该文件还包含 BUTTON 的板级支持函数,原理类似于 LED ,此处不再讲解。)

3. 实验

  接下通过一个实验演示上文函数,让 LED_0 1s 闪烁一次,LED_1 状态跟随 LED_0, LED2 状态与 LED_0 相反。

int main(void)
{/* 初始化所有的 LED 灯设备 */bsp_board_leds_init();while(true){/* 反转 LED_0 状态 */bsp_board_led_invert(0);                    /* 读取 LED_0 状态 */if(true == bsp_board_led_state_get(0))      {/* 若 LED_0 亮,则点亮 LED_1, 熄灭 LED_2 */bsp_board_led_on(1);bsp_board_led_off(2);}else{/* 若 LED_0 灭,则熄灭 LED_1, 点亮 LED_2 */bsp_board_led_off(1);bsp_board_led_on(2);}/* 延时软件1s */nrf_delay_ms(1000);}
}

4. 拓展

  官方 SDK 外设工程目录下还有基于 FreeRTOS 的 blinky_freertos 例程可供学习。此外上文提到的nrf_delay_ms() 毫秒级延时函数是利用软件机器周期延时,外设工程目录下有一个 blinky_systick 例程利用滴答定时器准确延时(在nRF52832中,默认不使用 systick,似乎为了节省功耗?)

[nRF52832] 外设篇 | 实验一 LED 灯 及 BUTTON 按键相关推荐

  1. STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁

    STM32学习 3:GPIO管脚配置与第一个STM32实验:LED灯闪烁 1,GPIO管脚简介与配置 1.1GPIO框图 1.2GPIO不同模式 1.3 GPIO寄存器 1.4 GPIO库函数配置 2 ...

  2. 51单片机c语言led灯闪烁实验报告,实验一LED灯闪烁.doc

    实验一LED灯闪烁.doc 单片机小系统设计与制作实验报告姓名 李文浩 学号 1423102 班级 14级电仪维 指导教师 陈雪莲 实验一 八个LED灯闪烁一.实验要求仿照图1-1在Proteus中绘 ...

  3. 51单片机c语言LED灯闪烁实验,实验一LED灯闪烁

    <实验一LED灯闪烁>由会员分享,可在线阅读,更多相关<实验一LED灯闪烁(3页珍藏版)>请在人人文库网上搜索. 1.单片机小系统设计与制作实验报告姓名: 李文浩 学号: 14 ...

  4. 记录一个 三个io口控制四个LED灯和一个按键的电路和怎么检测

    昨天要写个底层程序 发现要控制四个led灯和一个按键,按键开始一直不能很好的检测, 后面论坛问人才搞好. 分时扫描: 前1-4驱动LED,5检测KEY 1,LED1输出高,LED2输出低,LED3输入 ...

  5. 蓝桥杯嵌入式第一篇 点亮LED灯开启成功之路

    文章目录 前言 一.准备工作 1.拿到开发板第一步看原理图 2.下载STM32cubeMX 二.开始点灯 1.查看LED原理图 2.cubeMX配置 3.代码实现 总结 前言 从这篇文章开始将为大家带 ...

  6. pyboard 实验遥控LED灯

    想学习pyboard的遥控用法,做一个简单的遥控灯,以后可以继续加强实现遥控的各种功能. 官方的文档:http://docs.tpyboard.com/zh/latest/tpyboard/drive ...

  7. 树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  8. 51单片机数码管滚动显示学号_51单片机四位数码管4个LED灯4个按键实现多种功能?...

    任务描述:用89C51单片机实现如下功能:<初始状态为数码管显示2020,四个灯灭. 1.电路有四个控制按键,四个灯,四个数码管: 2.按键1,按下,,第一个数码管开始从0-9递增,同时第一个灯 ...

  9. Arduino基础入门篇06—流动的LED灯

    上一篇介绍了Arduino数字I/O引脚及相关函数,并点亮了板载LED灯.本篇将使用面包板搭建电路,多个LED灯配合显示流动效果. 1. 实验材料 Uno R3开发板 配套USB数据线 面包板及配套连 ...

  10. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

最新文章

  1. Go 学习笔记(76)— Go 标准库 net/http 创建客户端(发送 GET、POST 请求)
  2. Hyper-V安装(摘自本站)
  3. 清远工贸职业技术学校清远大学城网
  4. 动图,用Python追踪NBA球员的运动轨迹
  5. 期待已久的Java 9 今日正式发布,新特性解读
  6. c#垂直投影法_形象理解“梯度”与“法向量”的关系
  7. python3清屏命令_python3.4中清屏的处理方法
  8. python下载电影链接_Python:输入电影名,爬获取到阳光电影网中对应名称的迅雷下载链接,获取的链接有点问题(具体问题在内容里)...
  9. 近期14个“AI产品经理”职位JD推荐(覆盖北京、上海、深圳、成都、重庆、杭州)
  10. 电机控制程序设计经验
  11. PS中和FW一样的精灵图缩小功能(像素栏输入数字就能缩小
  12. 前端开发面试问题及答案整理
  13. 解释什么是啸叫,为什么会发生啸叫,啸叫的为何和如何防止啸叫
  14. 【深度学习论文阅读】TCN:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence
  15. Method isEmpty in android.text.TextUtils not mocked
  16. Redefinition of typedef is a C11 feature
  17. 留学生活揭秘:进门易出门难 高淘汰率让人崩溃
  18. 数列 COGS1048:[Citric S2] 一道防AK好题
  19. HDU 5473(There was a kingdom-凸包+dp)
  20. jQuery事件,对象以及插件

热门文章

  1. bzoj3097: Hash Killer I
  2. python生成微信小程序码
  3. ICLR 2020 图神经学习论文汇总
  4. Qt交叉编译移植arm开发板
  5. lbp2900打印机linux驱动下载,佳能LBP2900+驱动下载-佳能LBP2900+打印机驱动下载 V3.30官方版--pc6下载站...
  6. 土是独体字结构吗_独体结构的字大全
  7. 秦九韶算法——计算方法
  8. 【SpringBoot教程】根据环境自动装配
  9. 【2021年度总结】积跬步,「卷」千里,2022 继续「卷」
  10. ARM架构(RISC)和x86架构(CISC)以及传统与移动CPU/GPU厂商