- 打卡等级:以坛为家II
- 打卡总天数:513
- 最近打卡:2025-05-01 04:31:49
荣誉版主
- 积分
- 986
|
发表于 2024-9-15 20:18:53
|
显示全部楼层
测量PLL时钟的代码:
#include "ai8051u.H" //包含此头文件后,不需要再包含"reg51.h"头文件
//#include "intrins.h"
#define FOSC 30000000UL
void delay()
{
int i;
for (i=0; i<100; i++);
}
void PLL_Init()
{
// CLKSEL &= ~0x80; //选择PLL的96M(*8)作为PLL的输出时钟
CLKSEL |= 0x80; //选择PLL的144M(*12)作为PLL的输出时钟
USBCLK &= ~0x60;
// USBCLK |= 0x00; //PLL输入时钟为12M则选择1分频
// USBCLK |= 0x20; //PLL输入时钟为24M则选择2分频
USBCLK |= 0x40; //PLL输入时钟为48M则选择4分频
// USBCLK |= 0x60; //PLL输入时钟为96M则选择8分频
USBCLK |= 0x80; //启动PLL
delay(); //等待PLL锁频,建议50us以上
HSCLKDIV = 0; //高速外设时钟源不分频
// TFPU_CLKDIV = 0; //TFPU时钟源不分频
// CLKSEL &= ~0x40; //选择系统时钟作为高速外设时钟源
CLKSEL |= 0x40; //选择PLL时钟作为高速外设时钟源
}
char ReadPWMA(char addr)
{
char dat;
while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_ADR = addr | 0x80; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
//HSPWMA_ADDR 寄存器的最高位写 1,表示读数据
while (HSPWMA_ADR & 0x80); //等待当前异步读取完成
dat = HSPWMA_DAT; //读取异步数据
return dat;
}
void WritePWMA(char addr, char dat)
{
while (HSPWMA_ADR & 0x80); //等待前一个异步读写完成
HSPWMA_DAT = dat; //准备需要写入的数据
HSPWMA_ADR = addr & 0x7f; //设置间接访问地址,只需要设置原 XFR 地址的低 7 位
//HSPWMA_ADDR 寄存器的最高位写 0,表示写数据
}
int main()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0; P0M1 = 0;
P1M0 = 0; P1M1 = 0;
P2M0 = 0; P2M1 = 0;
P3M0 = 0; P3M1 = 0;
P4M0 = 0; P4M1 = 0;
P5M0 = 0; P5M1 = 0;
PLL_Init();
//DMAIR = 0x3e; //选择 系统时钟 为TFPU时钟源
//DMAIR = 0x3f; //选择 PLL时钟 为TFPU时钟源
HSCLKDIV = 0; //HSPWM/HSSPI 时钟源不分频
HSPWMA_CFG = 0x03; //使能 PWMA 相关寄存器异步访问功能
PWMA_PS = 0x00; //PWMA_CC1/CC1N 高速 PWM 输出到 CC1/CC1N 口
//注意:PWMA_PS 不能使用异步方式进行读写
//通过异步方式设置 PWMA 的相关寄存器
WritePWMA((char)&PWMA_CCER1, 0x00);
WritePWMA((char)&PWMA_CCMR1, 0x00); //CC1 为输出模式
WritePWMA((char)&PWMA_CCMR1, 0x60); //OC1REF 输出 PWM1(CNT<CCR 时输出有效电平 1)
WritePWMA((char)&PWMA_CCER1, 0x05); //使能 CC1/CC1N 上的输出功能
WritePWMA((char)&PWMA_ENO, 0x03); //使能 PWM 信号输出到端口 P1.0/P1.1
WritePWMA((char)&PWMA_BKR, 0x80); //使能主输出
WritePWMA((char)&PWMA_CCR1H, 500>>8); //设置 PWM 占空比为 500 个 PWM 时钟
WritePWMA((char)&PWMA_CCR1L, 500);
WritePWMA((char)&PWMA_ARRH, 999>>8); //设置输出 PWM 的周期为 1000 个 PWM 时钟
WritePWMA((char)&PWMA_ARRL, 999);
WritePWMA((char)&PWMA_DTR, 10); //设置互补对称输出 PWM 的死区
WritePWMA((char)&PWMA_CR1, 0x01); //开始 PWM 计数
while (1);
}
烧录时设置频率为30MHZ。
有: (30MHZ / 4 ) * 12----> PLL时钟--->90MHZ,
用逻辑分析仪抓取P10/P11端口,输出的PWM波形的周期值为11.08us。
计算值为:
(1 / 90MHZ) * 1000 === 11.1us
计算值 和 测量值 基本一致。
|
|