📄 f340_init.h
字号:
/********************************************************************
c8051f340/1/4/5 的系统内部时钟的控制,IO口和交叉开关的初始化。
调用时根据宏定义中对各个寄存器每位的解释改变相应寄存器宏定义的值
在void f340_io_osc_init(void)函数中改变相应端口寄存器的值
在主程序中调用void f340_io_osc_init(void)函数
注:void f340_io_osc_init(void)函数必须在主函数中最先执行,否则MCU会无法正常工作
版本:0.4(2010.08.22)【与0.3版比,加入了时钟选择寄存器CLKSEL和4倍频时钟控制寄存器CLKMUL】
********************************************************************/
#include "c8051f340.h"
#ifndef _f340_init_h
#define _f340_init_h
/*********************************************************************
系统内部时钟频率选择
寄存器:OSCICN
**********************************************************************/
#define iosc_12M 0x03
#define iosc_6M 0x02
#define iosc_3M 0x01
#define iosc_1p5M 0x00
/******************************************
注意:下面的定义中》able结尾的是和OSCICN相或
disable结尾的是相与,系统内部时钟控制
******************************************/
#define ioscen_able 0x80 //使能内部震荡器(系统复位后默认使能)
#define ioscen_disable 0x7f
#define iosc_suspend_able 0x20 //强制挂起内部震荡器
#define iosc_suspend_disable 0xdf
#define iosc_val iosc_12M|ioscen_able//根据上面的宏定义改变这里的值
/************************----CLKMUL(4倍时钟乘法器控制寄存器,不可位寻址)----***************************/
#define MULLEN 0X80 //4倍时钟乘法器使能
#define MULINIT 0X40 //时钟乘法器初始化控制,这里在使能时钟乘法器(MULLEN)之前是0,使能之后置1将初始化时钟乘法器,然后等待MULRDY位置1
#define MULRDY 0X20 //时钟乘法器稳定标志,1.时钟乘法器启动并且稳定了
#define MULSEL 0X00 //时钟乘法器输入选择
/********时钟乘法器输入选择*********/
//0x00: 内部振荡器 0x01:外部振荡器
//0x02:外部振荡器/2
/**********************************/
#define CLKMUL_VAL MULSEL //CLKMUL
/*************************----CLKSEL(系统时钟与USB时钟的选择,不可位寻址)-------****************/
#define USBCLK 0X00 //USB时钟的选择,当USB工作在高速模式时,时钟应该是48MHz,工作在低速模式时,时钟是6MHz
/*******USB时钟的选择值********/
//
//0x00: 4倍时钟乘法器 0x10:内部振荡器/2
//0x20:外部振荡器 0x30:外部振荡器/2
//0x40:外部振荡器/3
/*****************************/
#define SYSCLKSEL 0X00 //系统时钟选择
/********系统时钟的选择值*****/
//0x00: 内部振荡器 0x01:外部振荡器
//0x02:4倍时钟乘法器/2 0x03:4倍时钟乘法器
//0x04:低频振荡器
/*****************************/
#define CLKSEL_VAL USBCLK|SYSCLKSEL //CLKSEL
/********************************************************************
交叉开关选项,与外设接口的控制
寄存器:XBR0,XBR1,XBR2
*********************************************************************/
/***-----XBR0----***/
#define port_cp1ae 0x80//比较器1异步输出接口
#define port_cp1e 0x40//比较器1输出接口
#define port_cp0ae 0x20
#define port_cp0e 0x10
#define port_sysclk 0x08//系统时钟输出使能
#define port_smbus 0x04//smbus connection enable
#define port_spi 0x02//spi connection enable
#define port_uart 0x01//uart connection enable,tx0(P0.4) and rx0(P0.5)
#define xbr0_val 0x00//根据上面的宏定义改变这里的值
/***-----XBR1----***/
#define port_weakpud 0x80//弱上拉禁止,清零则使能弱上拉
#define port_xbre 0x40//交叉开关的总体使能。必须使能这一位IO口才能工作
#define port_t1 0x20//connection timer 1
#define port_t0 0x10//connection timer 0
#define port_ecie 0x08//pca0外部计数输入使能
#define port_pca0me 0x00
/*---------------------------------
pca0me(pca模块IO使能位)的选择如下:
0x00:所有模块都不连接到IO引脚
0x01:连接CEX0
0x02:连接CEX0,CEX1
0x03:连接CEX0,CEX1,CEX2
0x04:连接CEX0,CEX1,CEX2,CEX3
0x05:连接CEX0,CEX1,CEX2,CEX3,CEX4
0x06,0x07为保留
----------------------------------*/
#define xbr1_val port_xbre //根据上面的宏定义改变这里的值
/***-----XBR2-----***/
#define port_uart1 0x01//xbr2只有第0位有用,其余位为保留位
#define xbr2_val 0x00//根据上面的宏定义改变这里的值
void f340_io_osc_init(void)
{
PCA0MD &= ~0x40; //关闭看门狗定时器,看门狗默认是开着的。。一般都先关了。到用的时候再开
OSCICN |= iosc_val; //内部高频振荡器12M晶振做为系统时钟
CLKMUL |= CLKMUL_VAL; //4倍时钟选择寄存器
CLKSEL |= CLKSEL_VAL; //系统及USB时钟选择
/*----------------------------set i/o-----------------------------------------*/
P0MDIN |= 0xff; //0为模拟输入。。1为数字输入
P1MDIN |= 0xff;
P2MDIN |= 0xff;
P3MDIN |= 0xff;
P4MDIN |= 0xff;
P0SKIP = 0xc0; //0为不跳过。。1为跳过
P1SKIP = 0x00;
P2SKIP = 0x00;
P3SKIP = 0x00;
P0MDOUT |= 0x00; //0为漏极开路方式输出。。1为推挽方式输出
P1MDOUT |= 0xff;
P2MDOUT |= 0xff;
P3MDOUT |= 0xff;
P4MDOUT |= 0x00;
XBR0 |= xbr0_val;
XBR1 |= xbr1_val;
XBR2 |= xbr2_val;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -