想到手上正好有一套STC32G开发板,想着和大家分享一下具体的开发例程。
一:软件的打开

时钟来源:
内部高精度IRC时钟:频率范围:4MHz ~ 38MHz/33MHz;最常用,出厂校准。可省去外部晶振,简化电路,降低成本,能满足大部分UART通信、定时等对精度要求不高的场景
内部32KHz低速IRC时钟:32KHz;精度较低,主要用于看门狗(WDT) 或作为掉电唤醒定时器,不适合精确定时或高速通信
外部晶振/时钟:4MHz ~ 33MHz;精度最高。在对时钟精度要求极高的场合(如高精度RTC、CAN通信、-40°C~125°C的宽温工作),仍需外接晶振
内部PLL输出时钟:可达 96MHz 或 144MHz;提供超高速时钟,专用于高速PWM和高速SPI等需要极高时钟频率的外设,不直接作为CPU系统时钟
芯片工作流程:
默认启动:芯片上电后,默认使用内部高精度IRC时钟,频率为ISP下载时设定的值。
运行时切换:程序运行后,通过修改CLKSEL(时钟选择寄存器)等寄存器,可以在四种时钟源间动态切换。
分频使用:选定时钟源后,还可以通过一个8位分频器进行分频,再提供给CPU和各外设
三:定时器0配置

1:配置工作模式 (寄存器 TMOD)
设置定时器0为模式0 (16位自动重装载)
2:选择定时器时钟 (寄存器 AUXR)
决定计数脉冲频率。AUXR中的T0x12位是关键。
3:计算并设置初值 (寄存器 TH0, TL0)
这是最关键的一步。你需要计算出要让计数器从哪个数开始计数,才能在指定的时间后计满溢出。
计算设置初值功能:
定时器时钟频率 = 系统时钟频率 (SYSclk) / (TM0PS预分频值 + 1) / (1或12分频)
计数器初值 = 65536 - 定时时间 × 定时器时钟频率
4:开启中断 (寄存器 IE)
这是告诉CPU,当定时时间到了,要暂停主程序,去执行我们写的“中断服务函数”。
5:启动定时器 (寄存器 TCON)
一切就绪,用最后一条命令让定时器跑起来。程序配置如下:
void TIMER0_Init(void)
{
#define T0_PSCR (0)
#define T0_RELOAD (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 1 / 1000) //定时周期1毫秒
TIMER0_TimerMode(); //设置定时器0为定时模式
TIMER0_12TMode(); //设置定时器0为12T模式
TIMER0_Mode0(); //设置定时器0为模式0 (16位自动重载模式)
TIMER0_DisableGateINT0(); //禁止定时器0门控
TIMER0_SetIntPriority(2); //设置中断为较高优先级
TIMER0_EnableInt(); //使能定时器0中断
TIMER0_SetPrescale(T0_PSCR); //设置定时器0的8位预分频
TIMER0_SetReload16(T0_RELOAD); //设置定时器0的16位重载值
TIMER0_Run(); //定时器0开始运行
//<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_TIMER0_INITIAL_END>>
}四:原理图:
这里的使用的GPIO口,需要注意下将P4.0引脚拉低;在程序初始化时候调用即可。
五:测试定时器的计数功能void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
//<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
static int count0 = 0 ;
count0++;
if( count0 %1000 == 0)
{
count0 = 0 ;
P60 = ~ P60 ;
}
// 在此添加中断函数用户代码
//<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
}和其他的图形化配置功能类似,需要将用户代码放在用户区,否则再次生成驱动文件的时候,会导致程序的丢失。
简单来说,AIcube配置底层还是很方便的,接下来对其他的外设进行调试。
六:使用 STC USB LINK1D调试

使用官方的调试器,还可以直接进入仿真查看数据,可见不使用Printf函数。
我要赚赏金
