ARM定时器,请各位帮忙,谢谢!

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

没人帮忙吗?

在单个定时器设置如做1秒中定时产生中断程序中,要设置中断服务程序,中断控制器,但在作PWM输出时,设置定时器初始化花后就不用管其他的了,只要改变比较缓冲寄存器就可以调节脉宽,为十么呢?请各位帮忙,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部