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

12、nRF52XX蓝牙学习(GPIOTE任务触发LED)

GPIOTE 具有任务模式,任务模式就是输出模式。如果把 GPIO 管脚绑定了 GPIOTE 通道后,
把它配置为任务模式,则可以实现输出功能。任务模式的使用不是孤立的,一般都是由事件来触发
任务,如果在事件和任务中间架设一个通道,也就是后面会将的 PPI ,那么整个过程不需要 CPU 参与了,大大节省 mcu 的资源。本例首先简单的演示下任务是如何输出的,我们用输出端口来控制一个 LED 灯,完成我们输出的功能。
       首先是 GPIOTE 任务初始化,我们初始化两个 GPIOTE 通道。初始化首先首先设置通道
CONFIG[0] .PSEL 域设置绑定 GPIO 13 管脚, CONFIG[1] .PSEL 域设置绑定 GPIO 14 管脚; 再设置两个通道的 CONFIG.MODE 域设置 GPIOTE Task 任务模式;再来设置 CONFIG.POLARITY 域中设置 OUT[0] 任务输出为翻转电平, OUT[1] 任务输出为低电平。具体代码如下所示:
void GPIOTE_TASK_Init(void)
{
    
    NVIC_EnableIRQ(GPIOTE_IRQn);//中断嵌套设置
	
    NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)
                           | (GPIOTE0 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);
	 

	  NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (GPIOTE1<< GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);
	
 
}

包含头文件为:

#ifndef __GPIOTE_H
#define	__GPIOTE_H

#include "nrf52840.h"

#define GPIOTE0       13
#define GPIOTE1       14

void GPIOTE_TASK_Init(void);

#endif /* __EXIT_H */

主函数

#include "nrf52840.h"
#include "nrf_gpio.h"
#include "GPIOTE.h"
#include "led.h"
#include "nrf_delay.h"

int main(void)
{

 /*配置按键中断*/
  GPIOTE_TASK_Init();
	while(1)
	{
		//触发输出任务模式
	  NRF_GPIOTE->TASKS_OUT[0]=1;
		NRF_GPIOTE->TASKS_OUT[1]=1;
		nrf_delay_ms(500);
		}
}

以下是对GPIOTE_TASK_Init 函数解释:

整体功能概述

GPIOTE_TASK_Init 函数的主要作用是对通用外设中断和事件(GPIOTE)模块进行初始化配置。具体来说,它会使能 GPIOTE 中断,并且对 GPIOTE 的两个通道(CONFIG[0] 和 CONFIG[1])进行配置,设置它们的极性、选择的引脚以及工作模式。

NVIC_EnableIRQ(GPIOTE_IRQn);


   • NVIC 是嵌套向量中断控制器(Nested Vectored Interrupt Controller)的缩写,它负责管理和控制微控制器中的中断。

• NVIC_EnableIRQ(GPIOTE_IRQn) 这行代码的作用是使能 GPIOTE 模块的中断。当 GPIOTE 模块检测到符合配置条件的事件时,就会触发中断,从而执行相应的中断服务程序。GPIOTE_IRQn 是 GPIOTE 中断的中断号。

 NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)
                           | (GPIOTE0 << GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);


  • NRF_GPIOTE 是一个指向 GPIOTE 模块寄存器结构体的指针,通过它可以访问和配置 GPIOTE 模块的各个寄存器。此结构体定义如下 :

#define NRF_GPIOTE                  ((NRF_GPIOTE_Type*)        NRF_GPIOTE_BASE)
typedef struct {                                //!< (@ 0x40006000) GPIOTE Structure                                         
  __OM  uint32_t  TASKS_OUT[8];                 //< (@ 0x00000000) Description collection: Task for writing to pin
                                                                  //  specified in CONFIG[n].PSEL. Action on pin
                                                                  //  is configured in CONFIG[n].POLARITY.                    
  __IM  uint32_t  RESERVED[4];
  __OM  uint32_t  TASKS_SET[8];                 //< (@ 0x00000030) Description collection: Task for writing to pin
                                                                   // specified in CONFIG[n].PSEL. Action on pin
                                                                  //  is to set it high.                                       
  __IM  uint32_t  RESERVED1[4];
  __OM  uint32_t  TASKS_CLR[8];                 //< (@ 0x00000060) Description collection: Task for writing to pin
                                                                 //   specified in CONFIG[n].PSEL. Action on pin
                                                                   // is to set it low.                                       
  __IM  uint32_t  RESERVED2[32];
  __IOM uint32_t  EVENTS_IN[8];                 //< (@ 0x00000100) Description collection: Event generated from
                                                                  //  pin specified in CONFIG[n].PSEL                            
  __IM  uint32_t  RESERVED3[23];
  __IOM uint32_t  EVENTS_PORT;                  //< (@ 0x0000017C) Event generated from multiple input GPIO pins
                                                                   // with SENSE mechanism enabled                              
  __IM  uint32_t  RESERVED4[97];
  __IOM uint32_t  INTENSET;                     //< (@ 0x00000304) Enable interrupt                                          
  __IOM uint32_t  INTENCLR;                     //< (@ 0x00000308) Disable interrupt                                        
  __IM  uint32_t  RESERVED5[129];
  __IOM uint32_t  CONFIG[8];                    //< (@ 0x00000510) Description collection: Configuration for OUT[n],
                                                                 //   SET[n], and CLR[n] tasks and IN[n] event                  
} NRF_GPIOTE_Type;                              //< Size = 1328 (0x530) 

• CONFIG 是一个数组,用于配置 GPIOTE 的不同通道。这里配置的是通道 0(CONFIG[0])。 ◦ GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos:

