×
嵌入式 > 技术百科 > 详情

NEC V850 之 系统时钟及内部设备时钟

发布时间:2020-06-20 发布时间:
|
首先说明下,之前没有搞时钟就开始看I/O口还有外部中断是不对的。幸好发现的不晚,现在把这必须的一课给补上。如果连时钟都搞不明白,下面的外设是肯定没法弄的。另外放弃了原来做一个总体程序包的想法,主要是太浪费时间了,完成一个器件的驱动还要想把他无缝的添加到原来的程序结构里去,现在不是做这个工作的时候,需要快速的把测试完成,然后上系统去调试。

下面开始正题,V850的时钟还是比较饶人的,需要仔细的去读datasheet,另外我到现在还有无法理解的地方在datasheet上面。下图是系统时钟的框图:(红色的圈里就是不理解的地方,不知道在哪个地方设置)

下面我会把代码和示波器测量的截图发出来。先是代码:

代码出处 system.c

void SystemClkInit( void )
{
unsigned char psval = 0;

VSWC = CG_VSWC_VALUE; // 设置 内部外围功能控制寄存器 值为17
/* Set main system clock */
OSTS = CG_OSCSTAB_SEL16; // 设置 晶振稳定时间选择寄存器 值为0x06(2^16/fx),为下面检测OSTC做准备
psval = CG_CPUCLK_MAINFEEDBACK | CG_CPUCLK_SUBNOTFEED | CG_CPUCLK_MAINENABLE;
PRCMD = psval;
PCC = psval; // 设置 MCU时钟控制寄存器 值为0x80,禁止子时钟振荡器,使能主时钟振荡器
while (!(OSTC || 0x00)) // 检测 晶振稳定时间状态寄存器 的最低为是不是为1(晶振震荡以稳定)
{
;
}
PLLS = CG_PLLLOCKUP_SEL1; // 设置 锁相环锁定时间规格寄存器 值为0x03(2^13/fX (default value)),为下面检测LOCKR做准备
PLLON = 1; // 设置 PLLCTL锁相环控制寄存器 最低位为1,使能锁相环启动
while (LOCKR && 0x01) // 检测 锁相环锁定状态寄存器 的最低为是不是为0(锁相环以锁定)
{
;
}
psval = CG_MAINSYS_MAINOSC;
PRCMD = psval;
MCM = psval; // 设置 系统主时钟方式寄存器 值为0x01(设定主时钟源非内部高速振荡源)
SELPLL = 1; // 设置 PLLCTL锁相环控制寄存器 的次低位为1,与MCM寄存器配合设置主时钟通过锁相环倍频
/* Set fCPU */
psval = PCC | CG_CPUCLK_MAIN0; // 设置 系统主时钟的分频系数,对内部设备时钟没有任何影响,仍然为32MHz
PRCMD = psval;
PCC = psval; // 设置 MCU时钟控制寄存器 的低4位,设置分频系数
RCM = CG_RCM_INITIALVALUE | CG_LOWCLK_STOP | CG_HICLK_STOP;//设置 内部振荡器模式寄存器 值为0x83,关闭内部高速,低速振荡源
/* Set fXP1 */
SELCNT4 = CG_SELCNT4_FXX; // 设置 选择控制寄存器4 值为0x00,选择时钟源为fxx
/* Set fBRG */
PRSM0 = CG_PRESCALER3_DISABLE; // 设置 预分频3方式寄存器 值为0x00,禁止分频
/* WDT2 setting */
WDTM2 = 0x1F; // 设置 看门狗定时器2方式寄存器 值为0x1F,看门狗停止
}



代码出处 main.c

void main( void )
{
SystemClkInit(); // 初始化系统时钟为32MHz

/* CLKOUT pin set */
PMCCM |= 0x02; // 设置系统时钟输出引脚使能,输出值为系统时钟(32MHz)

/* PCL pin set */
PFC9H &= 0xDF;
PFCE9H |= 0x20;
PMC9H |= 0x20; // 设置P9_13脚为第二功能,时钟输出功能
PCLM = CG_PCL_ENABLE | CG_PCL_SEL0;
// 设置时钟输出功能使能,并且设置其分频系数(这里是进行4分频,输出为8MHz)

while (1);
}



代码出处 system.h

/* CPU system clock selection (CK3~0) */
#define CG_CPUCLK 0x07
#define CG_CPUCLK_MAIN0 0x00 /* fCPU = fXX */
#define CG_CPUCLK_MAIN1 0x01 /* fCPU = fXX/2 */
#define CG_CPUCLK_MAIN2 0x02 /* fCPU = fXX/2^2 */
#define CG_CPUCLK_MAIN3 0x03 /* fCPU = fXX/2^3 */
#define CG_CPUCLK_MAIN4 0x04 /* fCPU = fXX/2^4 */
#define CG_CPUCLK_MAIN5 0x05 /* fCPU = fXX/2^5 */
#define CG_CPUCLK_SUB 0x08 /* fSC (fXT or fRL) */
/* PCL clock frequency selection (PCK1~0) */
#define CG_PCL_SEL0 0x00 /* fPCL= fPLLO/4 */
#define CG_PCL_SEL1 0x01 /* fPCL= fPLLO/8 */
#define CG_PCL_SEL2 0x02 /* fPCL= fPLLO/16 */
#define CG_PCL_SEL3 0x03 /* fPCL= fPLLO/32 */

上面的代码设置系统主时钟输出32MHz可以在第一幅图的CLKOUT端口测量,在70f3630里是引脚"PCM1",可编程输出时钟输出为8MHz在70f3630里是引脚"P9_13"引脚。下面两幅图是用示波器测量的结果作为佐证:

可以发现波形比较不好,应该是因为频率高造成的,在负半轴和超出5v的地方都有了比较大的文波,尤其是32MHz的输出,也有一部分原因是因为,管脚的反转速率达不到这么高。
如果我们想修改系统时钟频率或者是输出频率,可以对照着代码部分高亮的地方修改,注释里也有详细说明。
下面是修改后的波形图:
可以观察到,在频率下降后,波形会有不同程度的好转。

 最后补充一点:
经过测试,在V850里的系统始终一旦设置为一个数值(比如32MHz),他的内部设备总线时钟就也同时被设置为相同的频率,在每个外设的设置里有分配寄存器,但是内部设备总线时钟是无法变动了。仔细的看第一幅图就会发现和图是不一致的,如果有知道的朋友,希望不吝赐教。 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
iPhone将是质的飞跃:苹果A14处理器+高通X55基带