nRF52832学习记录(一、外设初识之 GPIOTE)

2023-11-15

..添加GPIO和GPIOTE寄存器表 (对于应用的理解对着寄存器查看会比较明了,这个不管是在哪款芯片上都是如此
																				2021/9/27

这些年蓝牙5.0的应用越来越多,最近也是想着把以前Enocean的低功耗设备有过的产品,用蓝牙做一套匹配的版本,使得产品线更加丰富,我们这里选择的是主流的 nRF52832 芯片。
学习的时候当然还是得参照很多前人总结的文章。

nRF52832 的寄存器分为下面的三种类型:

  • Task :任务寄存器,可以由程序或事件触发。
  • Event:事件寄存器,事件可以产生中断或触发任务。
  • Register:普通寄存器,和一般单片机的寄存器一样。

1、nRF52832的IO口

32个IO口中
P0.02~ P0.05 和 P0.28~ P0.31可配置为 ADC 采样引脚,其他的IO口可以任意分配到各个外设。

P0.09 和 P0.10 默认分配到 NFC 功能外设,
如果需要设置为普通IO或者映射到其他外设需要添加宏
CONFIG_NFCT_PINS_AS_GPIOS

P0.21默认作为复位引脚

串口接收尽量带上上拉电阻

2、GPIO 和 GPIOTE

在学习的第一步,GPIO 和 GPIOTE我就疑惑了,这个与以前用过的单片机和 STM32 不类似啊,为什么对于IO口需要分GPIO和GPIOTE呢?

这里在网上找了一些相关的说明:在这里插入图片描述

下面的部分转至:nRF5芯片外设GPIO和GPIOTE介绍nRF5芯片外设GPIO和GPIOTE介绍

GPIO和GPIOTE都属于芯片外设,但两者功能完全不一样,使用过程中不要将两者混淆。GPIO就大家通常理解的普通IO口,用来对IO口进行读写等操作。因此,如果你需要读某个IO口状态,或者将某个IO口置1,那么请使用nrf_gpio.h里面的API,比如

nrf_gpio_cfg_input 用来将IO设为输入模式,可以配置为没有pull,有上拉电阻,有下拉电阻,悬浮等4种状态
nrf_gpio_pin_set 用来输出1到IO,输出模式下驱动力灵活可配,可以配置为普通驱动力(2mA),高驱动力(10mA),甚至断开状态(跟开漏输出很像)。

除此之外,GPIO模块还有2个非常重要的功能:

  • sense功能。当系统进入sleep模式(也称system OFF模式),只能通过IO口唤醒复位。当某个IO口使能了sense功能,那么它就可以用来唤醒sleep模式了。Sense使能的时候,可以配置高电平唤醒或者低电平唤醒。一般使用nrf_gpio_cfg_sense_input这个函数来使能IO口的sense功能。
  • port event功能。通俗来说,port event其实就是IO口中断,而且32个IO口共用同一个中断标志位:port event,检测port event只需要内部低频时钟在工作,因此功耗非常低:0.2微安左右,但内部低频时钟只能用来检测低精度的中断事件,也就是说IO口的中断脉冲要比较宽,比如像按键这种事件,就可以用port event来检测,功能达到了功耗又低,两全其美。这里特别说明一下,port event状态(一个中断flag)是跟随IO口电平的,比如检测高电平有效,那么只要IO口电平一直为高,那么port event一直有效,该中断标志位无法通过软件清除。这会产生两个副作用:一是不断进入port event中断例程,二是前面也提到,port event是被32个IO口共用的,因此只要其中一个IO口一直有效,别的IO产生的port event就会被忽略。为此,在处理port event中断的时候,nRF5 SDK app_button模块将每个port event的极性设为toggle,也就是每进入一次port event handler,nRF5 SDK都会把port event的极性翻转一次,比如将检测为高有效变成检测为低有效,这就相当于清除了port event中断flag,从而避开上述描述的两个副作用场景。由于GPIO模块不能处理中断,所以port event中断实际是交给GPIOTE模块来一起处理的。

nRF52832 GPIO寄存器
在这里插入图片描述在这里插入图片描述
GPIOTE,全称GPIO Tasks and Events,GPIOTE首先是一个外设模块,因此它遵守芯片外设最基本规则:每一个时刻每一个GPIO口只能被一个外设使用,因此当某一个IO口被用做GPIOTE了,那么它就不能再作为普通GPIO来使用了,也就是上面提到的GPIO API将变得无效,此时必须使用nrfx_gpiote.h(老版本为nrf_drv_gpiote.h)里面的API。Nordic将状态机引入到每一个外设,也就是说,每一个外设都有自己的输入(task),输出(event)和状态。GPIOTE的作用就是让GPIO也具有task和event的功能,也就是说,对GPIOTE来说,将某一个IO口置1,其实是触发TASKS_SET;检测某一个IO口上升沿,其实是等待EVENTS_IN。让IO口支持task和event机制,将为后面的PPI自动化操作打下基础,关于PPI详细说明,请参考如何理解nRF芯片的外设PP1

前面也提到过,处理IO口中断,必须通过GPIOTE模块来做,GPIOTE支持两种类型中断:
高精度的EVENTS_IN中断以及
低精度的EVENTS_PORT中断(就是前面GPIO章节提到的Port event)。
EVENTS_PORT主要用来检测IO口高电平或者低电平,而EVENTS_IN用来检测沿,即上升沿,下降沿或者双沿。EVENTS_IN可以清0,EVENTS_PORT无法清0,两者都是在GPIOTE_irq_handler里面处理。

EVENTS_IN和EVENTS_PORT两者初始化区别如下所示:

nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(false); 
//false表示低精度低功耗的Port event,每个IO口都可以作为port event,52832总共有32个portevent
err_code = nrf_drv_gpiote_in_init(pin_no, &config, gpiote_event_handler);
nrf_drv_gpiote_in_config_t config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);  
//true表示高精度高功耗的IN event,52832总共有8个IN event。注:这里检测的是双沿
err_code = nrf_drv_gpiote_in_init(pin_no, &config, gpiote_event_handler);

