1.GPIO 输入输出 测试
#include “nrf52.h”
#include “nrf_gpio.h”
#define KEY_1 13
#define KEY_2 14
输入引脚功能定义
nrf_gpio_cfg_input(13,NRF_GPIO_PIN_PULLUP);
输出引脚定义
nrf_gpio_cfg_output(LED_0);
输入状态 获取
nrf_gpio_pin_read(KEY_1)
io 电平设置
nrf_gpio_pin_clear(LED_2 ) 低
nrf_gpio_pin_set ( LED_2) 高
nrf_gpio_pin_toggle(LED_2 ) 翻转
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MjVrxlR1-1658913491113)(assets/image-20220727112057-2wp7kdb.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1CEggBbt-1658913491113)(assets/image-20220727112123-8gbeqrl.png)]
只下载 外设 功能测试程序
2.GPIOTE 与中断
GPIOTE 提供了任务和事件,减少 cpu 参与,支持外部中断
中断和任务脚设定为 GPIOTE
task 和 event 与 ppi(可编程外设系统)结合绑定, event (io,中断) 触发,执行 task(io 翻转)
功能特性:
- 事件模式做中断触发 使用(上升,下降沿,任何变化)
- 任务模式做输出使用(置位,清零,翻转)
库函数方式 APP_ERROR_CHECK错误定位
/**
GPIOTE 中断处理
/
void in_pin_handler( )
{
if(nrf_gpio_pin_read(PIN_IN)== 0)//按键防抖
{
nrf_gpio_pin_toggle(PIN_OUT);
}
}
/*
配置 GPIOTE 初始化
*/
static void gpio_init(void)
{
nrf_gpio_cfg_output(PIN_OUT);//led 灯的输出
ret_code_t err_code;err_code = nrf_drv_gpiote_init();//初始化 GPIOTE
APP_ERROR_CHECK(err_code);nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true); //敏感模式 电平翻转
in_config.pull = NRF_GPIO_PIN_PULLUP; //上拉模式
//设置 GPIOTE 输入,极性,模式,任务绑定 in_pin_handler
err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);
APP_ERROR_CHECK(err_code);
//使能 GPIOTE
nrf_drv_gpiote_in_event_enable(PIN_IN, true);
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-38xrTTRc-1658913491113)(assets/16589074801-20220727153809-653afht.png)]
2.1中断组 port
nrf_gpio_cfg_output(LED_4); //设置 输出io ret_code_t err_code; //初始化GPIOTE err_code = nrf_drv_gpiote_init();<br /> APP_ERROR_CHECK(err_code); //配置SENSE模式,选择fales为gpiote port模式 配置 ,true 为单引脚输入 nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false); in_config.pull = NRF_GPIO_PIN_PULLUP;//输入下降沿触发 //配置按键0绑定POTR及in_pin_handler事件解析 err_code = nrf_drv_gpiote_in_init(BSP_BUTTON_0, &in_config, in_pin_handler); APP_ERROR_CHECK(err_code); nrf_drv_gpiote_in_event_enable(BSP_BUTTON_0, true);//更多引脚配置相似
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
//事件由按键S1产生,即按键S1按下
if(pin == BUTTON_1)
{
//翻转指示灯D1的状态
nrf_gpio_pin_toggle(LED_1);
}if(pin == BUTTON_2)
{
//翻转指示灯D1的状态
nrf_gpio_pin_toggle(LED_2);
}…
}
GPIOTE_CONFIG_IN_SENSE_HITOLO(false) 所有io的触发事件都是 port中断,都指向一个中断配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FA2z6rSK-1658913491114)(assets/image-20220727161030-1pnmmnn.png)]
2.2任务输出模式
初始化
#define GPIOTE0 19
void GPIOTE_TASK_Init(void)
{
ret_code_t err_code;
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
//定义GPIOTE输出初始化结构体,主要是配置为翻转模式
nrf_drv_gpiote_out_config_t config1 = GPIOTE_CONFIG_OUT_TASK_TOGGLE(true);//
//绑定GPIOTE输出引脚
err_code = nrf_drv_gpiote_out_init(GPIOTE0, &config1);
APP_ERROR_CHECK(err_code);
//配置为引脚LED_3所在GPIOTE通道的任务模式
nrf_drv_gpiote_out_task_enable(GPIOTE0);
while(true)
{ //触发输出,即指示灯D3 翻转状态
nrf_drv_gpiote_out_task_trigger(GPIOTE0);
nrf_delay_ms(500);
}