将 GPIOTE_CONFIG_POLARITY_Toggle 这个表示极性设置的常量左移 GPIOTE_CONFIG_POLARITY_Pos 位,目的是将其放置到 CONFIG 寄存器中极性配置的正确位置。GPIOTE_CONFIG_POLARITY_Toggle 表示引脚电平翻转时触发事件,即从高电平到低电平或从低电平到高电平的变化都会触发。

GPIOTE0 << GPIOTE_CONFIG_PSEL_Pos:将 GPIOTE0 这个表示引脚选择的常量左移 GPIOTE_CONFIG_PSEL_Pos 位,将其放置到 CONFIG 寄存器中引脚选择的正确位置。GPIOTE0 代表要配置的具体 GPIO 引脚。

GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos:将 GPIOTE_CONFIG_MODE_Task 这个表示工作模式的常量左移 GPIOTE_CONFIG_MODE_Pos 位,将其放置到 CONFIG 寄存器中工作模式配置的正确位置。GPIOTE_CONFIG_MODE_Task 表示该通道工作在任务模式下。

最后使用按位或运算符 | 将这三个配置项组合起来,并赋值给 NRF_GPIOTE->CONFIG[0],完成通道 0 的配置。    

  NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
                           | (GPIOTE1<< GPIOTE_CONFIG_PSEL_Pos)  
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);


   • 这行代码与前面配置通道 0 的逻辑类似,只不过这里配置的是通道 1(CONFIG[1])。 ◦ GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos:表示将引脚电平从高电平变为低电平时触发事件。 

GPIOTE1 << GPIOTE_CONFIG_PSEL_Pos:选择 GPIOTE1 引脚进行配置。 GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos:同样将该通道设置为任务模式。 
   总结 这段代码通过使能 GPIOTE 中断,并对 GPIOTE 的两个通道进行配置,实现了对不同 GPIO 引脚的事件触发极性和工作模式的设置。通道 0 配置为引脚电平翻转时触发事件,通道 1 配置为引脚电平从高到低变化时触发事件,且两个通道都工作在任务模式下。

主函数代码解析:


int main(void)
{

 /*配置按键中断*/
  GPIOTE_TASK_Init();
    while(1)
    {
        //触发输出任务模式
      NRF_GPIOTE->TASKS_OUT[0]=1;
        NRF_GPIOTE->TASKS_OUT[1]=1;
        nrf_delay_ms(500);
        }
}


TASKS_OUT 是一个数组,用于触发 GPIOTE 模块的输出任务。NRF_GPIOTE->TASKS_OUT[0]=1; 这行代码将 TASKS_OUT[0] 寄存器的值设置为 1,从而触发 GPIOTE 通道 0 的输出任务。同理,NRF_GPIOTE->TASKS_OUT[1]=1; 触发 GPIOTE 通道 1 的输出任务。当这些任务被触发时,会根据之前在 GPIOTE_TASK_Init 函数中对通道的配置来执行相应的操作,比如改变引脚的电平状态等。

GPIOTE 模块提供的了 8 个通道,这 8 个通道都是通过 CONFIG[0]~CONFIG[7] 寄存器来配置。
这八个通道可以通过单独设置来分别和普通的 GPIO 绑定。当需要使用 GPIOTE 的中断功能时可以 设置相关寄存器的相关位,让某个通道作为 event 事件模式,同时配置触发 event 的动作。比如绑定 的引脚有上升沿跳变或者下降沿跳变触发 event , 然后配置中断使能寄存器,配置让其 event 产生时 是触发输入中断。这样就实现了 GPIO 的中断方式。
实验下载到青云 nrf52840 开发板后的实验现象如下: LED3 灯会对应 500ms 时间翻转闪烁,
LED4 会保持常亮。

相关文章:

  • Python爬虫第11节-解析库Beautiful Soup的使用上篇
  • 安装NVIDIA驱动、配置docker运行时、docker部署GPUStack及ragflow集成GPUStack模型(WSL下ubuntu)
  • uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)
  • iframe学习与应用场景指南
  • 【技术白皮书】外功心法 | 第四部分 | 数据结构与算法基础(常用的数据结构)
  • MySQL之事务理论和案例
  • SQLyog使用教程
  • ASP.NET中将 PasswordHasher 使用的 PBKDF2 算法替换为更现代的 Scrypt 或 Argon2 算法
  • 语音外呼提高CPS转化案例
  • 【教程】优化xrdp的性能
  • 数字内容体验构建品牌忠诚新路径
  • Open GL ES-> 工厂设计模式包装 SurfaceView + 自定义EGL的OpenGL ES 渲染框架
  • AI大模型学习七:‌小米8闲置,直接安装ubuntu,并安装VNC远程连接手机,使劲造
  • selenium元素获取
  • 【时时三省】Python 语言----正则表达式
  • 检测到目标URL存在http host头攻击漏洞
  • 北京市生成式人工智能大模型备案综合分析情况
  • 聚焦AI与大模型创新,紫光云如何引领云计算行业快速演进?
  • GoLand 标红但程序可正常运行:由符号索引缓存失效引起的假报错问题
  • 1 深入理解 DevOps 与 CI/CD:概念、流程及优势
  • 惠州附近公司做网站建设多少钱/百度移动端模拟点击排名
  • 北京江苏省住房和城乡建设厅网站/seo排名推广
  • 溧阳网站优化/2022搜索引擎
  • wordpress制作上传图片/长春网站优化咨询
  • 网站做百度推广能获取流量吗/企业网络推广技巧
  • 电子商城毕业论文/北京网站快速排名优化