如上所述,IN event中断和Port event中断,两者本质上是一样的,唯一的区别是:IN event中断每个中断口是相互独立的,而Port event中断所有IO口共用同一个中断标志位。

IN event需要高频时钟,所以功耗比较高,在精度可以接受的情况下,优先推荐使用port event。

SDK自带GPIOTE应用例程,感兴趣的读者请参考Keil5工程:SDK安装目录\examples\peripheral\pin_change_int\pca10040\blank\arm5_no_packs

SDK也自带Sense例子,有兴趣的读者请参考Keil5工程:SDK安装目录\examples\peripheral\ram_retention\pca10040\blank\arm5_no_packs

关于Port event中断使用例子,可以参考Nordic的app_button模块,比如ble_app_hrs就会用到这个模块,大家可以去看一下app_button是如何使用port event中断的。

nRF52832 GPIOTE寄存器
在这里插入图片描述在这里插入图片描述
有了上面的基础,然后再去做52832的GPIO口实验,就知道所以然了。

GPIOTE事件模式中断使用方式(寄存器)

void EXIT_KEY_Init(void)
{
  nrf_gpio_cfg_input(KEY_0,NRF_GPIO_PIN_PULLUP);//设置管脚位上拉输入
  nrf_gpio_cfg_input(KEY_1,NRF_GPIO_PIN_PULLUP);//设置管脚位上拉输入  



  NVIC_EnableIRQ(GPIOTE_IRQn);//中断嵌套设置
	 //绑定两个通道,配置输入事件,这里是绑定为通道0 IN[0]
  NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)//设置触发级性下降沿
                           | (13 << GPIOTE_CONFIG_PSEL_Pos) //p0.13
                           | (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos);//配置GPIOTE模式
 
  NRF_GPIOTE->INTENSET  = GPIOTE_INTENSET_IN0_Set << GPIOTE_INTENSET_IN0_Pos;// 使能中断类型
  ...
}   
   
