一、点灯代码:
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 0X01000000 int 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 outputs nrf_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函数能理解的值。
2.nrf_gpio_cfg_output(LED_0);用途是把指定编号的 GPIO(通用输入输出





没有回复内容