功勋会员
WJ
- 积分
- 6304
- 威望
- 1456
- 贡献
- 4674
- 兑换币
- 17
- 注册时间
- 2008-4-6
- 在线时间
- 87 小时
|
其实HCS12X的时钟很简单,比起ARM,甚至是HCS08的8位MCU,就是一个PLL和BUS COLOCK之间的换算。
很多不人愿意看DATASHEET,图太多了,寄存器也是样不多一个样子,所以往往导致程序出问题。
但是,时钟,CRG这块很重要,是一切模块的基础。
那么,如果你不愿意write code,那么就generate code吧。
首先介绍一下process expert,是内嵌在codewarrior(for FSL)是的个代码生成器,但是它只能初始化,形成框架,创建中断。但是你的过程函数(procedure body)肯定是要自己写的。
基本上,所有的初始化都可以自动生成,包括很多人不愿意自己写的memory map,eeprom,中断优先级等杂复一点的问题。
总的概括来说,有如下几个方面的功能:
1 信号输入输出的自动生成和初始化;
2 信号测量功能的自动生成和初始化,包括测量脉冲,AD等;
3 定时器,看门狗。。
4 同步异步通信模块(IIC SPI SCI)
5 FLASH EEPROM操作
值得一提的是还有算法自动生成,在HCS12X里可以生成图像二进制数组。当然在CPU为DSP时,FFT,滤波等等算法也少不了。
主要的操作按上面的图123来就可以了,注意CODEWARRIOR版本要5.0的,5.0版以下的不支持XS128的PE。。。
如果还有加入其它的模块,点ADD BEAN,即可。
好了,按上面的图操作之后呢,点make,代码会自动生成。
不要纳闷生成的代码找不到,这是因为时钟代码放在_EntryPoint函数里了比main更早执行,比_Startup也早。其实在程序里0xFFFA起始的中断地址里,这个地址是复位中断地址。
代码如下:
setReg8(MMCCTL1, 0);
setReg8(DIRECT, 0);
setReg8(IVBR, 255);
setReg8(ECLKCTL, 64);
setReg8(CLKSEL, 0);
setReg8(PLLCTL, 129); /* Disable the PLL */
setReg8(SYNR, 65); /* Set the multiplier register */
setReg8(REFDV, 192); /* Set the divider register */
setReg8(POSTDIV, 0); /* Set the post divider register */
setReg8(PLLCTL, 193);
while(!CRGFLG_LOCK) { /* Wait until the PLL is within the desired tolerance of
}
setReg8Bits(CLKSEL, 128);
setReg8(VREGHTCL, 16);
真正有用的配置代码就 setReg8(SYNR, 65); setReg8(REFDV, 192);两句,而PE是出于完整性和规范性考虑,生成了一堆代码。
OK,基本就是这样了。 |
|