void GPIOTE_IRQHandler(void)
{
   if((NRF_GPIOTE->EVENTS_IN[0] ==1) && (NRF_GPIOTE->INTENSET & GPIOTE_INTENSET_IN0_Msk ))
   {
		NRF_GPIOTE->EVENTS_IN[0] = 0; //中断事件清零.
		...	//中断后执行的操作
   }
}

中断的配置,里面的这些值都可以通过Demo找到示意,这里只放一下 NRF_GPIOTE_Type 这个结构体的说明,在 nrf52.h 这个文件中


typedef struct {                                    /*!< GPIOTE Structure                                                      */
  __O  uint32_t  TASKS_OUT[8];                      /*!< Description collection[0]: Task for writing to pin specified
                                                         in CONFIG[0].PSEL. Action on pin is configured in CONFIG[0].POLARITY. */
  __I  uint32_t  RESERVED0[4];
  __O  uint32_t  TASKS_SET[8];                      /*!< Description collection[0]: Task for writing to pin specified
                                                         in CONFIG[0].PSEL. Action on pin is to set it high.                   */
  __I  uint32_t  RESERVED1[4];
  __O  uint32_t  TASKS_CLR[8];                      /*!< Description collection[0]: Task for writing to pin specified
                                                         in CONFIG[0].PSEL. Action on pin is to set it low.                    */
  __I  uint32_t  RESERVED2[32];
  __IO uint32_t  EVENTS_IN[8];                      /*!< Description collection[0]: Event generated from pin specified
                                                         in CONFIG[0].PSEL                                                     */
  __I  uint32_t  RESERVED3[23];
  __IO uint32_t  EVENTS_PORT;                       /*!< Event generated from multiple input GPIO pins with SENSE mechanism
                                                         enabled                                                               */
  __I  uint32_t  RESERVED4[97];
  __IO uint32_t  INTENSET;                          /*!< Enable interrupt                                                      */
  __IO uint32_t  INTENCLR;                          /*!< Disable interrupt                                                     */
  __I  uint32_t  RESERVED5[129];
  __IO uint32_t  CONFIG[8];                         /*!< Description collection[0]: Configuration for OUT[n], SET[n]
                                                         and CLR[n] tasks and IN[n] event                                      */
} NRF_GPIOTE_Type;

GPIOTE事件模式中断使用方式(库函数)

库函数使用需要带上 sdk_config.h 文件,这个文件是库函数使用的配置文件

/**
  GPIOTE中断处理
 */
void xx(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
// void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    if(nrf_gpio_pin_read(PIN_IN)== 0)//按键防抖
	 {
	  nrf_gpio_pin_toggle(PIN_OUT);
	 }
}
/** 
PIN_IN  16 
PIN_OUT 13
在 pca10040.h 里面定义的
 */
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;
   
    err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, xx);//设置GPIOTE输入,极性,模式
    APP_ERROR_CHECK(err_code);
    //使能GPIOTE
    nrf_drv_gpiote_in_event_enable(PIN_IN, true);
}

GPIOTE PORT模式使用方式(库函数)

void pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
	if(pin == BUTTON_1){
    	...//按键一按下的事情
    }
	else if(pin == BUTTON_2){
    	...
    }
	else if(pin == BUTTON_3){
			...
    }
	else if(pin == BUTTON_4) {
			...
    }
}

