📄 init.c
字号:
#include<hidef.h>
#include "derivative.h" /* derivative-specific definitions */
#include"init.h"
#define PITTIME 200//设定为1ms定时
void PLL_Init(void)
{
CPMUPROT = 0x26; //保护时钟配置寄存器
CPMUCLKS_PSTP = 0; //禁用PLL
CPMUCLKS_PLLSEL = 1; //选择PLL作为系统时钟源
CPMUOSC_OSCE = 1; //外部晶振使能
CPMUSYNR = 0x07; //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)
CPMUREFDIV = 0x07; //16M:07,0F;32M:07,07;64M:07,03
CPMUPOSTDIV = 0x00; // PLL CLOCK = VCO CLOCK / (POSTDIV + 1)
_asm(nop);
_asm(nop);
CPMUPLL=0x10; //锁相环调频启用,用以减少噪音
while(CPMUFLG_LOCK == 0); //等待PLL稳定
CPMUPROT = 0x00; //关闭保护时钟
CPMUCLKS_PLLSEL = 1; //使能PLL
}
/*//---------------------锁相环初始化-------------------//
void PLL_init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{
DisableInterrupts;
CLKSEL=0x00; //不用锁相环
PLLCTL_PLLON=1; //开启PLL
REFDV=0x07; //PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]
SYNR=0x07;
while(!(CRGFLG_LOCK==1));//直到LOCK=1,when PLL is ready,退出循环
CLKSEL_PLLSEL=1; //选定锁相环时钟
}*/
/*void AD_init(void)
{
//8ch
ATDCTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:ch
ATDCTL2=0x40; //禁止外部触发, 中断禁止
ATDCTL3=0x80; //右对齐无符号,每次转换8个序列, No FIFO, Freeze模式下继续转
ATDCTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]
ATDCTL5=0x30; //6:0特殊通道禁止,5:1连续转换 ,4:1多通道轮流采样
ATDDIEN=0x00; //禁止数字输入
}*/
void AD_init(void)
{
ATDCTL1=0x40; //12位分辨率,0~255
ATDCTL2=0x60; //正常工作模式,标志位快速清零
ATDCTL3=0xF8; //AD转换结果右对齐,转换序列长度15
ATDCTL4=0x07; //采样时间四个周期,PRS=7,f(atdclk)=f(bus)/(2*(PRS+1))
ATDCTL5=0x30; //允许特殊通道转换,多通道采样
ATDDIEN=0x00; // 禁止数字输入缓冲
}
void PIT_Init()
{
CPMUAPICTL_APIFE =0;//在设定值之前需要清零;
CPMUAPICTL_APICLK=1; //0:使用Autonomous Clock 1:使用BUs CLOCK,这里使用BUS CLK
CPMUAPIR=7999;
//CPMUACLKTR=0xFC;
// fACLK is trimmed to 10KHz,如果使用的是Auto Clock 则要设置此寄存器 为0xfc CPMUAPIR=29999;
//使用BUS CLK , Period = 2*(APIR[15:0] + 1) *(1/16 000 000HZ)此处定时1ms
//若使用AUTO CLK ,0.2(x+1)=y ms 如定时10ms 值为49
CPMUAPICTL_APIE =1; //使能中断申请
CPMUAPICTL_APIF=1; // 中断标志位清零
CPMUAPICTL_APIFE =1;//在设定值之前需要清零;
}
/*void PIT_Init(void)//定时中断初始化函数 50MS定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0关
PITCE_PCE0=1; //定时器通道0使能
PITMUX=0x00; //定时器通道0使用微定时器基准0
PITMTLD0=0xFF; //8位定时器初值设定 16MHzBusClock下 1ms中断
PITLD0=0x0040; //16位定时器初值设定 定时周期=(PITMTLD0+1)*(PITLD0+1)/fbus
PITINTE_PINTE0=1; //定时器中断通道0中断使能
PITCFLMT_PITE=1; //定时器通道0使能
}*/
void PWM_Init(void)
{
//PTTRR=0x80;
PWME=0x00; //关闭通道
PWMPRCLK=0x00; //时钟源为总线时钟
PWMCLK=0xAA; //SA、SB作为PWM的时钟
PWMSCLA=1; //Clock SA=Clock A /(2*PWMSCLA)= 16M/2=8M
PWMSCLB=1; //Clock SB=Clock B /(2*PWMSCLB)= 16M/2=8M
PWMPOL=0xAA; //通道对外输出波形先高电平 后低电平
PWMCAE=0x00; //左对齐输出 PWMx周期=通道时钟周期*PWMPERx=8Khz
PWMCTL_CON01=1; //通道串联输出打开
PWMCTL_CON23=1;
PWMCTL_CON45=1;
PWMCTL_CON67=1;
PWMDTY01=0; //占空比为0%的波形 当CAEx=0时
PWMPER01=1000; //当PPOL=1时 占空比=(PWMDTYx/ PWMPERx)*100%
PWMDTY23=0;
PWMPER23=1000;
PWMDTY45=0;
PWMPER45=1000;
PWMDTY67=0;
PWMPER67=1000;
PWMCNT0=0x00; //0通道计数器清0
PWMCNT1=0x00; //1通道计数器清0
PWMCNT2=0x00; //2通道计数器清0
PWMCNT3=0x00; //3通道计数器清0
PWMCNT4=0x00;
PWMCNT5=0x00;
PWMCNT6=0x00;
PWMCNT7=0x00;
PWME_PWME1=1; //0通道使能,0通道为输出通道
PWME_PWME3=1; //1通道使能
PWME_PWME5=1; //2通道使能
PWME_PWME7=1; //3通道使能
}
// 脉冲累加器初始化 (PT7口)
void initPACN(void)
{
PACTL=0x50;// 上升沿有效
PACNT=0;
}
void system_init(void) {
PLL_Init();
AD_init();
PWM_Init();
PIT_Init();
initPACN();
DDRC=0xff;
PORTC=0x00;
DDRD=0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -