nRF51822之PWM学习笔记
- 格式:pdf
- 大小:140.54 KB
- 文档页数:10
最近要用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中断,其他中断没有实践过)中断是基于任务和事件模式的。
PWM模块1.PWM通道占空比寄存器PWM Channel Duty Register(PWMDTY)每个通道都有一个专用的用来设置占空比的寄存器PWMDTYx,PWMDTYx和PWMPERx 的值共同决定了占空比的值,就是说当每个通道的count的值计数到与PWMDTYx的值相等时,相应的输出信号就发生一次翻转。
如果你设置PWMPOL寄存器的某位PPOLx 的值为1,也就是开始的时候输出为高电平,然后当计数器数到与PWMDTYx的值后就翻转为低电平,那么PWMDTY寄存器的值就包含了高电平的时间,再结合占空比说明一下吧PPOLx=1:占空比=(PWMDTYx/PWMPERx)*100%PPOLx=0:占空比=(PWMPERx-PWMDTYx)/PWMPERx*100%2.PWM通道周期寄存器PWM Channel Period Registers(PWMPERx)每个通道都有一个专用的用来设置周期情况的寄存器(PWMPERx),这个寄存器的值就决定了PWM通道输出信号周期的长短,如果我们已经知道的参考时钟源的值,那么就可以计算出PWM输出信号的周期了,计算方法如下:PWMxPeriod=ChannelClockPeriod*PWMPERx(左对齐情况下即CAEx=0) PWMxPeriod=ChannelClockPeriod*PWMPERx*2(居中对齐情况下即CAEx=1) 3. PWM使能寄存器PWM Enable Register(PWME)PWME[7:0]分别控制着对应的8个通道的使能,例如:PWME_PWME0=0:禁止通道0的PWM输出PWME_PWME7=1: 使能通道7的PWM输出3.PWM极性寄存器PWM Polarity Register(PWMPOL)PWMPOL寄存器是用来控制PWM一开始输出时的信号高低情况,假如PPOLX设为1,则与之相应的PWM通道在开始的时候输出为高电平,然后等到计数器的值与你设置的那个PWM 信号的值(PWMDTYx)相等的时候就输出低电平。
STM8学习笔记——PWM模块首先将管脚配置为推挽输出。
下面以向上计数模式为例来讲述PWM 产生的原理:TIMx 开始向上计数,TIMx_CNT 为计数值,计数一次加1,TIMx_ARR 确定了计数的上限,达到上限后计数器从0 开始重新计数,所以一次PWM 频率就由TIMx_ARR 来确定了,即计数器时钟*(TIMx_ARR-1),频率确定了,接下来就是占空比。
占空比是由TIMx_CCRx 来确定的,PWM模式1 下当TIMx_CNT=TIMx_CCRx 时,输出OCiREF 无效电平,至于有效电平是0 还是1,要设置TIMx_CCERx,这样产生了一个PWM 波形,可以说配置非常灵活,当TIMx_CCRx 为0 时,占空比就为0,当TIMx_CCRx 大于TIMx_ARR 时,就一直输出高电平(占空比100%)。
下图是个例子:以下是我写的一个参考程序,测试通过void TIM1_Init(void){//定时器1 初始化CLK_PCKENR1|=0x80;//开启定时器1 外设时钟TIM1_EGR=0x01;//重新初始化TIM1 TIM1_EGR|=0x20;//重新初始化TIM1 TIM1_ARRH=0x00;//设定重装载值TIM1_ARRL=254; TIM1_PSCRH=0;//预分频TIM1_PSCRL=9; TIM1_CR1=0;//边沿对齐,向上计数} void TIM1_PWM_Init(){ //TIM1_CCER1=0x03;//低电平有效//TIM1_CCMR1=0x70;//PWM 模式2TIM1_CCER1=0x01;//高电平有效TIM1_CCMR1=0x60;//PWM 模式1TIM1_CCR1H=0;//占空比TIM1_CCR1L=50; TIM1_CR1|=0x01;//向上计数,无缓存,使能TIM1_BKR=0x80;//开启刹车}tips:感谢大家的阅读,本文由我司收集整编。
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可以实现外设之间的精确同步。
AN4605应用笔记STM32- nRF51822蓝牙低功耗(BLE)系统解决方案介绍本应用笔记介绍了蓝牙低功耗(BLE)嵌入式软件(X-CUBE-nRF51DRV)实现对STM32L0系列和nRF51822,并解释如何界面自己的应用程序,并创建BLE服务。
在X-CUBE-nRF51DRV主要特点如下:•与北欧提供的BLE型材兼容性•应用程序集成就绪•易于附加在STM32L0系列低功耗解决方案BLE•极低STM32L0 CPU负载(HRS 1秒更新率0.127%)•没有对STM32L0系列延迟要求•小STM32L0内存占用在X-CUBE-nRF51DRV软件是基于STM32CubeL0 HAL驱动程序(见第2节)。
同时提供了使用北欧BLE服务于客户STM32L0应用实例。
该参考硬件平台是STM32-nRF51822基于STM32Nucleo / 64上和Wavetek公司蓝牙LE与盾北欧BLE模块nRF51822。
注:X-CUBE-nRF51DRV可以移植到其它STM32系列。
目录1引用。
72 STM32Cube概述。
83,嵌入式软件的定义。
9 4入门。
114.1 BLE系统描述。
0.114.2特性。
0.114.3硬件/软件的快速设置。
125参考平台。
13 5.1接口描述。
13 5.2 UART 4线接口。
145.3重置系统。
145.3.1上电复位。
155.3.2系统复位。
155.4器件编程。
166嵌入式软件的描述。
186.1 UART接口。
186.1.1 BLE SD FW模块。
196.1.2低功耗经理。
206.1.3中断。
206.1.4语境经理。
206.1.5配置。
21当BLE功能使用6.1.6 STM32资源需求。
216.1.7集成。
226.1.8可移植性。
226.2定时器接口。
236.2.1 BLE SD FW模块。
256.2.2初始化。
256.2.3用户模块。
266.2.4中断。
46.2.5语境经理。
飞思卡尔初学之PWM调试笔记M9S12XS128 单片机有8 个独立的PWM 输出通道,其中每相邻的两个可以级联成一个通道。
本文着重应用实践,理论性的东西少谈为妙,因为理论的东西资料上都有。
想借此平台记录下调试心得以免日后遗忘,因本人也是初学该款单片机,难免有错误之处,还希望达人指点。
PWM 应用步骤:一、PLL 初始化,这一步应该说不算PWM 设置的内容,但是又必须设置,因为这关系着PWM 周期值的计算。
从开发板上的晶振来看是16M,但是总线时钟却并不是16M,S12 单片机里面有个锁相环设置,要设置好了才准确。
具体这个PLL 函数我还没去了解。
现在是现成套用。
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzCLKSEL=0X00;PLLCTL=0XE1;REFDV = 1; //总线时钟=48/2=24MHzSYNR = 2;_asm(nop); // BUS CLOCK=24M_asm(nop);while (!(CRGFLG & 0x08)) ;CLKSEL = 0x80; //选定锁相环时钟}用了这个PLL 初始化函数以后,总线时钟就是24M 了。
二、PWM 相关设置1、禁止PWM。
PWME2、选择时钟源。
PWMPRCLK, PWMSCLA, PWMSCLB ,PWMCLK。
其中通道0 、1、4、5 可以选择ClockA ClockSA。
通道2、3、6、7 可以选择ClockB ClockSB其中值得说明的是ClockA 或ClockB 是通过总线时钟预分频获得的。
ClockSA 或ClockB 是分别对ClockA ClockB 再次进行分频获得的。
分频系数的设置都有相应的寄存器进行设置。
后面会提到。