static void gpio_init(void)
{   
    nrf_gpio_cfg_output(LED_1);
	nrf_gpio_cfg_output(LED_2);
	nrf_gpio_cfg_output(LED_3);
	nrf_gpio_cfg_output(LED_4);
	ret_code_t err_code;
    //初始化GPIOTE
    err_code = nrf_drv_gpiote_init();
    APP_ERROR_CHECK(err_code);

    //配置SENSE模式,选择fales为sense配置
    //当函数参数是false的时候,选择PORT事件,当为ture时候,选择IN事件
    nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);
    in_config.pull = NRF_GPIO_PIN_PULLUP;

	  //配置按键0绑定POTR
    err_code = nrf_drv_gpiote_in_init(BSP_BUTTON_0, &in_config, pin_handler);
    APP_ERROR_CHECK(err_code);
    nrf_drv_gpiote_in_event_enable(BSP_BUTTON_0, true);
	
	err_code = nrf_drv_gpiote_in_init(BSP_BUTTON_1, &in_config, pin_handler);
    APP_ERROR_CHECK(err_code);
    nrf_drv_gpiote_in_event_enable(BSP_BUTTON_1, true);
	
	err_code = nrf_drv_gpiote_in_init(BSP_BUTTON_2, &in_config, pin_handler);
    APP_ERROR_CHECK(err_code);
    nrf_drv_gpiote_in_event_enable(BSP_BUTTON_2, true);
	
	err_code = nrf_drv_gpiote_in_init(BSP_BUTTON_3, &in_config, pin_handler);
    APP_ERROR_CHECK(err_code);
	rf_drv_gpiote_in_event_enable(BSP_BUTTON_3, true);
}

GPIOTE 任务模式OUT使用方式(寄存器)

void GPIOTE_TASK_Init(void)
{    
    NVIC_EnableIRQ(GPIOTE_IRQn);
	  //绑定两个GPIOTE
    NRF_GPIOTE->CONFIG[0] =  (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)//GPIOTE_CONFIG_POLARITY_Toggle 翻转
                           | (15 << GPIOTE_CONFIG_PSEL_Pos)  //p0.15
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);//设置模式 

	NRF_GPIOTE->CONFIG[1] =  (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)//GPIOTE_CONFIG_POLARITY_HiToLo  输出低电平
                           | (16<< GPIOTE_CONFIG_PSEL_Pos)  //p0.16
                           | (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos);
}
...
while(1)
{
		NRF_GPIOTE->TASKS_OUT[0]=1; //触发
		NRF_GPIOTE->TASKS_OUT[1]=1;
		...//delay();
}

GPIOTE 任务模式OUT使用方式(库函数)

void GPIOTE_TASK_Init(void)
 {
 
	ret_code_t err_code;//uint32_t
	
	//初始化GPIOTE程序模块
	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(15, &config1);//p0.15
	APP_ERROR_CHECK(err_code);
	
	//配置为引脚LED(P0.15)所在GPIOTE通道的任务模式
	nrf_drv_gpiote_out_task_enable(15);  

	//定义GPIOTE输出初始化结构体,主要是配置为低电平模式
	nrf_drv_gpiote_out_config_t config2 = GPIOTE_CONFIG_OUT_TASK_LOW;

	err_code = nrf_drv_gpiote_out_init(16, &config2);
	APP_ERROR_CHECK(err_code);
	
	nrf_drv_gpiote_out_task_enable(16); 	
 }

