本次实验利用CH549内部的串口UART0并使用定时器T2产生波特率,通过沁恒USB转串口模块向PC端发送数据,使用串口调试助手进行显示。
一、实验资源
1、CH549EVT学习开发板;
2、Keil v5.28.0.0;
3、CH549开发资料汇总.rar;
4、WCHISPTool v2.70;
5、CH549EVT其它相关文档;
6、沁恒USB转串口模块;
7、串口调试助手SSCOM51 v5.13.1;
二、实验准备
1、CH549串口资源。CH549共有4个全双工的异步串口UART0~UART3,其中UART0 是标准MCS51串口;UART1是简化MCS51串口;UART2是在UART1的基础上,增加了一个中断使能位,用于替换 ADC中断;UART3同UART2,也是在UART1的基础上,增加了一个中断使能位,用于替换PWMX中断。
2、与串口相关寄存器。可以看到串口数量多,相关的的寄存器不少。本次实验只是利用了UART0。
下面是UART0的相关寄存器介绍:
UART0应用:
手册中对于UART0的使用介绍比较详细,对照手册就可以完成UART0的相应配置。
3、T2波特率发生器。T2用作波特率发生器首先要对T2控制寄存器“T2CON”的“RCLK”及“TCLK”位置高,用以确定UART0选择定时器T2溢出脉冲产生波特率。在这里要考虑定时器T2做为波特率发生器的时钟频率问题,也就要根据T2方式寄存器“T2MOD”配置的不同而采用不同的波特率计算工式,主要就是其中的“bTMR_CLK”及“bT2_CLK”位。
三、本次实验
按照前面的介绍对UART0进行了相关配置,时钟Fsys选用了默认的12MHz,利用“RCAP2 = 65536 - Fsys / 16 / 波特率”计算波特率,在测试中发现偏差太大,后面测试中将Fsys提升至48MHz。经计算实际波特率=48000000/16/26=115384,误差=0.16%。其实在Fsys=24MHz时也同样只有0.16%的误差。
另外,对“CLOCK_CFG”进行配置首先要进入安全模式:
实验中顺便读取了芯片ID识别码。
测试代码参考了官方DEMO程序。测试代码如下:
#define Fsys 48000000
#define UART0_BAUD 115200
void UART0_Config(void)
{
SAFE_MOD = 0x55;
SAFE_MOD = 0xAA; //进入安全模式
CLOCK_CFG = 0X87; //使能内部晶振,Fsys=48MHz
SM0 = 0;
SM1 = 1; //UART0使用模式1
SM2 = 0;
RCLK = 1; //UART0接收时钟选择T2溢出脉冲产生波特率
TCLK = 1; //UART0发送时钟选择T2溢出脉冲产生波特率
//T2CON = 0X34;
PCON |= 0X80; //SMOD=1
T2MOD = 0XC0; //bTMR_CLK=1、bT2_CLK=1
RCAP2 = 65536 - (Fsys / 16 / UART0_BAUD); //
TR2 = 1; //启动T2定时器
TI = 1;
REN = 1; //UART0接收使能
}
void main()
{
UINT16 ID;
UART0_Config();
ID = CHIP_ID; //读芯片ID识别码,CH549为0X49
printf("\nWCH CH549EVT UART0 TEST\n");
printf("CHIP_ID = %#2X\n",ID);
while(1)
{
}
}
四、实验结果
五、实验总结
通过本次实验对CH549串口模块UART0有了更进一步的认识,串口程序调试通过会给后期的实验测试带来很多的方便。
此内容由EEWORLD论坛网友lising原创,如需转载或用于商业用途需征得作者同意并注明出处
引用: 我芯永恒 发表于 2019-7-3 16:25 腻害!好的开始就是成功
谢谢表扬!继续努力。