本帖最后由 lising 于 2019-7-2 15:02 编辑
本次实验利用CH549内部的定时器资源产生定时时间,控制板载的LED翻转产生闪烁效果。实验的主要目的是为了更深入地学习了解CH549的时钟系统及定时器资源。
一、实验资源
1、CH549EVT学习开发板;
2、Keil v5.28.0.0;
3、CH549开发资料汇总.rar;
4、WCHISPTool v2.70;
5、CH549EVT其它相关文档;
6、逻辑分析仪;
其它更多资讯可访问江苏沁恒股份有限公司 http://wch.cn/
二、实验准备
1、认识CH549的时钟系统。下面是CH549 时钟系统及结构图:
从上图可以直观地了解到CH549对于时钟可以有两种选择,即内部时钟24MHz及外部晶振,选择是通过时钟控制寄存器“CLOCK_CFG”的“bOSC_EN_INT”进行二选一设置。“CLOCK_CFG”复位值为“0X83”,即bOSC_EN_INT=1使用内部时钟24MHz。被选择的时钟做为原始时钟经PLL倍频后Fpll兵分两路:一路经USB时钟分频器分频后供USB设备使用;另一路则通过“CLOCK_CFG”的[2:0]“MASK_SYS_CK_SEL”系统时钟分频器进行分频,分频后的系统时钟“Fsys”供CH549其它资源使用,当然对于部分模块还可以根据不同的使用要求进行更一步的分频处理。“MASK_SYS_CK_SEL”系统时钟分频器可对“Fpll”进行八种分频,为应用提供了极大的灵活性。
通过学习了解可以看到CH549的时钟系统功能强大,并且应用灵活,方便了产品的设计应用。
2、定时器资源。CH549具备T0/T1/T2等三组标准51定时器。这次实验使用了TIMER0的定时器模式1,并启用中断。下面是TIMER0的系统图:
从图中可以看出,模式1对于计时时钟有多种选择方式,通过寄存器“T2MOD”相关位“bTMR_CLK”、“bT0_CLK ”进行配置。“T2MOD”复位值为“0X00”,即这使得定时/计数的应用更加灵活。
3、GPIO端口。CH549的GPIO功能较之传统51也有着极大的改进,使得GPIO面向不同的应用更加灵活方便。主要表现在增加了GPIO端口的输出模式寄存器“Pn_MOD_OC”,通过对其进行配置可将GPIO端口配置为“推挽输出”或“开漏输出”;增加了GPIO端口的输入、输出方向选择和“开漏输出”模式下的上拉电阻使能控制,通过对端口方向控制和上拉使能寄存器“Pn_DIR_PU”的配置,可将GPIO端口在“推挽输出”模式下设置为“输入”或“输出”;或将GPIO端口在“开漏输出”模式下设置为“使能上拉电阻”或“禁止上拉电阻”。这些都使得GPIO功能更加强大,更加灵活。
三、本次实验。
1、资源配置
使用定时器T0产生50ms中断,在中断函数中将与P22连接的LED取反,使其产生闪烁。为了便于实验将CLOCK_CFG=0X83(系统复位值)即使用内部时钟Fosc=24MHz时Fsys=12MHz;T2MOD=0X00(系统复位值)即“bT0_CLK=0”,T0内部时钟频率选择标准时钟Fsys/12。
2、程序实现
程序比较简单,直接对照手册配置了寄存器:
#include "CH549.H"
sbit D2 = P2^2;
sbit D3 = P2^3;
sbit D4 = P2^4;
sbit D5 = P2^5;
void CLK_Config(void)
{
CLOCK_CFG = 0x83;
}
void GPIO_Config(void)
{
P2_MOD_OC &= ~(D2|D3|D4|D5);//设置P2.2、P2.3、P2.4、P2.5为推挽输出
P2_DIR_PU |= (D2|D3|D4|D5);
}
void TIMER0_Config(void)
{
//bTMR_CLK=1使用没有分频的系统主频Fsys作为计数时钟;
//bTMR_CLK=0使用分频的系统主频Fsys作为计数时钟;
//bT0_CLK=0 选标准时钟Fsys/12;
//bT0_CLK=1 选快速时钟Fsys/4(bTMR_CLK=0)或 Fsys(bTMR_CLK=1);
T2MOD = 0X00;
TMOD = 0X01; //配置TIMER0为定时器工作方式1(16位)
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
TR0 = 1; //启动TIMER0
ET0 = 1; //TIMER0中断允许
EA = 1; //全局中断使能
}
void main(void)
{
CLK_Config();
GPIO_Config();
TIMER0_Config();
while(1)
{
}
}
void TIMER0_ISR(void) interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
D2 = ~D2;
}
四、实验结果
五、实验总结
通过这次实验对CH549的系统时钟、定时器T0、GPIO配置、定时器中断等有了更进一步的认识和了解,算是为CH549其它强大资源的实验学习进行了热身准备。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处