当前位置: 首页 > news >正文

3、nFR52xx蓝牙学习(点亮第一个LED灯)

一、点灯代码:
led.h文件
#ifndef __LED_H
#define	__LED_H#include "nrf52840.h"#define LED_0          NRF_GPIO_PIN_MAP(0,13)
#define LED_1          NRF_GPIO_PIN_MAP(0,14)
#define LED_2          NRF_GPIO_PIN_MAP(0,15)
#define LED_3          NRF_GPIO_PIN_MAP(0,16)void LED_Init(void);
void LED1_Open(void);
void LED1_Close(void);
void LED1_Toggle(void);
void LED2_Open(void);
void LED2_Close(void);
void LED2_Toggle(void);
void LED3_Open(void);
void LED3_Close(void);
void LED3_Toggle(void);#endif /* __LED_H */

led.c文件

#include "nrf52840.h"
#include "nrf_gpio.h"
#include "led.h"
#include <stdio.h>
/*
#define ITM_PORT8(n)         (*(volatile unsigned char *)(0xe0000000 + 4*(n)))
#define ITM_PORT16(n)        (*(volatile unsigned short *)(0xe0000000 + 4*(n)))
#define ITM_PORT32(n)        (*(volatile unsigned long *)(0xe0000000 + 4*(n)))
#define DEMCR                (*(volatile unsigned long *)(0xE000EDFC))
#define TRCENA               0X01000000int fputc(int ch, FILE *f)
{if(DEMCR & TRCENA){while(ITM_PORT32(0) == 0);                                                                                                                                                                                                                                                                                      ITM_PORT8(0) = ch;}return ch;
}
*/
void LED_Init(void)
{// Configure LED-pins as outputsnrf_gpio_cfg_output(LED_0);nrf_gpio_cfg_output(LED_1);nrf_gpio_cfg_output(LED_2);
}void LED1_Open(void)
{nrf_gpio_pin_clear(LED_0);//设置低电平}void LED1_Close(void)
{nrf_gpio_pin_set(LED_0);//高电平}
void LED1_Toggle(void)
{nrf_gpio_pin_toggle(LED_0);
}
void LED2_Open(void)
{nrf_gpio_pin_clear(LED_1);}void LED2_Close(void)
{nrf_gpio_pin_set(LED_1);}
void LED2_Toggle(void)
{nrf_gpio_pin_toggle(LED_1);
}void LED3_Open(void)
{nrf_gpio_pin_clear(LED_2);}void LED3_Close(void)
{nrf_gpio_pin_set(LED_2);}
void LED3_Toggle(void)
{nrf_gpio_pin_toggle(LED_2);
}

二、代码解析(有些地方看文档不懂,是本人胡乱解析的,不对别喷,谢谢!)

1.NRF_GPIO_PIN_MAP是一个带参数的宏,在nrf_gpio.h中定义如下:

#define NRF_GPIO_PIN_MAP(port, pin) (((port) << 5) | ((pin) & 0x1F))

其用途是把端口号与引脚号映射成nrf_gpio函数能理解的值。在 Nordic 的 nRF 系列芯片里,
GPIO 引脚通常用一个 32 位整数来表示,这个整数融合了端口号和引脚号的信息。

(port << 5):把端口号向左移 5 位。这是因为每个端口有 32 个引脚(0-31也就是 2^5 个),所以左移 5 位就能给引脚号留出足够的位宽。
(port) << 5) | ((pin) & 0x1F):使用按位或操作符将移位后的端口号和引脚号组合起来,从而得到一个唯一的整数值,该值可被nrf_gpio函数使用。为了以后看的时候省一点时间,下面用图表说明一下,比如端口号port=0xb(二进制为1011),存储形式如下:
左移5位后变成下面的形式:
后面5位空出来写引脚号,比如引脚号是是pin=21=0x15=10101,存储形式如下:
为了排除引脚号5--31位的干扰,通过(pin) & 0x1F(0x1f=0001 1111)这一操作,将低5位以外的都置0,保留低5位引脚号。
通过上面的步骤后,再通过按位或连接端口号与引脚号:
这个就是这个宏的作用,把端口号与引脚号映射成nrf_gpio函数能理解的值。
未完,待续

http://www.mrgr.cn/news/96840.html

相关文章:

  • 巧用临时对象之五
  • element-ui自制树形穿梭框
  • C++ 编程指南33 - 使用模板来表达适用于多种参数类型的算法
  • 基于React + Antd + Java的OFD文件上传预览实现方案(OFD文件转图片)
  • 对象和面向对象三大特征:封装
  • 黑马 C++ 学习笔记
  • Android 10.0 通过广播控制systemui状态栏动态显示和隐藏功能实现
  • Java 递归全解析:从原理到优化的实战指南
  • 持续集成与Jenkins安装使用教程
  • 模拟集成电路设计与仿真 : Mismatch
  • cmake(11):list 选项 排序 SORT,定义宏 add_definitions,cmake 里预定义的 8 个宏
  • 二叉树 —— 数据结构基础刷题路程
  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • 基于Python的医院信息管理系统的设计与实现
  • Windows家庭版如何开启Hyper-V与关闭Hyper-V
  • 山东大学《多核平台下的并行计算》实验笔记
  • 相机的曝光和增益
  • Linux中的权限管理(附加详细实验示例)
  • JavaFX基础- Button 的基本使用
  • 基于 docker 的 LLaMA-Factory 全流程部署指南