|
最近一个项目用到红外收发,需要调制一个38K的信号,我用的片子是TM4C1231H6PZ,没有PWM模块,就想着试用一下timer的PWM功能,刚开始用了半天没调处来,后来才发现自己做的时候呆逼了,现在把最终代码发出来一下,大家可以看一下别出现我的问题。
查询手册,为了布线方便,我使用的是这个管腿。
使用的为WT4CCP1,由于看芯片手册看的不仔细,我这回最大的问题出在了这个WT,也就是宽定时器,以前都是用的普通定时器,没注意这个W,结果刚开始都是按照普通定时器来初始化的(一脸懵逼)后来才发现,真是悲剧。。。我擦,最后的源代码就是这样了,我经过硬件测试的,大家如果要使用的话,一定要看清是T?CCP?还是WT?CCP?,别和我一样悲剧。。这个CCP0是子定时器A,CCP1是子定时器B,我使用的CCP1,所以就是用timerB。
下面是源代码:
/* 输入的变量sysclock为系统的时钟频率,我使用的是这款芯片的最快频率80M */
void WTimer4Init(const uint32_t sysclock)
{
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);//使能输出PWM的端口
SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOH);//该端口正好有AHB,就用上了
ROM_GPIOPinConfigure(GPIO_PH7_WT4CCP1);//初始化端口特殊功能
ROM_GPIOPinTypeTimer(GPIO_PORTH_AHB_BASE, GPIO_PIN_7);//初始化此端口受timer控制,CCP功能
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_WTIMER4);//使能WTimer4
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_WTIMER4);//为了安全,重启一下这个外设
while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_WTIMER4));//等待外设重启完毕
ROM_TimerDisable(WTIMER4_BASE, TIMER_B); //配置前停止定时器
ROM_TimerConfigure(WTIMER4_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PWM);
//配置为单定时器模式和timerBPWM模式
ROM_TimerControlLevel(WTIMER4_BASE, TIMER_B, false);//PWM输出正极性
ROM_TimerControlStall(WTIMER4_BASE, TIMER_B, true);//WTIMER在调试(仿真)时自动停止,这个是为了仿真方便
ROM_TimerLoadSet(WTIMER4_BASE,TIMER_B, sysclock / 38000);//设定定时值
ROM_TimerMatchSet(WTIMER4_BASE,TIMER_B,sysclock / 38000 / 2);//设定翻转值
ROM_TimerEnable(WTIMER4_BASE, TIMER_B);//使能定时器
}
|
|