int main(void)
{
  GPIOTE_TASK_Init();   
	while(1)
	{ 
		nrf_drv_gpiote_out_task_trigger(15);     
		nrf_drv_gpiote_out_task_trigger(16);
		nrf_delay_ms(500);
	}
}     
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nRF52832学习记录(一、外设初识之 GPIOTE) 的相关文章

  • BES平台(恒玄) ANC调试笔记

    一 前言 最近比较忙 昨天更新了EQ 调试模块 今天就趁热打铁把ANC部分也写下 主要说一些基于恒玄平台2500的ANC 环境搭配 软件设置 和 常见问题分析 个人见解 有不足之处 敬请锤教 二 环境搭配 此处引用BES 原厂ANC调试指南
  • 蓝牙之二十-设备类型

    蓝牙设备在扫描时会发现设备的类型 蓝牙图标有耳机 打印机 电话等等 蓝牙协议栈里有一个叫做基带的字段 基带的分配编号指明查询访问码和设备 服务类别 CoD 字段 通用及设备特定的查询访问码 DIAC 查询访问码 IAC 是寻找蓝牙设备和服务
  • BLE 蓝牙的一些心得总结

    1 TI 的CC2541协议栈开发教程 https blog csdn net feilusia category 5630377 html 2 以下是我对BLE 蓝牙的一些理解 如果有什么不对的地方 恳请大佬们指点
  • 低功耗蓝牙(BLE)

    https my oschina net tingzi blog 215008 低功耗蓝牙包括的术语及概念 如上图所示 使用低功耗蓝牙可以包括多个Profile 一个Profile中有多个Service 一个Service中有多个Chara
  • 蓝牙之六-A2dp代码调用流程

    上图描述的是蓝牙协议栈 通过该图 查看A2dp的代码在协议栈的调用流程 其分层架构如下 1 蓝牙的系统服务service通过JNI与bluedroid协议栈进行通信 协议栈分为两层 Bluetooth Embedded System BTE
  • 蓝牙mesh组网-JDY-24M初步探索

    操作步骤如下 这款JDY 24M蓝牙功能强大 我主要应用其中mesh组网这个功能 mesh组网简单来说 就是组网的这几个蓝牙是可以互相通信 一一通信是通过蓝牙地址来确定的 一 配置组网 需要用到两根USB转TTL的线 JDY 24M蓝牙2个
  • 【经典蓝牙】 蓝牙HFP层协议分析

    HFP 概述 HFP概念介绍 HFP Hands Free Profile 是蓝牙免提协议 可以让蓝牙设备对对端蓝牙设备的通话进行控制 例如蓝牙耳机控制手机通话的接听 挂断 拒接 语音拨号等 HFP中蓝牙两端的数据交互是通过定义好的AT指令
  • Android 蓝牙串口通信Demo

    目录 一 前言 二 效果图 三 源码 带注释 1 布局代码 2 Java代码 3 权限声明 四 注意 五 项目源码下载 一 前言 在学校和机电的同学组队准备做一个智能小车去参加比赛 需要我开发一个小车的控制app 所以我开始学习蓝牙串口通信
  • Android 蓝牙开发(六)hfp连接

    转载请注明出处 http blog csdn net vnanyesheshou article details 71106622 本文已授权微信公众号 fanfan程序媛 独家发布 扫一扫文章底部的二维码或在微信搜索 fanfan程序媛
  • 蓝牙之三-StateMachine

    蓝牙和wifi的管理上都使用到了状态机 该状态机属于分层状态机管理消息 一个状态对应于一个
  • Uni-App开发BLE低功耗蓝牙流程

    Uni App开发BLE低功耗蓝牙步骤 示例文件已上传gitee https gitee com yan rookie uniapp bluetooth git 如果对你有记得点个赞哦 注 微信小程序同样适用 只需吧前缀uni 修改为wx
  • STM32 BlueNRG-1低功耗介绍,包含CPU堆栈恢复和外设恢复

    概述 在消费类电子产品形态中 通常用锂电池 纽扣电池 干电池等设备供电 需要现有供电情况下能连续使用几个月或者1年 而这些供电电源通常只有20 40mAh左右的电 要达到要求的运行时间 通常要求平均功耗在uA级别 芯片正常工作下的工作级别基
  • STM32+HC-05蓝牙模块学习与使用

    HC 05蓝牙串口通信 HC05模块是一款高性能主从一体蓝牙串口模块 是一种集成蓝牙功能的PCBA板 用于短距离无线通信 十分方便 从某宝商家那里可以看到 蓝牙可以使用多种方法使用 这里我使用的是蓝牙主机连接 所以我们这里需要准备的器件 两
  • 基于snooplog分析蓝牙连接过程,进一步学习蓝牙协议栈

    一 什么是BT snoop log 首先问题 1 为什么远端发来的消息没有收到 2 为什么搜索不到设备 3 为什么连不上 4 总之 研发过程中会遇到很多奇奇怪怪的问题 我们无法通过现象去分析原因 也不可能再过一遍代码吧 这时候需要再某些代码
  • BT问题调试 -- HFP(AT指令)

    HFP基本知识 HFP的两个角色 AG和HF HFP AG角色发起连接请求 HFP HF角色发起连接请求 针对HFP的注意事项 必须先有SLC的建立过程 该过程可以由HF AG的任何一方发起 AT COPS用来查询运营商网络名称 AG的回应
  • 安卓蓝牙广播大全

    android bluetooth 提供了皆如扫描设备 连接设备以及对设备间的数据传输进行管理的类 这些类对蓝牙设备进行功能性管理 蓝牙模块API提供的应用包括了 扫描其它蓝牙设备 通过查询本地蓝牙适配器来匹配蓝牙设备 建立RFCOMM 无
  • nRF52832 — 串口BLE例程逐行解析【转载】

    原文链接 http blog csdn net u011034150 article details 50617686 转载文章 若有不妥 通知后我会立即删除 本讲逐行代码解析官方串口BLE例程demo 主要分一下几个部分 1 Main函数
  • NRF52832学习笔记(1)—— 添加自有service(基于SDK15.3)

    前言 SDK版本15 3 评估板 pca10040 在uart的例程中添加battery service 添加之前 手机连上设备之后扫描到的service如下 一 分配ram空间 softdevice的flash code是确定 但ram是
  • iPhone手机连接蓝牙鼠标和蓝牙键盘

    iPhone手机升级了IOS13之后 无意中发现了一个有趣的功能 iPhone手机可以连接蓝牙鼠标 具体方式如下 首先 要买一个支持蓝牙功能的鼠标 我用的罗技M590 建议再买一个蓝牙键盘 打开手机蓝牙 和蓝牙鼠标建立连接 这一步鼠标的说明
  • 【Android系统蓝牙开发】蓝牙基础知识-蓝牙核心系统架构

    什么是蓝牙 在开启基于蓝牙Spec v5 2的学习前 我们先了解下什么是蓝牙 蓝牙在我们日常生活中又存在哪些实际应用呢 蓝牙无线技术是一种短距离无线通信系统 其核心特性主要是以下三点 robustness 鲁棒性 抗干扰能力强 Low po

