nRF52832学习记录(四、定时器)

2023-10-31

一、nRF52832 定时器基本介绍

nRF52832 包含了 5个定时器模块:
在这里插入图片描述
定时器有着不同的位宽选择,8/16/24/32位,通过BITMODE 寄存器的 第 0~1 位 选择:
在这里插入图片描述nRF52832 的定时器的内部结构:
在这里插入图片描述
1、时钟源
定时器工作在高频时钟源(HFLCK)下,包含了一个 4bit (1/2X)的分频器(Prescaler)。52832的有2种时钟输入模式,1MHz模式 和 16MHz模式。 时钟源通过分频器分频后输出最后的频率 f TIMER ,系统会通过这个参数自动选择时钟源,而不需要工程师设置寄存器。 当f TIMER > 1MHZ,系统自动选择16M时钟源,当F TIMER <= 1MHZ,系统选择1M时钟源。

2.分频器
在这里插入图片描述
Prescaler 位 1bit 的分频器,其值为 0 ~ 15。当 Prescaler > 9时,其计算任然为 9:
在这里插入图片描述3、工作模式
在这里插入图片描述MODE: 0 选择定时器模式
MODE: 1 选择计数器模式
MODE: 2 选择低功耗计数器模式
定时器模式下,每一个时钟频率下,计数器自动加1;
技术模式下,每触发一次寄存器COUNT event,定时器内部计数器肌醇器就会加1。

4、比较/捕获功能

6个CC寄存器,下面是CC[1]:
在这里插入图片描述定时器模式下 :
设定CC[n]寄存器的值,可以设置定时的时间。
当定时时间的值和CC[n]寄存器的值相等时,将触发一个 COMPARE[n] event。 COMPARE[n] event可以触发中断。
如果是周期性的触发,则需要在触发后清除计数值,否则会一直计数,直到溢出。
计数器模式下:
每次触发 COUNT 任务时,TIMER 的内部计数器 Counter 寄存器都会递增 1 ,
计数器模式下是不使用定时器的频率 和 预分频器,COUNT 任务在定时器模式下无效。
通过设定一个CAPTURE Task,捕获的计数器的值存储到 CC[n] 寄存器内,然后对 CC[n] 寄存器进行读取计数器的值。

5.Task delays and Task priority

After the TIMER is started, the CLEAR task, COUNT task and the STOP task will guarantee to take effect
within one clock cycle of the PCLK16M.

If the START task and the STOP task are triggered at the same time, that is, within the same period of
PCLK16M, the STOP task will be prioritized.

二、nRF52832 定时器定时功能

定时器定时的使用(寄存器版本):

/*配置高速时钟*/
static volatile NRF_TIMER_Type * timer_init(timer_t timer)
{
    volatile NRF_TIMER_Type * p_timer;
 
    NRF_CLOCK->EVENTS_HFCLKSTARTED  = 0;
    NRF_CLOCK->TASKS_HFCLKSTART     = 1;//开启高速时钟
    // 等待外部振荡器启动
    while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) {
    }
    switch (timer)
    {
        case TIMER0:
            p_timer = NRF_TIMER0;
            break;
        case TIMER1:
            p_timer = NRF_TIMER1;
            break;
        case TIMER2:
            p_timer = NRF_TIMER2;
            break;
        default:
            p_timer = 0;
            break;
    }
    return p_timer;
}
...
void nrf_timer_delay_ms(timer_t timer, uint_fast16_t volatile number_of_ms)
{
    volatile NRF_TIMER_Type * p_timer = timer_init(timer);

    if (p_timer == 0) {
    		printf("time init error!!");
    		break}
		/*
		开始配置定时器
		时钟频率31250HZ,计1S需要31250次,计1ms需要31.25次
		*/
    p_timer->MODE           = TIMER_MODE_MODE_Timer;        // 设置为定时器模式
    p_timer->PRESCALER      = 9;                            // Prescaler 9 produces 31250 Hz timer frequency => 1 tick = 32 us.
    p_timer->BITMODE        = TIMER_BITMODE_BITMODE_16Bit;  // 16 bit 模式.
    p_timer->TASKS_CLEAR    = 1;                            // 清定时器.    

    p_timer->CC[0]          = number_of_ms * 31; // cc里面的次数就是31.25次,先算整数部分,然后算小数部分
    p_timer->CC[0]         += number_of_ms / 4; 
    p_timer->TASKS_START    = 1;                    // Start timer.
    
    while (p_timer->EVENTS_COMPARE[0] == 0) { //如果比较时间发生,退出循环,这里感觉直接在干等,不是很合理!!!
    }
    p_timer->EVENTS_COMPARE[0]  = 0;
    p_timer->TASKS_STOP         = 1;                // Stop timer.
}

