//本例程使用CHIPID内预置参数,设置HIRC为24MHz
//使用HPLL1,提供60Mhz,80Mhz,120Mhz的设置例程
STC32G144K246初始化配置.zip
(69.73 KB, 下载次数: 5)
程序内提供了:
1.设置WTST的例子
2.使用HPLL给系统时钟产生60Mhz/80Mhz/120Mhz的例子
3.使用I/O设置为开漏模式+打开内部上拉电阻等效原准双向口模式
4.配置xdata的读取速度(CKCON寄存器)
以下是一个使用定时器50ms反转一次P32端口,并且检测P32端口按键是否按下的效果
在长按P32一定时间后,会关闭定时器0的使能,使其不再闪烁(一个简单的例子,实现同时输出和输入的检测)
程序:
- #include "STC32G.H"
-
- //本例程使用CHIPID内预置参数,设置HIRC为24MHz
- //使用HPLL1,提供60Mhz,80Mhz,120Mhz的设置例程
- #define Fosc_60Mhz 0 //系统时钟为60Mhz
- #define Fosc_80Mhz 1 //系统时钟为80Mhz
- #define Fosc_120Mhz 2//系统时钟为120Mhz
-
- #define Main_Fosc Fosc_120Mhz //设置系统时钟为120Mhz
-
- void CLK_Init(void); //设置系统时钟,由Main_Fosc定义设置
- void Timer0_Init(void); //定时器0初始化函数
- void Io_Init(void); //I/O口初始化函数,设置P32为开漏+打开内部上拉电阻模式
- bit P32_OUT = 1; //用于确定输出电平
-
- void main(void)
- {
- EAXFR = 1; //使能访问扩展RAM区特殊功能寄存器(XFR)
- CKCON &= ~0x07; //清空[2:0],设置外部数据总线等待时钟为0(最快),默认为7
- CLK_Init(); //设置HPLL时钟为指定频率
- Timer0_Init(); //初始化定时器0,50毫秒@120MHz
- Io_Init(); //初始化I/O口,设置P32等效为原准双向口模式(开漏模式+打开内部上拉电阻)
- EA = 1; //打开总中断
- while(1)
- {
- //用户程序
- }
- }
-
- char off_t0_cnt = 0;
- void Timer0_Isr(void) interrupt 1
- {
- if(P32_OUT == 1&&P32 == 0&&off_t0_cnt<100)off_t0_cnt++; //判断外部P32按键按下一定时间时,关闭定时器0
- if(off_t0_cnt>5)TR0 = 0;//注:仅在P32输出为1的时候,外部的按键按下才能被读到
- P32_OUT = ~P32_OUT;//每隔10ms亮/灭切换一次
- P32 = P32_OUT; //将输出电平给P32管脚
- }
-
- void Timer0_Init(void) //50毫秒@120MHz
- {
- TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x3F; //设置定时初始值
- TH0 = 0x01; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- T0CLKO = 1; //使能P35输出定时器溢出时钟
- }
-
- void Io_Init(void)
- {
- P3M0 |= 0x04; P3M1 |= 0x04; //P32设置为开漏输出
- P3PU |= 0x04; //打开P32的上拉电阻
- //I/O口设置为开漏输出+打开上拉电阻==原准双向口模式,写1可读外部电平
-
- P3M0 |= 0x20; P3M1 &= ~0x20;//设置P35为推挽输出模式,用于观察定时器0的T0CLKO输出
- }
-
- void Delay10ms(void) //@120MHz
- {
- unsigned long edata i;
-
- _nop_();
- _nop_();
- i = 299998UL;
- while (i) i--;
- }
-
- void CLK_Init(void)
- {
- #if Main_Fosc == Fosc_120Mhz
- WTST = 4;CLKDIV = 2; //设置系统时钟=480MHz/2/2=120MHz,(因为CLKSEL选择时,已经将HPLL/2了)
- #elif Main_Fosc == Fosc_80Mhz
- WTST = 3;CLKDIV = 3; //设置系统时钟=480MHz/2/3=80MHz
- #elif Main_Fosc == Fosc_60Mhz
- WTST = 2;CLKDIV = 4; //设置系统时钟=480MHz/2/4=60MHz
- #endif
- //以下为超过60MHz时,系统时钟使用HPLL方式提供
- VRTRIM = CHIPID22; //载入27MHz频段的VRTRIM值
- IRTRIM = CHIPID12; //指定当前HIRC为24MHz,此时会覆盖掉ISP设置的时钟频率
- IRCBAND &= ~0x03; //清空频段选择
- IRCBAND |= 0x01; //选择27Mhz频段
- HPLLCR &= ~0x10; //选择HPLL输入时钟源为HIRC
- HPLLPDIV = 4; //24MHz/4=6MHz,需要保证输入HPLL的时钟在6MHz附近
- HPLLCR |= 0x0e; //HPLL=6MHz*80=480MHz
- HPLLCR |= 0x80; //使能HPLL
- Delay10ms();
- CLKSEL &= ~0x03; //BASE_CLK选择为HIRC,用以提供给HPLL
- CLKSEL &= ~0x0c; //清空主时钟源选择
- CLKSEL |= 1<<2; //设置主时钟源为内部 HPLL1 输出/2
- }
复制代码
|