ee一、构造
二、设置相关位
1、MPLLCON寄存器(配置MPLL寄存器,进行倍频)
根据下列表格的想要输出的频率进行选择,选择完毕之后,对该寄存器进行设置
2、时钟分频控制(CLKDIVN)寄存器
根据不同需要的分频,进行端口进行选择不同的分频
三、PWM和定时器
1、定时器
根据不同的要求,选择不同的定时器,例子1 ,选择定时器4,不需要PWM
1、配置定时器配制寄存器0(TCFG0)
定时器输入时钟频率 = PCLK / {预分频值+1} / {分频值},设定第一个将PCLK的进行分频。
2、配置定时器配制寄存器1(TCFG1),选择那个通道是有效的,并配置最终的分频占比
注意
先设分频,再设倍频
如果先设倍频,立马进行传输过去,分频地方没有设置
3、设置TCNTB
注意先设置这个,因为这个buf里面存的数据是定时的次数,所以,要先写其,否则后面写他,定时器不知道该有没有更新。
4、配置TCON寄存器
选择定时器的模式,以及打开定时器,注意,在定时器更新这个,先置1,再清0,对该位进行设置的目的是让定时器知道TCNTB里面的数值发生改变
5、注意,对于不同的引脚进行设置不同的模式的时候,我们要到IO 模式设置不同IO的工作模式
6、对于PWM里面的我们多加了一个TCMPB,主要是实现占空比。所以在此注意为了方便,我们将其置于高电平,对于要让占空比比较大的话,此数字为TCNTB *(1 - f);
四、具体代码
1、定时器4初始化
void init_timer(void)
{
unsigned int t;
t = TCFG0;
t &= ~(0xff << 8);
t |= ( 24<< 8);
TCFG0 = t;
TCFG1 &= ~(0x0f << 16);
TCNTB4 = 0xFFFF;
TCON |= (1 << 21);
TCON &= ~(1 << 21);
TCON |= (1 << 22);
// INTMOD &= ~(1 << 14);触发中断
// INTMSK &= ~(1 << 14);
TCON |= (1 << 20);
}
2、精准计时
void udelay(unsigned int n)
{
unsigned int counter = 0, old_counter, new_counter;
old_counter = TCNTO4;
while(1)
{
new_counter = TCNTO4;
if(new_counter != old_counter)
{
if(new_counter < old_counter)
{
counter += old_counter - new_counter;
}
else
{
counter += old_counter + (0xFFFF - new_counter);
}
if(counter >= n)
{
return;
}
old_counter = new_counter;
}
}
}
void delay(unsigned int n)
{
while(n--)
{
udelay(1000);
}
}
3、PWM初始化
void init_pwm(void)
{
unsigned int t;
t = TCFG0;
t &= ~(0xff << 0);
t |= 24;
TCFG0 = t;
TCFG1 &= ~(0x0f);
TCNTB0 = 2500;
TCMPB0 = 1250;
GPBCON &= ~(0x03);
GPBCON |= (2 << 0);
TCON |= (1 << 3);
TCON |= (1 << 2);
TCON |= (1 << 1);
TCON &= ~(1 << 1);
// INTMOD &= ~(1 << 10);
// INTMSK &= ~(1 << 10);
TCON |= (1 << 0);
}
void set_radio(float f)
{
TCMPB0 = TCNTB0 * (1- f);
TCON |= (1 << 1);
TCON &= ~(1 << 1);
}