请高手指点ARM定时器 各位大虾,小弟刚学ARM,现在做简单的程序,在定时器上遇到问题,使用芯片是S3C2410,在用他做单个定时器作PWM输出时,可以进行脉宽调制,当占空比改变时改变相应TCMPB寄存器就可以调节脉宽,但当同时使用两个定时器作PWM输出时,没有波形,具体设置如何,请高手指点,谢谢! 下面是我的程序,请高手看看.
void PWM_Init0(uint16 cycle, uint16 duty) { if(duty>cycle) duty = cycle; // 设置定时器0,即PWM周期和占空比 // Fclk=200MHz,时钟分频配置为1:2:4,即Pclk=50MHz。 rTCFG0 = 97; // 预分频器0设置为98,取得510204Hz rTCFG1 = 0; // TIMER0再取1/2分频,取得255102Hz rTCMPB0 = duty; // 设置PWM占空比 rTCNTB0 = cycle; // 定时值(PWM周期) if(rTCON&0x04) rTCON = rTCON|(1<<1); // 更新定时器数据 (取反输出inverter位) else rTCON = rTCON| (1<<2)|(1<<1);
rSRCPND = rSRCPND|(1<<10); // 清除中断标志 rINTPND = rINTPND; //|(1<<10); rTCON = rTCON|(1<<0)|(1<<3); // 启动定时器 }
void PWM_Init1(uint16 cycle, uint16 duty) { if(duty>cycle) duty = cycle; rTCMPB1 = duty; // 设置PWM占空比 rTCNTB1 = cycle; // 定时值(PWM周期) if(rTCON&0x0400) rTCON = rTCON|(1<<9); // 更新定时器数据 (取反输出inverter位) else rTCON = rTCON|(1<<10)|(1<<9);
rSRCPND = rSRCPND|(1<<11); rINTPND = rINTPND; //|(1<<11); rTCON = rTCON|(1<<8)|(1<<11); // 启动定时器 } int main(void) { uint16 pwm_dac; // 独立按键KEY1控制口设置 rGPFCON = (rGPFCON & (~(0x03<<8))); // rGPFCON[9:8] = 00b,设置GPF4为GPIO输入模式 // TOUT0口设置 rGPBCON = (rGPBCON & (~(0x0F<<0))) | (0x0A<<0); // rGPBCON[1:0] = 10b,[3,2]=10b,设置TOUT0,TOUT1功能 rGPBUP = rGPBUP | 0x0003; // 禁止TOUT0,1口的上拉电阻 rPRIORITY = 0x00000000; // 使用默认的固定的优先级 rINTMOD = 0x00000000; // 所有中断均为IRQ中断 rINTMSK = ~(3<<10); // 打开TIMER0中断允许
// 初始化PWM输出。设PWM周期控制值为255 (即DAC分辨率为8位) pwm_dac = 40; // 初始化占空比为0,即输出0V电压 PWM_Init0(255, pwm_dac); PWM_Init1(255, 255-pwm_dac); // 等待按键KEY1,改变占空比 while(1) { WaitKey(); // 由于PWM周期控制值为255,所以0.5V对应的PWM占空比的值为:0.5/3.3 * 256 = 39 pwm_dac = pwm_dac + 39; // 改变D/A输出的电压值 if(pwm_dac>255) { pwm_dac = 40; } rTCMPB0 = pwm_dac; rTCMPB1 = 255-pwm_dac; } return(0); }
我看到周立工的指导书上单个定时器PWM时不设置中断优先级,中断类型等,不知道十么原因,谢谢!
|