PLL锁相环时钟设定
未配置锁相环时(OSCCLK_PLLSEL=0):
总线频率=外部晶振频率(OSCCLK)/2
配置锁相环时(OSCCLK_PLLSEL=1): 系统时钟由锁相环提供,总线频率=倍频后频率(PLLCLK)/2
时钟频率计算方法
Fvco=2*Fosc*(SYNDIN+1)/(REFDIV+1)
Fpll=Fvco/(2*POSTDIV)当POSTDIV=0时,Fpll=Fvco
Fbus=Fpll/2
CRGFLG_LOCK==1时,说明PLLCLK稳定,可输出。
锁相环从设定到稳定需要时间,故期间应加几条空语句。
例程:
void CLK_Init(void) {
CLKSEL=0x00; //选择OSCCLK为系统时钟源16M PLLCTL_PLLON=1; //开启锁相环,锁相环电路允许
//频率设定80M时
SYNR = 0xc0 | 0x09;
REFDV = 0x80 | 0x01;
POSTDIV = 0x00; // PLLCLOCK=2*osc*(1+SYNR)/(1+REFDV)=160MHz; _asm(nop);_asm(nop);
while(!CRGFLG_LOCK); // 时钟频率已稳定,锁相环频率锁定CLKSEL_PLLSEL=1; //使能锁相环时钟
}
PWM模块
PWME:PWM允许寄存器,置1时允许输出。
PWMPOL:极性寄存器。
置1时首先输出高电平。
2、3、6、7、置1时clock SB 作为时钟源,置0时clock B作为时钟源
PWMCAE:居中对齐允许寄存器,只有当通道输出禁止时才能设置此寄存器置1时为居中对齐,置0时左对齐
PWMSCLA:比例因子寄存器A;用于提供clock SA的比例因子
Clock SA的时钟频率= clock A/(2*PWMSCLA)当PWMSCLA为0时比例因子默认为256. CLOCKSB 计算方法类似,寄存器为PWMSCLB。
PWMCNTx:通道计数寄存器,一般设置值为0x00;
PWMPERx:周期寄存器;
左对齐时周期计算方法:PWMxPeriod=指定时钟周期乘以PWMPERx的值居中对齐时=指定时钟周期乘PWMPERx的值再乘2;
PWMDTYx:占空比寄存器。
占空比计算方法:极性为1时:Duty Cycle=PWMDTYx/PWMPERx*100%
极性为0时(PWMPERx-PWMDTYx)/PWMPERx
例程
void PWM_128init(void)
{
PWMPRCLK=0x00; //ClockA and ClockB等于总线时钟80M
PWMCLK=0xc2; //通道7、1选择SB、SA时钟源,通道5,3选择A,B时钟源PWMSCLB=0x14; //SB时钟源为40分频为2M
PWMSCLA=0x14; //SA时钟源2M;
PWMCTL=0xf0; //级联67 级联45 级联23 级联01
PWMCAE=0x00; //pwm左对齐输出
PWMCNT01=0;
PWMCNT23=0;
PWMCNT45=0;
PWMCNT67=0;
PWMPOL=0XFF; //初始输出高电平
PWMPER67 = 40000; //67通道输出50HZ的频率2M/40000
PWMPER45 = 8000; //45通道输出10k频率80M/8000
PWMPER23 = 8000; //23通道输出10k频率80M/8000
PWMPER01=40000;
PWMDTY67 = 2800; //67通道初始PWM高电平时间为1.5ms
PWMDTY45 = 2000; //45 通道初始占空比0%
PWMDTY23 =2000; //23通道初始占空比0
PWMDTY01=3000;
PWME=0XAA; //7,5,3,1通道使能
}
SPI模块
五、SPIDR 数据寄存器
SPI数据寄存器是SPI数据的输入和输出寄存器,写该寄存器会允许一个字节进入队列并发送。
如果SPI被配置成主机,当前面的数据发送完成,排在队列的数据会立即被发送。
SPISR寄存器中的发送空标志SPTEF表明SPI数据寄存器准备接收新的数据。
当SPIF=1时SPIDR中接收的数据是有效的。
SPI的编程方法:
1、初始化:设置控制寄存器SPICR1、SPICR2,及波特率寄存器SPIBR。
在此设
定SPI的工作方式,时钟极性,时钟相位,及各种中断允许等。
2、发送与接收数据的编写:作为主机方,只要将数据写入SPIDR,然后检查SPISR
的SPTEF位,若为1,则表示数据已经发送出去。
若同时接收对方送来的数据,则接着检查SPISR的SPIF位,若为1,则表示要接的数据已经进入数据寄存器,可以取出了。
SCI模块
SCI模块复用PS口的4个引脚,(0~3)作为RXD、TXD、RXD1、TXD1. SCI波特率寄存器(SCIBDH和SCIBDL)
SCI波特率=SCI模块时钟/(16*寄存器的值)。