随机推荐

  • JSP语法:setProperty

    JSP语法 13 setProperty 时间 2009 03 21 20 37 来源 作者 CSDN IE QQ 百度 Google POCO 新浪 365Key 天极 和讯 博拉 Live 奇客 收客 饭否 叽歪
  • 互联网未来发展方向

    都知道马云带来了互联网以及互联网的高潮 随着国家推动一带一路经济带 以及国内互联网大局的发展 很明显未来是互联网的天下 而互联网将来会怎样哪 第一 网购或者终端购物成为主流 随着经济发展 社会文明进步 智能制造 智能社会越来越凸显 智能手机
  • Python和C语言哪个难?零基础学哪个好?

    Python和C语言哪个难 零基础学哪个好 Python上手简单有交互性强的开发环境 还有众多的第三方库 学习起来会比C C 容易的多 C过于底层强在内存操作 功能实现起来却十分复杂并不适合新手作为上手语言 Python和C语言各有各的优势
  • Elastic Search 学习笔记

    来自尚硅谷 ES 教程 背景知识 从MySQL 到 ES 这一小节是我的一点点理解 如果有不对的话 欢迎指正 ES 是一个开源的高扩展的分布式全文搜索引擎 这样讲似乎还是有点抽象 那我们用一个更加熟悉的东西 MySQL来辅助理解 既然是搜索
  • 程序员技术面常用知识点

    转自 http blog csdn net qq 15437629 article details 52388685 在这里只做备份 计算机网络 TCP IP 模型 TCP IP协议集的分层实施 为什么要给网络划分层次 1 各层之间相对独立
  • 接口(interface)的实现

    接口 interface 的实现 usb插槽就相当于现实中的接口 其实现实生活和编程相对应的 即程序就是事件 1 java中的接口是怎么实现的呢 接口就是给出一些没有实现的方法 到了某个类要使用的时候就去实现他 语法 interface 接
  • Python多层字典取值

    usr bin python coding utf 8 author Bingo he file get target value py time 2017 12 22 def get target value key dic tmp li
  • 对于vue项目整理增删改查

    模板是来源于官方文档 清除tabledata里的模拟数据先
  • Pytorch相关操作(2)

    PyTroch相关操作 1 21 torch cuda Event 记录GPU的运行时间 start torch cuda Event enable timing True end torch cuda Event enable timin
  • Android Handler 的基本使用

    1 前言 https developer android google cn reference android os Handler html Handler 是 Android 中线程通信的常用方式 文档如是说 A Handler al
  • 【从零开始学c++】——string

    学好STL 一 STL简介 了解 1 什么是STL 2 STL的六大组件 3 STL的缺陷 2 string 1 string的简单了解 如何对stl的查阅 2 string常用接口说明 1 string类 对象常见的构造 2 string
  • Kotlin入门学习(非常详细),从零基础入门到精通,看完这一篇就够了

    文章目录 kotlin的历史 Kotlin的工作原理 语言类型 编译型 解释型 Java的语言类型 Kotlin的运行原理 创建Kotlin项目 语法 变量 变量的声明 基本类型 var和val的本质区别 函数 函数的声明 声明技巧 函数的
  • 找准边界,吃定安全

    创新的资源管理算法 基于会话的全分布式处理流程 山石网科全分布式架构 打破了传统架构的限制 找准边界 吃定安全 往期文章 从访问控制谈起 再看零信任模型 威胁情报加持 泛边界下的全局主动防御体系如何着手 随着 2019 年我国以信息网络等新
  • 连 连 看

    1 案例介绍 连连看是一款曾经非常流行的小游戏 游戏规则 点击选中两个相同的方块 两个选中的方块之间连接线的折点不超过两个 接线由X轴和Y轴的平行线组成 每找出一对 它们就会自动消失 连线不能从尚未消失的图案上经过 把所有的图案全部消除即可
  • C/C++之01背包问题

    问题描述 给定N个物品 每个物品有一个重量W和一个价值V 你有一个能装M重量的背包 问怎么装使得所装价值最大 每个物品只有一个 输入格式 输入的第一行包含两个整数n m 分别表示物品的个数和背包能装重量 以后N行每行两个数Wi和Vi 表示物
  • <form>表单

    1 form表单
  • osgEarth的Rex引擎原理分析(三十六)为什么要删除设置过的垂直水准面

    目标 二十九 中的问题86 椭球体 水平面 应该不是删除 而是信息创建出一个没有垂直水准面的Profile 待继续分析列表 9 earth文件中都有哪些options 九 中问题 10 如何根据earth文件options创建不同的地理信息
  • java gc 次数_浅谈如何减少GC的次数

    GC会stop the world 会暂停程序的执行 带来延迟的代价 所以在开发中 我们不希望GC的次数过多 本文将讨论如何在开发中改善各种细节 从而减少GC的次数 1 对象不用时最好显式置为 Null 一般而言 为 Null 的对象都会被
  • 应用程序无法正常启动0xc000007b请点击确定关闭应用程序

    应用程序无法正常启动0xc000007b怎么办 这是很多用户在电脑的使用过程中会出现的一个问题 究竟出现这个问题的时候 我们要怎么去解决它 让我们的电脑重新恢复正常使用呢 想要解决这个问题就一起来看看0xc000007b错误解决办法吧 0x
  • nRF52832学习记录(一、外设初识之 GPIOTE)

    添加GPIO和GPIOTE寄存器表 对于应用的理解对着寄存器查看会比较明了 这个不管是在哪款芯片上都是如此 2021 9 27 这些年蓝牙5 0的应用越来越多 最近也是想着把以前Enocean的低功耗设备有过的产品 用蓝牙做一套匹配的版本