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),存储形式如下:
(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函数能理解的值。
未完,待续