Cortex-M3 (NXP LPC1788)之PWM
1,PWM使用公共的PCLK,因此要配置系统时钟和外设时钟。之前的文章中有具体的时钟配置过程。
2,使能PWM模块。配置外设功率配置寄存器PCONP,使能PWM0的时钟控制位。
3,PWM0.1的输出管脚和P1_2管脚复用,因此要配置IOCON_P1_02寄存器,将其设置成PWM0.1的输出。
4,设置PWM的脉冲宽度,基本的原理就是比较PWM定时器计数器TC和匹配寄存器MR中的值,如果匹配我们可以通过匹配控制寄存器MCR选择操作,如产生一个中断,复位TC,停止TC和预分频计数器PC且停止计数。匹配寄存器MR0通过在匹配是将计数器TC复位来控制PWM的周期频率。另一个匹配寄存器控制PWM沿的位置。如PWM0.1的输出,将使用MR0控制PWM的周期频率,MR1控制边沿的位置。
5,最后是对于PWM的具体控制,配置PWM预分频寄存器PWMPR,该32位寄存器规定了PWM预分频计数的最大值,PWM预分频计数器寄存器PWMPC在每个PCLK上递增一次,当PWMPC和PWMPR值相等时,PWMTC的值会递增,而PWMPR在系一个PCLK周期被复位。这样,当PWMPR=0时,PWMTC会在每个PCLK上递增,而当PWMPR=1时,在每2个PCLK上递增。匹配寄存器PWMMR中的值和PWMTC的值比较,如果相等则触发在PWMMCR中配置的操作。当MR0和TC相等时,我们进行复位TC从新计数从而固定了PWM的周期频率。当定时器处于PWM模式时,软件对PWM匹配寄存器MR的写操作,写入值实际上被保存在一个映像寄存器中,不会被立即使用。所以在我们需要操作PWM锁存使能寄存器PWMLER,典型序列为:将新值写入MR,写PWMLER中相应的位,更改的MR值将在下一次定时器复位时生效。
在下面的程序中,将给MR1中写入不同的匹配值,来控制PWM的占空比。为了方便使用LED灯进行示意。
- #defineCCLK120000000
- #definePCLK60000000
- #definerFIO1DIR(*(volatileunsigned*)(0x20098020))
- #definerFIO1MASK(*(volatileunsigned*)(0x20098030))
- #definerFIO1PIN(*(volatileunsigned*)(0x20098034))
- #definerFIO1SET(*(volatileunsigned*)(0x20098038))
- #definerFIO1CLR(*(volatileunsigned*)(0x2009803c))
- #definerCLKSRCSEL(*(volatileunsigned*)(0x400FC10C))//时钟源选择寄存器
- #definerPLL0CON(*(volatileunsigned*)(0x400FC080))//PLL0控制寄存器
- #definerPLL0CFG(*(volatileunsigned*)(0x400FC084))//PLL0配置寄存器
- #definerPLL0STAT(*(volatileunsigned*)(0x400FC088))//PLL0状态寄存器
- #definerPLL0FEED(*(volatileunsigned*)(0x400FC08C))//PLL0馈送寄存器
- #definerPLL1CON(*(volatileunsigned*)(0x400FC0A0))
- #definerPLL1CFG(*(volatileunsigned*)(0x400FC0A4))
- #definerPLL1STAT(*(volatileunsigned*)(0x400FC0A8))
- #definerPLL1FEED(*(volatileunsigned*)(0x400FC0AC))
- #definerCCLKSEL(*(volatileunsigned*)(0x400FC104))//CPU时钟选择寄存器
- #definerUSBCLKSEL(*(volatileunsigned*)(0x400FC108))//USB时钟选择寄存器
- #definerPCLKSEL(*(volatileunsigned*)(0x400FC1A8))//外设时钟寄存器
- #definerPCON(*(volatileunsigned*)(0x400FC0C0))
- #definerPXCONP(*(volatileunsigned*)(0x400FC0C4))
- #definerSCS(*(volatileunsigned*)(0x400FC1A0))//系统控制和状态寄存器
- #definerCLKOUTCFG(*(volatileunsigned*)(0x400FC1C8))
- #definerIOCON_P1_02(*(volatileunsigned*)(0x4002C088))
- #definerPCONP(*(volatileunsigned*)(0x400FC0C4))
- #definerPWM0IR(*(volatileunsigned*)(0x40014000))
- #definerPWM0TCR(*(volatileunsigned*)(0x40014004))
- #definerPWM0TC(*(volatileunsigned*)(0x40014008))
- #definerPWM0PR(*(volatileunsigned*)(0x4001400C))
- #definerPWM0CTCR(*(volatileunsigned*)(0x40014070))
- #definerPWM0MCR(*(volatileunsigned*)(0x40014014))
- #definerPWM0MR0(*(volatileunsigned*)(0x40014018))
- #definerPWM0MR1(*(volatileunsigned*)(0x4001401C))
- #definerPWM0CCR(*(volatileunsigned*)(0x40014028))
- #definerPWM0PCR(*(volatileunsigned*)(0x4001404C))
- #definerPWM0LER(*(volatileunsigned*)(0x40014050))
- #definerISER1(*(volatileunsigned*)(0xE000E104))
- #definerCER1(*(volatileunsigned*)(0xE000E184))
- unsignedintduty=10;
- unsignedcharmatch_cnt=0;
- voidPWM0_IRQHandler(void)
- {
- if(rPWM0IR&0x1)
- {
- rFIO1PIN|=(1<18);
- match_cnt++;
- rPWM0IR|=0x1;//MR0中断复位
- }
- if(rPWM0I
Cortex-M3NXPLPC1788PW 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)