肚子疼了好几天,今天稍微好点,简单写点东西。
好几个月前做的项目,有些地方已经记不清楚了,但是突然客户又来问关于代码配置的情况,重新查看了代码,把相关的知识也整理一下。
dsp2812中有好几个时钟相关的配置。首先是系统时钟SYSCLKOUT=15MHZ*PLL(PLL可以在代码中进行修改)。
我的代码中将PLL设置成7,所以SYSCLKOUT=105MHZ
还有两个时钟是外设时钟,分别是高速外设时钟和低速外设时钟,它们分别由HISPCP和LOSPCP这两个寄存器来控制。
高速外设时钟用于事件管理模块(EVA、EVB)和ADC。
低速外设时钟用于串口(SCIA、SCIB)、spi和McBSP。
当前代码是基于dsp2812官方库开发的,在函数InitPeripheralClocks中定义了下面的内容:
SysCtrlRegs.HISPCP.all = 0x0007; //高速外设
SysCtrlRegs.LOSPCP.all = 0x0002; //低速外设
根据HISPCP寄存器的说明,当HISPCP最低三位为0时,高速外设时钟频率=SYSCLKOUT。
当HISPCP最低三位为其他值时,高速外设时钟频率=SYSCLKOUT/(2*HISPCP[2:0])
所以当前配置下的高速外设时钟频率= 105MHZ/(2*7)=105/14 MHZ
LOSPCP寄存器定义和HISPCP寄存器定义很类似,详细可以查看:http://bbs.dzsc.com/space/viewspacepost.aspx?postid=28614
其实当前代码的配置很有意思的,高速外设配置的频率反而比低速外设的频率要小很多。
代码中有一部分功能是用于产生PWM信号(默认是200KHZ),其代码初始配置如下:
EvbRegs.EXTCONB.bit.INDCOE = 1; //单独使能比较输出模式
EvbRegs.GPTCONB.all = 0x0024; //GP定时器4比较输出低有效
EvbRegs.T4PR = 0x0025; //定时周期为0.13us*(T1PR+1)
EvbRegs.T4CMPR = 0x0013;//GP定时器的比较寄存器,调整该值可调节占空比
EvbRegs.T4CNT = 0x0000; //定时器初值
EvbRegs.T4CON.all = 0x1042 //连续增计数,不分频,使能比较,打开定时器
关于pwm定时器的计算可以参考文章http://blog.sina.com.cn/s/blog_8680cd7d0100wmwa.html
由于T4CON=0x1042,所以其对应TCLKS(按最低位为1开始计算,TCLKS对应T4CON的4、5位)=0,故TCLK=HSPCLK
本代码PWM频率与EvbRegs.T4PR有关,由于使用了连续增计数,所以其频率=TCLK/(T4PR+1)=105MHZ/(14*(0x25+1))=105MHZ/(532)
=197KHZ,大致上等于200KHZ.