/*************************************************************** 总线频率88M,PWM频率250HZ,定时器每0.1s去查看脉冲累加器的值 然后将脉冲数反映到端口B的LED上。
***************************************************************/ #include
void PA_init() {
PACTL_PAEN=0; // 禁止脉冲累加功能
PACTL_PAMOD=0; // 事件计数模式 PACTL_PEDGE=0; // 下降沿触发计数
PACTL_PAOVI=0; // 脉冲数据寄存器溢出中断关闭 PACTL_PAI=0; // 脉冲输入中断关闭 PACNT=0x0000; // 脉冲数据寄存器清零
TCTL3|=0X40; // 通道7上升沿捕捉
TIE=0X00; // 所有的通道寄存器没有使能 TIOS_IOS7=0; // 通道7为输入捕捉
PACTL_PAEN=1; // 脉冲计数允许 }
void SetBusCLK_88M(void) {
CLKSEL=0X00; // disengage PLL to system PLLCTL_PLLON=1; // turn on PLL SYNR =0xc0 | 0x0a; REFDV=0x80 | 0x01; POSTDIV=0x00; pllclock=2*osc*(1+SYNR)/(1+REFDV)=176MHz;
_asm(nop); // BUS CLOCK=88M _asm(nop);
while(!(CRGFLG_LOCK==1)); // when pll is steady ,then use it; CLKSEL_PLLSEL =1; // engage PLL to system; }
void PIT_init() {
PITCFLMT=0X00; // 禁用PIT模块
PITCE|=0X01; // 定时器0通道使能位置1
PITMUX_PMUX0=0; // 连接微定时器0与定时器0 PITFLT|=0X01; // 定时器0强制装载位置1
// PITMTLD0=219; // 微定时器0装载寄存器 220 PITLD0=39999; // 定时器0装载寄存器 40000 // 220*40000/88000000=0.1s PITINTE|=0X01; // 允许定时器0中断使能 PITTF|=0X01; // 定时器0中断标志位清零
PITCFLMT=0X80; // 使能PIT模块 }
void PWM_init() {
PWME_PWME5 = 0; // 先禁止各通道输出
PWMCTL_CON45 = 1; // 通道45级联成16位PWM
PWMPRCLK_PCKA = 2; // 预分频系数为A 2,总线频率,即22MHZ PWMSCLA = 1; // SA_CLK = A_CLK / (2*1) ==11MHz PWMCLK_PCLK5 = 1; // 通道选 clock SA做时钟源
PWMCNT45=0; // 45计数器清零
PWMCAE_CAE5=0; // 选择输出模式为左对齐输出模式 PWMPOL_PPOL5=1; // 先输出高电平,计数到DTY时,反转电平
PWMPER45=44000; // PWM=11M/44000=250HZ,周期为4ms PWMDTY45=16500; // 初值设定为90度
PWME_PWME5 = 1; }
void main(void) {
SetBusCLK_88M(); // 时钟初始化
PA_init(); // 脉冲累加捕捉初始化 PIT_init(); // 定时器0初始化 PWM_init(); // PWM初始化 DDRB=0XFF; //端口初始化 EnableInterrupts; //开总中断
for(;;) { } }
#pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 66 PIT0_ISR(void){
PACTL_PAEN=0; // 输入脉冲计数禁止 PORTB=PACNT;
PACNT=0X0000; // 脉冲数据寄存器清零 PACTL_PAEN=1; // 输入计数允许 PITTF_PTF0=1; // 清除PIT0的标记 }
#pragma CODE_SEG DEFUALT