nrf51822学习笔记之GPIOTE
嵌入式GPIO学习笔记
GPIO学习笔记一、GPIO工作原理根据具体型号不同,STM32F103微控制器的GPIO可以提供最多112个多功能双向I/O引,这些1/O引脚GPIOA,GPIOB、GPIOC、GPIOD、GPIOE、GPIO和GPG等端口中,其中,端口号通常以大写字母命名,从“A”开始,依次类推,每个端口有16个I/O引脚,通常以数字命名,从0开始,直到15为止。
例如,STM32F103RCT微控制器的GPIOA有16个引脚、分别为PAO、PA1,PA2,……PA15。
二、内部结构输出驱动器(普通输出,复用功能输出):由多路选择器、输出控制和一对互补的MOS管组成。
输入驱动器:(模拟输入,上拉输入,下拉输入,浮空输入)由TTL肖特基触发器、带开关的上拉电阻电路盒带开关的下拉电阻电路组成。
三、工作模式:(1)普通推挽输出:引脚可输出低电平和高电平,用于较大功率驱动的输出。
(2)普通开漏输出:引脚只能输出低电平。
(3)复用推挽输出:引脚不仅具有推挽输出的特点,还使用片内外设的功能。
(4)复用开漏输出:引脚不仅具有开漏输出特点,而且还使用片内外设功能。
(5)上拉输入:用于默认上拉至高电平输入。
(6)下拉输入:用于默认下拉至高电平输入。
(7)浮空输入:用于不确定高电平输入。
(8)模拟输入:用于外部模拟信号输入。
四、GPIO相关库函数:GPIO_DeInit:将外设GPIOx寄存器恢复为复位启动时的默认值。
GPIO_Init:根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器。
GPIO_SetBits:指定GPIO端口的指定引脚置高电平。
GPIO_ResetBits:指定GPIO端口的指定引脚置低电平。
GPIO_Write:向指定GPIO端口写入数据。
GPIO_ReadOutputDataBit:读取指定GPIO端口的指定引脚的输出。
GPIO_ReadOutputData:读取指定GPIO端口的输出。
nRF51822外部中断学习总结
最近要用nRF51822进行项目的多任务调度,其中不可避免的要用到要用到nRF51822的相关中断首先,nRF51822是基于Cortex-M0架构的MCU,根据nRF51822的软件开发包中的core-m0.h文件夹,可以找到51822的相关中断编号定义(Interrupt Number Definition)[objc]view plain copy1.<span style="font-size:18px;">/* ------------------------- Interrupt Number Definition ------------------------ */2.3.typedef enum {4./* ------------------- Cortex-M0 Processor Exceptions Numbers ------------------- */5. Reset_IRQn = -15, /*!< 1 Reset Vector, invoked on Powerup and warm reset */6. NonMaskableInt_IRQn = -14, /*!< 2 Non maskable Interrupt, cannot be stopped or preempted */7. HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault*/8. SVCall_IRQn = -5, /*!< 11 System Service Call via SVC instruction */9. DebugMonitor_IRQn = -4, /*!< 12 Debug Monitor*/10. PendSV_IRQn = -2, /*!< 14 Pendable request for system service */11. SysTick_IRQn = -1, /*!< 15 System Tick Timer*/12./* ---------------------- nRF51 Specific Interrupt Numbers ---------------------- */13. POWER_CLOCK_IRQn = 0, /*!< 0 POWER_CLOCK*/14. RADIO_IRQn = 1, /*!< 1 RADIO*/15. UART0_IRQn = 2, /*!< 2 UART0*/16. SPI0_TWI0_IRQn = 3, /*!< 3 SPI0_TWI0*/17. SPI1_TWI1_IRQn = 4, /*!< 4 SPI1_TWI1*/18. GPIOTE_IRQn = 6, /*!< 6 GPIOTE*/19. ADC_IRQn = 7, /*!< 7 ADC*/20. TIMER0_IRQn = 8, /*!< 8 TIMER0*/21. TIMER1_IRQn = 9, /*!< 9 TIMER1*/22. TIMER2_IRQn = 10, /*!< 10 TIMER2*/23. RTC0_IRQn = 11, /*!< 11 RTC0*/24. TEMP_IRQn = 12, /*!< 12 TEMP*/25. RNG_IRQn = 13, /*!< 13 RNG*/26. ECB_IRQn = 14, /*!< 14 ECB*/27. CCM_AAR_IRQn = 15, /*!< 15 CCM_AAR*/28. WDT_IRQn = 16, /*!< 16 WDT*/29. RTC1_IRQn = 17, /*!< 17 RTC1*/30. QDEC_IRQn = 18, /*!< 18 QDEC*/31. LPCOMP_COMP_IRQn = 19, /*!< 19 LPCOMP_COMP*/32. SWI0_IRQn = 20, /*!< 20 SWI0*/33. SWI1_IRQn = 21, /*!< 21 SWI1*/34. SWI2_IRQn = 22, /*!< 22 SWI2*/35. SWI3_IRQn = 23, /*!< 23 SWI3*/36. SWI4_IRQn = 24, /*!< 24 SWI4*/37. SWI5_IRQn = 25 /*!< 25 SWI5*/38.} IRQn_Type;39.</span>在进行中断处理时,一般都要按照这个步骤:1、对要用到的中断初始化;2、对用到的中断进行使能;3、对中断进行优先级设置1、中断初始化nRF51822的外部I/O(暂时理解的程度以及用过的中断只有I/O中断,其他中断没有实践过)中断是基于任务和事件模式的。
NORDIC蓝牙芯片NRF51822说明-文档资料
四、蓝牙协议和应用代码相互分开
1:NRF51822蓝牙协议和应用代码的存储空 间相互分开,互不干扰,客户只需关注
应用代码
应用代码开发,不需花大量的时间去了解蓝 176K
牙协议是如何运行的,只需配置API参数就
可运行起来。
2:TI和CSR都是只提供蓝牙源代码,客户 蓝牙协议
只能在此代码上进行修改、编译程序,把 80K 应用代码和协议混合放在同一空间里,给修
灵敏度
-94dBm -85dBm -82dBm
51822
ARM M0 256/128K ROM 16k RAM
4dBM 0dBM -4dBM -8dBM -12dBM -16dBM -20dBm
LDO 16/4dB 10.5/0dB
RX 13
DC/DC 10.5/4dB 8.1/0dB
RX 9.5
250Kbps 1Mbps 2Mbps
■ CSR:自有16位MCU,需外挂Flash/EEPROM, 无法对产品进行加密,同时增加了相应的成本和 PCB板面积。
9
二、新增功能
■电源管理:除system ON/OFF外,各功能 模块有自己的电源管理,电源管理简单,只 有ON/OFF,有利于降低功耗。
■具有DC/DC 功能: 2.1~3.6V,DC/DC功 能可以让功耗更低。
2
nRF51822功耗/灵敏度
3
nRF51822原装开发系统
原装开发系统包括2部分 1:nRFGo Starter Kit Development Kit (简称nRF6700) 包括2个开发母板,开发调试环境,支持Keil C
2:nRF51822 Development Kit (简称nRF51822-DK) 1个nRF51822 USB dongle接收端 1个nRF51822 PCB模块 1个nRF51822 SMA模块 2个J-Link开发板(烧录、仿真) 5片nRF51822样片
nRF51822之PWM学习笔记
1 : 0);
Page 1
app_pwm.c
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 return; } /**函数描述:使能指定PWM实例IRQ * * 参数[in] p_instance PWM实例 */ __STATIC_INLINE void pwm_irq_enable(app_pwm_t const * const p_instance) { nrf_drv_timer_compare_int_enable(p_instance->p_timer, PWM_MAIN_CC_CHANNEL); } /**函数描述:除能指定PWM实例IRQ中断使能标识 * * 参数[in] p_instance PWM实例 */ __STATIC_INLINE void pwm_irq_disable(app_pwm_t const * const p_instance) { nrf_drv_timer_compare_int_disable(p_instance->p_timer, PWM_MAIN_CC_CHANNEL); }
//禁止定时器中断 nrf_drv_timer_compare_int_disable(m_instances[timer_instance_id]->p_timer, PWM_MAIN_CC_CHANNEL); app_pwm_cb_t * p_cb = (app_pwm_cb_t *)m_instances[timer_instance_id]->p_cb; //调用PWM完整周期结束回调函数 用于设置标志位 通知应用程序 p_cb->p_ready_callback(timer_instance_id); }
nrf51822数据手册_引脚图_参数
RoHS and REACH statement
Nordic Semiconductor's products meet the requirements of Directive 2002/95/EC of the European
My Page account on our home page.
Main office: Otto Nielsens veg 12
7052 Trondheim Norway
Phone: +47 72 89 89 00 Fax: +47 72 89 89 89
Mailing address: Nordic Semiconductor
Version 3.3
Description
Added documentation for the nRF51822 CTAA version of the chip.
Added content: • Section 9.5 “CTAA WLCSP package” on page 71 • Section 11.9 “CTAA WLCSP package” on page 118
statement can be found on our website
.
Page 2
nRF51822 Product Specification v3.3
Datasheet Status
Status Objective Product Specification (OPS) Preliminary Product Specification (PPS)
• ARM® Cortex™-M0 32 bit processor • 275 μA/MHz running from flash memory • 150 μA/MHz running from RAM • Serial Wire Debug (SWD)
nrf51822学习笔记之PPI
Programmable Peripheral Interconnect (PPI)功能:PPI 可以实现不同的外设之间通过tasks和events进行自主互动,而不需要用到CPU。
The Programmable Peripheral Interconnect (PPI) enables different peripherals to interact autonomously with each other using tasks and events and without having to use the CPU.一个外设的event可以触发另外一个外设的task。
The PPI provides a mechanism to automatically trigger a task in one peripheral as a result of an event occurring in another peripheral.PPI通道的作用是使一个event链接着一个task,每个PPI通道由两个端点寄存器(end-point registers)组成:event端(EEP)和task端(TEP)。
A task is connected to an event through a PPI channel. The PPI channel is composed of two end-point registers, the Event End-Point (EEP) and the Task End-Point (TEP).一个外设的task 是通过该task的任务寄存器地址(the address of the task register)与TEP 相连的。
同理event…。
当应用程序存在实时要求(real-time constraints exist),又不需要CPU参与时,PPI可以实现外设之间的精确同步。
嵌入式学习笔记之GPIO详解
嵌入式学习笔记之GPIO详解一、什么是GPIO:GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。
在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。
而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。
对这些设备/电路的控制,使用传统的串行口或并行口都不合适。
所以在微控制器芯片上一般都会提供一个通用可编程IO接口,即GPIO。
接口至少有两个寄存器,即通用IO控制寄存器与通用IO数据寄存器。
数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立的加以设置。
这样,有无GPIO接口也就成为微控制器区别于微处理器的一个特征。
二、GPIO之LCD控制编程:S3C2440有130个I/O端口,分为A-J共9组:GPA、GPB、、、、GPJ,可以通过设置寄存器来确定某个引脚用于输入、输出还是特殊功能。
比如:可以设置GPH6作为输入、输出、或者用于串口。
1、通过寄存器来操作GPIO引脚1)GPxCON寄存器它用于配置引脚的功能端口A与端口B-J在功能上有所不同,GPACON 中每一位对应一根引脚(共23根引脚)当某位为0时,对应引脚为输出,此时在GPADAT 中相应位写入0或1,让此引脚输出低电平或高电平;当某位被设为1时,对应引脚为地址线或用于地址控制,此时GPADAT保留不用。
GPACON通常被设为全1,以便访问外部存储设备端口B-J在寄存器操作上完全相同,PxCon中每两位控制一根引脚,00表示输入,01表示输出,10表示特殊功能,11保留不用。
2)GPxDAT寄存器它用于读写引脚,当引脚被设为输入时,读此寄存器得到对应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高低电平。
我的nrf51822学习笔记
6月14日开发环境的搭建:/view/a9ce127908a1284ac85043dd.html前几天学习了nrf51822芯片详解/link?url=NoIPFYcVFVQiqtgcTIVDbTFKJsfSY0MnBKiQzptXa8Cirghc3ZCx2S TEduYpEMztfAdoMTN08Xf2pFZpAyJbYF_MV7NqPxyWwA1qFPkKOoW以前已将SDK,J-Link安装好。
今天开始学习nRF51822 在MDK中创建新工程/link?url=BGtmdmEEJg3lzoEFq7HB3LBTbZn2L9fD7rGiwBPYQkbR-gEQuw ScXm5L-DIMHjifN2FNsRgbQJv9uaT03cp2AnJZUbLm5htwoIbJLu8tdv7遇到如下问题:1、注:首先选择Nordic nRF51 Series Devices才能开始选择芯片类型(安装SDK才能有)。
我买的芯片上面显示nrf51822QFACA1,该选择AA还是AB?网上搜得AA与AB的区别为只是flash与运行代码大小的区别。
淘宝介绍说该芯片为256Kbflash,所以应该是QFAA。
6月15日关于JLINK用SWD模式与nrf51822的连接。
我连接的是GND(随便哪个地),VCC(pin1),TMS(pin7),TCK(pin9). 网上说可能还得接pin15的复位脚,但是我暂时没接。
接下来就是讲程序烧录看行不行。
1、有个问题,网上找的那个创建工程中并没有用户自己的文件(即像stm32中创建的时候会建立mai.c)不是很明白。
编译能通过,但是load的时候出现问题。
2、Load时出现如下错误:但是reset菜单没找到在哪里?又出现新问题:解决方法:第一次的时候没有遇到这个问题,所以可能是连线没接好,而且后来的jlink总感觉绿灯是闪亮的,很有可能是连线问题。
网上的答案:1.确保接线正确;2. 高版本jlink固件可识别出赝品jlink,而MDK5.x版本要求SEGGER固件高于V4.78,排查是否是盗版jlink导致该问题发生。
NRF51822 DFU使用笔记
DFU使用笔记BLE空中升级修订历史2017-2-8K[公司地址]目录1. 概述 (1)2. 服务创建 (1)3. 操作流程 (2)3.1下载dfu Bootload (2)3.2准备升级的image (2)3.3执行升级 (2)4. 交互过程 (3)1. 概述DFU(Device Firmware Updates设备固件升级),一般指的是在产品已经发布后,通过某种方式,更改产品的固件,来完成产品的bug修复和新特性的支持。
DFU的方式有很多种,本文档只讨论使用OTA(Over-the-Air空中升级)的方式。
DFU控制器通过BLE将升级程序传输到待升级的设备中,待升级设备将自己完成固件替换,如图1.1为两者角色关系。
一般为手机APP MWV602图1.1 角色关系注:关于DFU Controler,目前使用的是nRF Toolbox工具,现在完成的进度是手机和MWV602完成两者交互过程,并没有完成协议栈分区以及Flash实际程序更新。
由于Flash变更、协议栈以及时间的关系,没有进行下一步工作。
nRF Toolbox是Nordic公司的APP,没有对源码进行任何修改,MWV602的DFU也是从官方移植过来。
蓝牙SIG组织并没有规定DFU的传输协议,由厂商自由发挥,本文档参考的是Nordic 定义的一套升级协议。
2. 服务创建DFU升级服务使用了两个特征值,一个特征值用于传输升级程序,另外一个特征值用于完成整个控制信息,两者缺一不可。
表2.1 特征值要求创建服务后的效果如图2.1所示。
图2.1 dongle发现的DFU服务3. 操作流程3.1 下载dfu Bootload打开DFU工程所在路径:{…}\jm_soc_1.1\Project\prj_dfu\Keil直接下载即可。
3.2 准备升级的image1)获取app的二进制镜像文件,在Keil环境下可添加以下命令生成。
fromelf --bin --output . <outfile.bin><infile.axf>假设生成的文件名称为ble_app_hrs.bin。
NRF51822之定时器
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; }
而 GPIOTE 则是 GPIO 任务事件块,用来规定当前能用多少 GPIO 的任务事件。 NRF51822 有三个定时器。 一个 24 位的,两个 16 位的。
Instance Bit-width Capture/Compare regiters
TIMER0 24
4
TIMER1 16
4
TIMER2 16
成初始化
p_timer->MODE = TIMER_MODE_MODE_Timer; //定时器模式,还有另一种模式,计数器,Counter
p_timer->PRESCALER = 9;
//预分频,f=16M/2^(prescale),最大为 9,即最
大 512 分频
p_timer->BITMODE = TIMER_BITMODE_BITMODE_16Bit; //定时器位宽
NRF51822 之定时器
一、了解
NRF51822 的定时器是运行在系统的高频率下面的, HFCLK = 16 MHz ,包括一个四位的 分频器,用来对 HFCLK 进行分频。也就是说,最大 16 分频。
由于其丰富的定时器任务、时间和中断特点,所以可编程外设互连系统能够与任何外设进行 互连使用时,进行定时或计数。可编程外设互连系统(PPI)能用使用任何一个 GPIO 口输出周期 性的信号和 PWM 波。在同一时间内,输入或者输出的数目收到 GPIOTE 模块的数目的限制。
nrf51822学习笔记之Peripheral interface
Peripheral interface外设接口所有外设可通过AHB和APB总线寄存器被访问,就如同通过task, event, interrupt寄存器进行访问一样.1、外设ID:每个外设都分配了0X1000 bytes 的空间,也就是说每个外设在APB总线上一共有1024个4 bytes的寄存器(0X1000=4096),第一个外设的基地址是0x4000 0000, ID号为0. 基地址为0x4000 1000的外设ID号为1,依次类推基地址为0x4001 F000的外设ID号为31.2、TASK :作用:用来触发外设的动作(actions),例如开始某个特定的行为。
外设都能实现不同的Task,每个Task在该外设任务寄存器组(peripheral’s task register group) 中都有一个单独的寄存器触发条件:可以通过软件写“1”到任务寄存器(task register)或者由外设本身或其他外设触发相应的任务信号来触发某个TASK3、Event:作用:用来通知外设或CPU某个事件发生了,例如某个外设的状态改变了。
一个外设能够产生多个Event,每个Event在事件寄存器组(peripheral’s event register group)中都有一个单独的寄存器。
产生条件: 外设本身触发了某个事件信号(event signal),于是事件寄存器(event register)会更新用以反映该事件的发生。
事件寄存器只有在软件向其写0的时候,才会被清零。
4、Shortcuts:链接同一个外设的事件(event)和任务(task)的快捷方式,当事件发生的时候可以通过Shortcuts直接触发任务。
与PPI的功能类似,但是传播时间比PPI更短。
快捷方式是被预先定义了的,用户不可以通过软件配置,用户只能对其进行使能和关闭。
一个快捷方式占1位,每个外设最多32个快捷方式。
5、Interrupts:中断由事件(event)产生,可以打断CPU程序流。
nRF51822芯片详解解读
0、功能简介IC功能包括:256kB片上闪存和16kB RAM;数字和混合信号周边,包括SPI、2-wire、ADC以及正交解码器;16 PPI通道;撘配片上LDO时电源范围为1.8-3.6V,LDO旁路模式为1.75-1.95V ;片上下拉DC/DC转换器用于3V电池(例如,纽扣电池);片上+/- 250 ppm 32kHZ RC振荡器,在蓝牙低功耗应用,不需外部32kHz晶体,可节省成本和电路板空间;6x6mm 48脚QFN封装,提供最多可达32个GPIO;完整的蓝牙协议堆栈(到配置文件的链接层)。
nRF51822的S110是可下载、免版税、预编译二进制蓝牙低功耗堆栈,可独立编程和更新。
功能包括:异步和事件驱动SVC的API;运行时保护;GATT、GAP和L2CAP级别API;周边和广播器角色;GATT客户端和服务器;和2.4GHz RF专用协议的非并行多协议操作;少于128kB的代码和6kB的RAM,为应用程序留有超过128kB的闪存和10kB的RAM;与使用上一代nRF8001的双芯片应用相比,运行S110堆栈的nRF51822削减了高达50%的功耗。
S110堆栈和nRF51822加上nRF518 SDK相互配合,nRF518包含全面的蓝牙低功耗配置文件、服务以及示例应用集合。
1、架构围绕两条内部总线展开:AHB,APB AHB (Advanced High Performance BUS):CPU: ( Cortex-m0,NVIC,BBB,DAP)Memory : ( RAM, Flash)GPIO : P0(P0.0~P0.31)AHB to APB BridgeAPB (Advanced Peripheral BUS):左半边:Power:电源控制WDT:看门狗SPI0,SPI1TIMER0(32位),TIMER1(16位),TIMER2(16位)QDEC:正交译码器,CLOCK:提供两个时钟:HFCLK(16MHZ),LFCLK(32.768KHZ)TWI0,TWI1:两线接口,兼容I2C右半边:NVMC :非易失性存储控制器RADIO: 2.4GHZ 无线广播的数据率:250KBPS,1MBPS,2MBPS ECB: 加密功能(AES),产生HASH序列,数字签名,生成密钥流等RNG:产生随机数用于加密(基于内部热噪声),无需种子值。
gpio常用寄存器解释
gpio常用寄存器解释GPIO是通用输入输出的缩写,是一种常见的硬件接口。
在嵌入式系统或单片机开发中,GPIO常用于与外部设备进行数据交互。
GPIO常用寄存器是用来控制和设置GPIO引脚的寄存器。
下面是几个常用的GPIO寄存器的解释:1. GPIO方向寄存器(GPIODIR):该寄存器用于设置GPIO引脚的输入或输出方向。
当某一位为1时,表示该引脚为输出模式;当某一位为0时,表示该引脚为输入模式。
2. GPIO数据寄存器(GPIODATA):该寄存器用于读取或设置GPIO引脚的数据。
当引脚为输出模式时,可以通过该寄存器设置引脚的输出值;当引脚为输入模式时,可以通过该寄存器读取引脚的输入值。
3. GPIO中断使能寄存器(GPIOIE):该寄存器用于启用GPIO引脚的中断功能。
当某一位为1时,表示该引脚的中断功能被启用;当某一位为0时,表示该引脚的中断功能被禁用。
4. GPIO中断状态寄存器(GPIOIS):该寄存器用于检测GPIO引脚的中断状态。
当某一位为1时,表示该引脚触发了中断;当某一位为0时,表示该引脚未触发中断。
读取该寄存器后,需清零相应引脚的中断状态。
5. GPIO上升/下降沿触发寄存器(GPIOIBE):该寄存器用于设置GPIO引脚的中断触发方式。
当某一位为1时,表示该引脚的中断触发方式为上升沿和下降沿;当某一位为0时,表示该引脚的中断触发方式为边沿触发。
通过使用这些GPIO常用寄存器,开发者可以灵活地控制和配置GPIO引脚的操作模式、数据传输和中断触发等功能。
在嵌入式系统中,GPIO的应用非常广泛,例如控制外部LED灯的亮灭、读取外部传感器的数据等。
熟悉并理解这些寄存器对于嵌入式系统的开发非常重要。
NRF51822学习笔记之GPIOTE
GPIOTE :功能:利用任务(task)和事件(event)对GPIO口进行访问。
可以通过CONFIG[n] registers 对task和event进行配置。
输出Task 可以用来执行以下对管脚的写操作:Set 置1Clear 清0Toggle 翻转利用输入引脚的检测信号(DETECT signal)可以产生以下event:Rising edge 上升沿Falling edge 下降沿Any change 任何改变/*nrf_gpiote_task_config(uint32_t channel_number,uint32_t pin_number,nrf_gpiote_polarity_t polarity,nrf_gpiote_outinit_t initial_value)说明:GPIOTE有4个通道Channel channel_number [0: 3]31个IO pin可作为通道pin_number[0:30] 即每个IO引脚都有GPIOTE通道方式:NRF_GPIOTE_POLARITY_LOTOHI = GPIOTE_CONFIG_POLARITY_LoToHi, ///< Low to high NRF_GPIOTE_POLARITY_HITOLO = GPIOTE_CONFIG_POLARITY_HiToLo, ///< High to low NRF_GPIOTE_POLARITY_TOGGLE = GPIOTE_CONFIG_POLARITY_Toggle///< Toggle } nrf_gpiote_polarity_t;通道配置后的初始值:NRF_GPIOTE_INITIAL_VALUE_LOW = GPIOTE_CONFIG_OUTINIT_Low, ///< Low to high NRF_GPIOTE_INITIAL_VALUE_HIGH = GPIOTE_CONFIG_OUTINIT_High ///< High to lowPIN:????? OUT[n] tasks and the IN[n] events输入事件导致输出任务 The tasks can be used for writing to individual pins, theevents can be generated from changes occurring at the inputs of individual pins. Every pair of OUT[n] tasks and IN[n]events has one CONFIG[n] register associated with it. When an OUT[n] task or an IN[n] event has been configured to operate on a pin, the pin canonly be writtenfrom the GPIOTE module. Attempting to write a pin as a normal GPIO pin will have no effect.当IO配置为GPIOTE后,GPIO操作将无效,直到GPIOTE释放此脚 PORT event。
nrf51822学习笔记之TIMER
大量的TIMER task/event及中断,可以使各种系统外设(包括GPIO)通过PPI 系统执行定时或记数任务(timing/count tasks).PPI系统也可以使能定时器(TIMER task/event features)来产生周期性输出(periodic output)或PWM信号到任意的GPIO口。
The PPI system also enables the TIMER task/event features to generate periodic output and PWM signals to any GPIO.定时计数器的时钟源是HFCLK,并可以通过一个4 bit (1/2X) 分配器对HFCLK进行分频.TIMER可以处于两种模式:1定时模式(Timer mode)2计数模式(Counter mode)两种模式都可以通过触发启动或停止任务(START task or STOP task)来启动或停止TIMER。
TIMER是count-up timer:Timer mode:每个定时器周期(F TIMER),内部计数寄存器(Counter register )+1. Counter mode:每次COUNT task被触发的时候,Counter register +1. 此模式下,FTIMER和分频系数就不起作用了。
TIMER可以通过位宽寄存器(BITMODE register)设置计数最大值(maximum value).分频和位宽寄存器(PRESCALER register and the BITMODE register)只能在TIMER停止运行的时候对其进行修改,否则结果难以预料。
当计数超过了最大值时,计数寄存器会溢出,并自动从0重新开始计数。
可通过执行CLEAR task 使TIMER清0。
比较和捕获(Compare/Capture):比较:每个捕获比较寄存器(CC[0..3])都可以产生一个COMPARE event.当某个计数值计到与capture compare register CC[n]中的值相等时,就会产生一个COMPARE[n] event,这两个n 是对应着的。
nrf51822学习记录
目录第一部分:前期准备 (2)1.1软件准备: (2)1.2硬件准备: (2)第二部分:程序编写 (3)2.1编写第一个亮灯程序 (3)2.2一般程序的编写 (10)2.3 ble的编写 (14)1.1软件准备:Keil 4.72以上(4.72版本以下不能调试)JlinkARM 4.86bNrfgo studioNrf51 sdk协议栈s110,s120,s130软件说明:nrf51下载程序有两种途径,一种是keil,一种是nrfgo。
Keil只能下载非ble协议栈的普通程序。
Nrfgo是下载ble协议栈和普通程序的。
1.2硬件准备:认识pca10005(带sma天线),pca10004,pca10000(dongle),具体参考nRF51822_DK_User_Guide_v1.0.pdf(这本书是dk的入门介绍)其他的入门参考文档:nRF51822 PS v1.3 CN 20130903.pdfnRF51822_PS v2.0.pdf (这两个都是产品规格书,可以连接芯片的配置和电气特性,ps1.3是中文版。
Ps2.0是最新版)nRF51_Series_Reference_Manual_v2.1.pdf(nrf51822的具体寄存器使用必须参考这个文档)nRF51822上手指南.pdf(这是ak板的上手中文指南)nRF51822-Kit开发板使用说明.pdf(这是网上大d电子自己生产板子的使用说明可参考)nRF51822 Development Kit - Hardware files 2_0 (这个文件夹里面是dk板的pcb图)2.1编写第一个亮灯程序(由于第一个程序就详细的讲解下)硬件准备:pca10000(dongle)软件准备:blinky_exampl(Keil\ARM\Device\Nordic\nrf51822\Board\pca10001\blinky_example文件下,由于pca10000里没有点灯例程)1.打开blinky.uvproj(依次设置)(这里IROM,IRAM设置要强调下。
nRF51822TimerSample
1.Timer在微處理器的開發上,時脈控制是必需的,把事件分時處理,才能讓微處理器效能才能夠提升,因此如何善用時脈控制是必要的技能。
2.System Clock -nRF51822 Clock 可以分為兩個部分,一部分是 LFCLK 使用是 32KHz 的時脈頻率。
,另一部分HFCLK 是使用 16/32 MHz 的時脈頻率。
2.1.Task2.2.Event2.3.RegisterLFCLK 可以使用外部的振盪器或者使用內部的 32.768KHz RC 振盪器。
由 LFCLKSRC register 來選擇振盪器 Source。
HFCLK 可以使用外部的振盪器或者使用內部的 16MHz RC 振盪器,當系統啟動時,內部的 16MHz RC 振盪器就會啟動,提供給 Clock 給 CPU 和週邊模組。
若使用32MHz 外部的振盪器需要設定XTALFREG register。
當開發者經由 HFCLKSTART Task 來使用外部的振盪器,而內部的振盪器也就會關閉。
當開發者經由 HFCLKSTOP Task 停止外部的振盪器,而內部的振盪器也就會柀自動啟動。
HFCLKSTAT regsiter 來查詢 HFCLK 的狀態。
在使用 RADIO 和 內部 RC 32.768KHz 振盪器校正程序時,都需要用到外部的16/32 MHz 的振盪器。
故 16/32 MHz 的外部振盪器是不能拿掉的,但是 32.768KHz 的外部振盪器是可以省略的。
3.RTCnRF51822 RTC 方塊圖❏RTC 的 Clock Source 是 32.768 KHz,當微處理器需要省電的情形下,16MHz 被停止的情況下,RTC 仍需要可以動作。
同時 LFCLK 的也是使用32.768KHz。
❏COUNTER 的計數是由 32.768 KHz 經過 PRESCALER 計數成 0,PRESCALER會重新載入設定值,同時 TICK Event 也會被觸發。
nrf51822学习笔记之GPIOTE
GPIOTE :功能:利用任务(task)和事件(event)对GPIO口进行访问。
可以通过CONFIG[n] registers 对task和event进行配置。
输出Task 可以用来执行以下对管脚的写操作:Set 置1Clear 清0Toggle 翻转利用输入引脚的检测信号(DETECT signal)可以产生以下event:Rising edge 上升沿Falling edge 下降沿Any change 任何改变/*nrf_gpiote_task_config(uint32_t channel_number,uint32_t pin_number,nrf_gpiote_polarity_t polarity,nrf_gpiote_outinit_t initial_value)说明:GPIOTE有4个通道Channel channel_number [0: 3]31个IO pin可作为通道pin_number[0:30] 即每个IO引脚都有GPIOTE通道方式:NRF_GPIOTE_POLARITY_LOTOHI = GPIOTE_CONFIG_POLARITY_LoToHi, ///< Low to high NRF_GPIOTE_POLARITY_HITOLO = GPIOTE_CONFIG_POLARITY_HiToLo, ///< High to low NRF_GPIOTE_POLARITY_TOGGLE = GPIOTE_CONFIG_POLARITY_Toggle///< Toggle} nrf_gpiote_polarity_t;通道配置后的初始值:NRF_GPIOTE_INITIAL_VALUE_LOW = GPIOTE_CONFIG_OUTINIT_Low, ///< Low to high NRF_GPIOTE_INITIAL_VALUE_HIGH = GPIOTE_CONFIG_OUTINIT_High ///< High to lowPIN:●OUT[n] tasks and the IN[n] events输入事件导致输出任务●The tasks can be used for writing to individual pins,●theevents can be generated from changes occurring at the inputs of individual pins.●Every pair of OUT[n] tasks and IN[n]events has one CONFIG[n] register associated with it.●When an OUT[n] task or an IN[n] event has been configured to operate on a pin, the pin canonly be writtenfrom the GPIOTE module. Attempting to write a pin as a normal GPIO pin will have no effect.当IO配置为GPIOTE后,GPIO操作将无效,直到GPIOTE释放此脚PORT event示例分析():typedef enum{NRF_GPIOTE_POLARITY_LOTOHI = GPIOTE_CONFIG_POLARITY_LoToHi, ///< Low to high NRF_GPIOTE_POLARITY_HITOLO = GPIOTE_CONFIG_POLARITY_HiToLo, ///< High to low NRF_GPIOTE_POLARITY_TOGGLE = GPIOTE_CONFIG_POLARITY_Toggle ///< Toggle} nrf_gpiote_polarity_t;typedef enum{NRF_GPIOTE_INITIAL_VALUE_LOW = GPIOTE_CONFIG_OUTINIT_Low, ///< Low to high NRF_GPIOTE_INITIAL_VALUE_HIGH = GPIOTE_CONFIG_OUTINIT_High ///< High to low } nrf_gpiote_outinit_t;nrf_gpiote_task_config(0, PWM_OUTPUT_PIN_NUMBER,NRF_GPIOTE_POLARITY_LOTOHI,NRF_GPIOTE_INITIAL_VALUE_HIGH);(0、LED_1、GPIOTE_CONFIG_POLARITY_LoToHi、1):GPIOTE_CONFIG_POLARITY_LoToHi为0 {/* Check if the output desired is high or low */if (initial_value == NRF_GPIOTE_INITIAL_VALUE_LOW){/* Workaround for the OUTINIT PAN. When nrf_gpiote_task_config() is called a glitch happens on the GPIO if the GPIO in question is already assigned to GPIOTE and the pin is in thecorrect state in GPIOTE but not in the OUT register. */NRF_GPIO->OUTCLR = (1 << pin_number);/* Configure channel to Pin31, not connected to the pin, and configure as a tasks that will set it to proper level */NRF_GPIOTE->CONFIG[channel_number] =(GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |(31UL<< GPIOTE_CONFIG_PSEL_Pos) |(GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);}else{NRF_GPIO->OUTSET = (1 << pin_number);NRF_GPIOTE->CONFIG[channel_number] =(GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |(31UL << GPIOTE_CONFIG_PSEL_Pos) |GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos);}/* Three NOPs are required to make sure configuration is written before setting tasks or getting events */__NOP();__NOP();__NOP();/* Launch the task to take the GPIOTE channel output to the desired level */NRF_GPIOTE->TASKS_OUT[channel_number] = 1;/* Finally configure the channel as the caller expects. If OUTINIT works, the channel is configured properly. If it does not, the channel output inheritance sets the proper level. */ NRF_GPIOTE->CONFIG[channel_number] =(GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |((uint32_t)pin_number << GPIOTE_CONFIG_PSEL_Pos) |((uint32_t)polarity << GPIOTE_CONFIG_POLARITY_Pos) |((uint32_t)initial_value << GPIOTE_CONFIG_OUTINIT_Pos);/* Three NOPs are required to make sure configuration is written before setting tasks or getting events */__NOP();__NOP();__NOP();}初始化:static void gpiote_init(void){NRF_GPIO->OUT = 0x00000000UL;NRF_GPIO->DIRSET = 0x0000FF00UL;NRF_GPIO->DIRCLR = 0x000000FFUL;nrf_gpio_cfg_input(BUTTON_0, BUTTON_PULL);nrf_gpio_cfg_input(BUTTON_1, BUTTON_PULL);nrf_gpio_cfg_output(PWM_OUTPUT_PIN_NUMBER);nrf_gpiote_task_config(0, PWM_OUTPUT_PIN_NUMBER, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_HIGH);}应用:if (nrf_gpio_pin_read(BUTTON_1) == 0){ nrf_gpiote_task_config(0, PWM_OUTPUT_PIN_NUMBER,NRF_GPIOTE_POLARITY_LOTOHI,NRF_GPIOTE_INITIAL_VALUE_HIGH);//pwm_set(224UL); //224}else if (nrf_gpio_pin_read(BUTTON_0) == 0){ nrf_gpiote_task_config(0, PWM_OUTPUT_PIN_NUMBER, NRF_GPIOTE_POLARITY_TOGGLE, NRF_GPIOTE_INITIAL_VALUE_LOW);pwm_set(10); //32}else{ nrf_gpiote_task_config(0,PWM_OUTPUT_PIN_NUMBER, NRF_GPIOTE_POLARITY_HITOLO,NRF_GPIOTE_INITIAL_VALUE_LOW);// pwm_set(1UL); //1 }。
nRF51822芯片详解解读
0、功能简介IC功能包括:256kB片上闪存和16kB RAM;数字和混合信号周边,包括SPI、2-wire、ADC以及正交解码器;16 PPI通道;撘配片上LDO时电源范围为1.8-3.6V,LDO旁路模式为1.75-1.95V ;片上下拉DC/DC转换器用于3V电池(例如,纽扣电池);片上+/- 250 ppm 32kHZ RC振荡器,在蓝牙低功耗应用,不需外部32kHz晶体,可节省成本和电路板空间;6x6mm 48脚QFN封装,提供最多可达32个GPIO;完整的蓝牙协议堆栈(到配置文件的链接层)。
nRF51822的S110是可下载、免版税、预编译二进制蓝牙低功耗堆栈,可独立编程和更新。
功能包括:异步和事件驱动SVC的API;运行时保护;GATT、GAP和L2CAP级别API;周边和广播器角色;GATT客户端和服务器;和2.4GHz RF专用协议的非并行多协议操作;少于128kB的代码和6kB的RAM,为应用程序留有超过128kB的闪存和10kB的RAM;与使用上一代nRF8001的双芯片应用相比,运行S110堆栈的nRF51822削减了高达50%的功耗。
S110堆栈和nRF51822加上nRF518 SDK相互配合,nRF518包含全面的蓝牙低功耗配置文件、服务以及示例应用集合。
1、架构围绕两条内部总线展开:AHB,APB AHB (Advanced High Performance BUS):CPU: ( Cortex-m0,NVIC,BBB,DAP)Memory : ( RAM, Flash)GPIO : P0(P0.0~P0.31)AHB to APB BridgeAPB (Advanced Peripheral BUS):左半边:Power:电源控制WDT:看门狗SPI0,SPI1TIMER0(32位),TIMER1(16位),TIMER2(16位)QDEC:正交译码器,CLOCK:提供两个时钟:HFCLK(16MHZ),LFCLK(32.768KHZ)TWI0,TWI1:两线接口,兼容I2C右半边:NVMC :非易失性存储控制器RADIO: 2.4GHZ 无线广播的数据率:250KBPS,1MBPS,2MBPS ECB: 加密功能(AES),产生HASH序列,数字签名,生成密钥流等RNG:产生随机数用于加密(基于内部热噪声),无需种子值。