定时器定时的使用(库函数版本):

...
 /*
配置定时器相关事件

相关的注释
typedef struct
{
    nrf_timer_frequency_t frequency;          ///< Frequency.
    nrf_timer_mode_t      mode;               ///< Mode of operation.
    nrf_timer_bit_width_t bit_width;          ///< Bit width.
    uint8_t               interrupt_priority; ///< Interrupt priority.
    void *                p_context;          ///< Context passed to interrupt handler.
} nrfx_timer_config_t;

#define NRF_DRV_TIMER_DEFAULT_CONFIG             NRFX_TIMER_DEFAULT_CONFIG
#define NRFX_TIMER_DEFAULT_CONFIG                                                    \
{                                                                                    \
    .frequency          = (nrf_timer_frequency_t)NRFX_TIMER_DEFAULT_CONFIG_FREQUENCY,\
    .mode               = (nrf_timer_mode_t)NRFX_TIMER_DEFAULT_CONFIG_MODE,          \
    .bit_width          = (nrf_timer_bit_width_t)NRFX_TIMER_DEFAULT_CONFIG_BIT_WIDTH,\
    .interrupt_priority = NRFX_TIMER_DEFAULT_CONFIG_IRQ_PRIORITY,                    \
    .p_context          = NULL                                                       \
}

const nrf_drv_timer_t TIMER_LED = NRF_DRV_TIMER_INSTANCE(0);
typedef nrfx_timer_t        nrf_drv_timer_t;
typedef struct
{
    NRF_TIMER_Type * p_reg;            ///< Pointer to the structure with TIMER peripheral instance registers.
    uint8_t          instance_id;      ///< Driver instance index.
    uint8_t          cc_channel_count; ///< Number of capture/compare channels.
} nrfx_timer_t;

#define NRF_DRV_TIMER_INSTANCE                   NRFX_TIMER_INSTANCE
#define NRFX_TIMER_INSTANCE(id)                                   \
{                                                                 \
    .p_reg            = NRFX_CONCAT_2(NRF_TIMER, id),             \
    .instance_id      = NRFX_CONCAT_3(NRFX_TIMER, id, _INST_IDX), \
    .cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id),           \
}

#define nrf_drv_timer_ms_to_ticks                nrfx_timer_ms_to_ticks

__STATIC_INLINE uint32_t nrfx_timer_ms_to_ticks(nrfx_timer_t const * const p_instance,
                                                uint32_t                   timer_ms)
{
    return nrf_timer_ms_to_ticks(timer_ms, nrf_timer_frequency_get(p_instance->p_reg));
}

// 16M 右移 分频器的值
__STATIC_INLINE uint32_t nrf_timer_ms_to_ticks(uint32_t time_ms,
                                               nrf_timer_frequency_t frequency)
{
    // The "frequency" parameter here is actually the prescaler value, and the
    // timer runs at the following frequency: f = 16000 kHz / 2^prescaler.
    uint32_t prescaler = (uint32_t)frequency;
    NRFX_ASSERT(time_ms <= (UINT32_MAX / 16000UL));
    return ((time_ms * 16000UL) >> prescaler);
}

#define nrf_drv_timer_extended_compare           nrfx_timer_extended_compare

void nrfx_timer_extended_compare(nrfx_timer_t const * const p_instance,
                                 nrf_timer_cc_channel_t     cc_channel,
                                 uint32_t                   cc_value,
                                 nrf_timer_short_mask_t     timer_short_mask,
                                 bool                       enable_int)
{
    nrf_timer_shorts_disable(p_instance->p_reg,
        (TIMER_SHORTS_COMPARE0_STOP_Msk  << cc_channel) |
        (TIMER_SHORTS_COMPARE0_CLEAR_Msk << cc_channel));

    nrf_timer_shorts_enable(p_instance->p_reg, timer_short_mask);

    nrfx_timer_compare(p_instance,
                       cc_channel,
                       cc_value,
                       enable_int);
    NRFX_LOG_INFO("Timer id: %d, capture value set: %lu, channel: %d.",
                  p_instance->instance_id,
                  cc_value,
                  cc_channel);
}

 */  
 uint32_t time_ms = 1000; //定时器比较事件的时间
 uint32_t time_ticks;
 uint32_t err_code = NRF_SUCCESS;
    
 nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;//使用的是默认配置,就是在sdk_config.h里面的配置
 err_code = nrf_drv_timer_init(&TIMER_LED, &timer_cfg, timer_led_event_handler);//timer_led_event_handler为定时器中断,需要额外实现的函数,TIMER_LED,是指使用的那个定时器
 APP_ERROR_CHECK(err_code);
 time_ticks = nrf_drv_timer_ms_to_ticks(&TIMER_LED, time_ms);//函数用于计算定时时间下 CC[n]寄存器的值。
 //触发定时器比较  nrf_drv_timer_extended_compare 用于使能定时器比较通道,使能比较中断,设置触发比较寄存器cc[n]等参数
 //time_ticks 由上面的语句可以算出来 31250
 //NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK 定时器达到比较值以后,清除定时器技术的值清0,可以做到循环的计数
 nrf_drv_timer_extended_compare( &TIMER_LED, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
 //使能定时器
 nrf_drv_timer_enable(&TIMER_LED);
/*
 定时器中断
相关的注释  
**
 * @brief Timer events.
 
typedef enum
{
    NRF_TIMER_EVENT_COMPARE0 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[0]), ///< Event from compare channel 0.
    NRF_TIMER_EVENT_COMPARE1 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[1]), ///< Event from compare channel 1.
    NRF_TIMER_EVENT_COMPARE2 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[2]), ///< Event from compare channel 2.
    NRF_TIMER_EVENT_COMPARE3 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[3]), ///< Event from compare channel 3.
#if defined(TIMER_INTENSET_COMPARE4_Msk) || defined(__NRFX_DOXYGEN__)
    NRF_TIMER_EVENT_COMPARE4 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[4]), ///< Event from compare channel 4.
#endif
#if defined(TIMER_INTENSET_COMPARE5_Msk) || defined(__NRFX_DOXYGEN__)
    NRF_TIMER_EVENT_COMPARE5 = offsetof(NRF_TIMER_Type, EVENTS_COMPARE[5]), ///< Event from compare channel 5.
#endif
} nrf_timer_event_t;

*/
void timer_led_event_handler(nrf_timer_event_t event_type, void* p_context)
{
    static uint32_t i;
    uint32_t led_to_invert = ((i++) % LEDS_NUMBER);
    switch (event_type)
    {
        case NRF_TIMER_EVENT_COMPARE0:
            bsp_board_led_invert(led_to_invert);
            break;
        default:
            break;
    }
}

三、nRF52832 定时器计数功能

定时器计数功能一般都是配置PPI使用,我们这里介绍使用主要给出简单的示例。
计数器模式下,每次触发 COPUNT 任务时, TIMER 的内部计数器 counter 都会递增 1。 但是计数器 counter 计数器内的值是无法读取的。 这时候需要通过设定一个 CAPTURE Task,捕获计数器 counter 的值 存储到 CC[n] 寄存器内, 然后在对 CC[n] 寄存器进行读取。

定时器计数的使用(寄存器版本):

void timer0_init(void)
{
    NRF_TIMER0->MODE    = TIMER_MODE_MODE_Counter;      // Set the timer in counter Mode.
    NRF_TIMER0->BITMODE = TIMER_BITMODE_BITMODE_24Bit;  // 24-bit mode.                   
}
...
//启动定时器	
NRF_TIMER0->TASKS_START=1;	
while(1){
...
 NRF_TIMER0->TASKS_COUNT         = 1; //手动启动计算
 NRF_TIMER0->TASKS_CAPTURE[0]    = 1; //启动捕获,计数器里的值放入CC[n]
 
 //获取计数值
 timVal = NRF_TIMER0->CC[0];
...
}

定时器计数的使用(库函数版本):

 void timer0_init(void)
{
	 uint32_t err_code = NRF_SUCCESS;
	  //定义定时器配置结构体,并使用默认配置参数初始化结构体
    nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;	
	  //Timer0配置为计数模式
    timer_cfg.mode = NRF_TIMER_MODE_COUNTER;

	  //初始化定时器,定时器工作于计数模式时,没有事件,所以无需回调函数
   // err_code = nrfx_timer_init(&TIMER_COUNTER, &timer_cfg, my_timer_event_handler);
	  err_code = nrfx_timer_init(&TIMER_COUNTER, &timer_cfg, NULL);
    APP_ERROR_CHECK(err_code);
}

...
//启动定时器
nrfx_timer_enable(&TIMER_COUNTER);
while(1){
...
/* 计数器加1 */
nrfx_timer_increment(&TIMER_COUNTER);	
//获取计数值
timVal = nrfx_timer_capture(&TIMER_COUNTER,NRF_TIMER_CC_CHANNEL0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nRF52832学习记录(四、定时器) 的相关文章

  • 蓝牙之二十-设备类型

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

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要
  • 蓝牙AVRCP协议解析

    在这里讨论蓝牙的AVRCP协议 要理解AVRCP 需要先了解AVCTP 我们分两个部分来进行 1 AVCTP协议 2 AVRCP协议 下面先来看AVRCp协议 一 概述 1 定义 AVCTP Audio Video Control Tran
  • ESP32 LVGL8.1 实现太空人显示(29)

    文章目录 一 ESP32 LVGL工程配置 1 1从库中下载LVGL代码 1 2配置适合ESP32 液晶屏 1 3编译下载测试 二 GIF图片处理 2 1下载gif图片 2 2将gif图片按照帧率导出成图片 2 3导出的图片背景处理 2 4
  • 蓝牙之十一 AVRCP协议

    Profile简介 AVRCP子协议的作用是支持CT控制TG 具体来说如果手机和一个蓝牙音箱设备连接上了 那么音箱可以控制手机播放 暂停 切歌以及获得手机上播放歌曲的信息 如专辑 歌名 歌手 时长等信息 iphone对信息获取支持较为完善
  • Android 蓝牙串口通信Demo

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

    Linux蓝牙系统 3 Linux 命令 2010 09 27 10 45 44 分类 LINUX Andrew Haung bluedrum 163 com 一 Linux对于蓝牙的支持 参见如下协议图 在HCI界面之上需要软件来实现 1
  • STM32+HC-05蓝牙模块学习与使用

    HC 05蓝牙串口通信 HC05模块是一款高性能主从一体蓝牙串口模块 是一种集成蓝牙功能的PCBA板 用于短距离无线通信 十分方便 从某宝商家那里可以看到 蓝牙可以使用多种方法使用 这里我使用的是蓝牙主机连接 所以我们这里需要准备的器件 两
  • BES2300X,BES2500X——UI(按键,提示音,指示灯)

    前言 BES2300X BES2500X系列博文请点击这里 本文是BES2300X BES2500X系列博文UI部分 一个耳机 音箱 UI是联系使用者与开发者最直接的一个窗口 当然 对于吾等码农而言 UI设计并不是我们最关心的 我们主要做的
  • BLE MESH组网(五)配置BLE MESH

    BLE MESH 五 配置BLE MESH 前言 概述 配置协议 供应程序 信标 邀请 交换公钥 前言 2017 年 5 月 全球最臭名昭著的勒索软件 WannaCry 在全球范围内积极攻击计算机 劫持用户数据索要赎金 这次攻击影响了 15
  • 微信小程序连接蓝牙设备流程(一)

    微信小程序的特点是无需下载App 只要是安装有微信的一部智能手机 几乎就可以运行微信小程序 基于这个特点 我设计了一款小程序版的蓝牙串口助手 适用于简单的蓝牙串口调试工作 从事蓝牙相关产品研发的兄弟们知道 手机端的像LightBlue BL
  • windows10连接小米耳机Redmi AirDots 2

    1 控制面板 2 添加蓝牙设备 3 搜索 4 下一步 如果链接不上 请删除已有设备从第一步开始重新做
  • 安卓蓝牙广播大全

    android bluetooth 提供了皆如扫描设备 连接设备以及对设备间的数据传输进行管理的类 这些类对蓝牙设备进行功能性管理 蓝牙模块API提供的应用包括了 扫描其它蓝牙设备 通过查询本地蓝牙适配器来匹配蓝牙设备 建立RFCOMM 无
  • DA14585 SDK介绍

    我用的DA14585SDK版本是6 0 12 1020 2 的版本 参考文档http lpccs docs dialog semiconductor com UM B 118 DA14585 DA14531 SDK Porting Guid
  • [Filco]蓝牙连接键盘

    第一次用蓝牙键盘 断连后的重连太痛苦了 蓝牙里搜不到键盘 搜到了PIN码不知道输入什么 不输入PIN码连接 Filco方法 控制面板 设备和打印机 点击 添加设备 搜索到 Filco 点击下一步 尝试从设备输入 对着数字敲 然后Enter就
  • 蓝牙之十八- bluetooth pair

    蓝牙之十八 bluetooth pair 在蓝牙核心规范2 1之后 蓝牙配对除了传统的PIN Code Pairing方式外 新增了Secure Simple Pairing配对方式 根据核心规范4 2 简单配对主要有两种目的 蓝牙配对过程
  • 蓝牙(二)蓝牙搜索、配对、连接

    1 搜索 从上一节我们可以知道 蓝牙状态发生了改变 并发生了回调 咱们就从回调开始 DevicePickerFragment java 用于蓝牙设置界面的蓝牙配置和管理 Override public void onBluetoothSta
  • 蓝牙之十三-HFPclient JNI层

    JNI到app JAVA
  • 蓝牙之四-Handler

    Handler机制 Handler允许用户发送和处理Message以及线程MessageQueue相关的可运行对象 每个Handler实例都对应一个单线程以及该线程的MessageQueue 当创建新的Handler时 该Handler将被
  • android bluetooth UUID蓝牙查询表

    UUID是 Universally Unique Identifier 的简称 通用唯一识别码的意思 对于蓝牙设备 每个服务都有通用 独立 唯一的UUID与之对应 也就是说 在同一时间 同一地点 不可能有两个相同的UUID标识的不同服务 以

随机推荐

  • xps数据怎么导出为txt_如何处理XPS原始数据

    盼了好久 终于盼来了XPS的分峰拟合教程 拿到XPS的实验结果 首先我们要会看XPS高分辨谱原始数据 XPS高分辨谱的原始数据一般为 xls 文件 打开该文件 我们可以看到各种特定元素的高分辨谱及对它们进行半定量分析的原始数据 如下图 记住
  • 数据结构——线性表

    目录 2 1线性表的定义和特点 2 2案例引入 2 3线性的类型定义 基本操作 一 基本操作 二 基本操作 三 基本操作 四 基本操作 五 2 4线性表的顺序表示和实现 线性表的顺序存储结构占用一片连续的存储空间 顺序表中元素存储位置的计算
  • 微服务容器化实践——微服务设计拆分方法论

    文章目录 微服务设计原则 垂直划分优先原则 持续演进原则 服务自治 接口隔离原则 自动化驱动原则 微服务划分方法 基于数据驱动划分服务 基于领域驱动划分服务 从已有单体架构中逐步划分服务 就像很难用一个绝对的方式去判断架构的好坏一样 在大多
  • IDEA配置方法注释

    IDEA类和方法注释模板设置 非常详细 百度文库 一 设置类的注释模板 1 选择File Settings Editor File and Code Templates Files Class 可以看到创建Class时引入了一个参数 Fil
  • 微信授权网页扫码登录php,PHP实现微信开放平台扫码登录源码

    1 首先到微信开放平台申请https open weixin qq com 获取到appid和APPSECRET 前台显示页面如下html gt var obj new WxLogin id login container appid wx
  • 基于javaweb的音乐网站

    Springboot springmvc mybatis 数据库mysql 开发工具不限 前台 html css js 实现了注册 登陆 权限校验 上传歌曲 下载歌曲 播放歌曲 删除歌曲 个人歌单 后台 用户管理 mv上传 播放 歌曲新增
  • JVM安全点详解

    1 安全点是什么 在虚拟机在进行可达性分析时 HotSpot虚拟机会在特定的位置记录在哪有引用 这些特定的位置就叫做安全点 2 安全点的作用是什么 上边已经说过了 在Oomap的帮助下 HotSpot虚拟机很快就完成了GC Roots枚举
  • Java基础之——Stream 流、方法引用

    Stream 流 方法引用 1 Stream 流 1 1 引言 传统集合的多步遍历代码 几乎所有的集合 如 Collection 接口或 Map 接口等 都支持直接或间接的遍历操作 而当我们需要对集合中的元素进行操作的时候 除了必需的添加
  • 第八章 课后习题

    习题 一 填空题 1 在C 的输入输出系统中 最核心的对象是 流 执行输入和输出操作的类体系叫做 流类 2 当实际进I O操作时 cin与 标准输入 设备相关联 3 C 的流类库预定义了4个流 它们是 cin cout cerr 和 clo
  • 练手题 ——《应该被禁止的Leetflex账户》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • Kafka的安装是否成功的简单测试命令

    Kafka的安装是否成功的简单测试命令 首先了解一下kafka的基本概念 1 Broker Kafka集群包含一个或多个服务器 这种服务器被称为broker 2 Topic 每条发布到Kafka集群的消息都有一个类别 这个类别被称为Topi
  • 洛谷P1220 关路灯 (区间动态规划)

    https www luogu org problemnew show P1220 题解 对于从第i个点走到第j个点 肯定会将 i j 的路灯全部关闭 考虑关闭第i 1个点 现在可能有两种状态 关完 i j 之后位于i 或者位于j 所以设计
  • 【error】 Request method ‘GET‘ not supported app端调用后台接口报错,后台人员自己调用时没问题

    目录 问题描述 原因分析 解决方案 方法一 方法二 方法三 联系自身 问题描述 org springframework web HttpRequestMethodNotSupportedException Request method GE
  • TS 函数

    在 TS 中 要使用函数 要求必须约束函数参数和返回值的类型 一 基础语法 1 JS 中函数 函数声明式 function 函数名 参数 return 返回值 函数表达式 const 变量名 function 参数 return 返回值 2
  • 3个赚钱思路和案例,都是暴利赚钱项目,最后一个你肯定见到过

    3个赚钱思路和案例 最后一个你肯定见到过 赚钱思路1 浙江两兄弟在淘宝开一家 西京超市 不进货不配送 就是利用程序爬京东的单品页 顾客下单再到京东下单 京东的配送效率没的说 又是快消品 几个月就升到金冠 他们利用淘宝的流量和京东的物流服务积
  • linux设置http/https proxy及忽略proxy的方法

    一 场景 有些linux服务器处于内网 并且没有公网ip 故要想与外网进行http https通信只能通过nat或者加proxy的方式 nat服务器有网段的限制 而http https proxy代理则没有 使用起来也方便 但是 使用htt
  • 【mfc】学生信息管理,实现List控件节点的增删改查

    之前在mfc这个专栏里面 写了很多关于win32的程序 其实也没什么的 win32是mfc的基础 mfc只是win32的扩展 系统自带的扩展 新建一个mfc如同新建一个win32程序 不过这个win32程序一开始就带了很多空函数框架 一 基
  • PG库分页查询数据异常(数据重复、数据丢失)-- 解决一次生产问题

    问题描述 有一个功能更新数据库时在生产环境下突然存在部分记录未被更新 需要把所有的记录更新 采取的是分页进行更新 但是每次更新以后都会出现部分业务没有被更新 排查过程 1 测试环境重现问题 在测试环境重现问题 发现测试环境也有这个问题 2
  • PHP在linux上执行外部命令

    http www douban com note 211492486 一 PHP中调用外部命令介绍 在PHP中调用外部命令 可以用 1 gt 调用专门函数 2 gt 反引号 3 gt popen 函数打开进程 三种方法来实现 方法一 用PH
  • nRF52832学习记录(四、定时器)

    一 nRF52832 定时器基本介绍 nRF52832 包含了 5个定时器模块 定时器有着不同的位宽选择 8 16 24 32位 通过BITMODE 寄存器的 第 0 1 位 选择 nRF52832 的定时器的内部结构 1 时钟源 定时器工