这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【AIcubeV1.01L】使用AIcube创建工程底层驱动

共1条 1/1 1 跳转至

【AIcubeV1.01L】使用AIcube创建工程底层驱动

高工
2026-04-07 15:12:57     打赏
    最近项目上有用到STC的芯片,之前开发都是在之前的工程代码上开发。AI cube项目推出了有一段时间了。

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

一:软件的打开

01-1打开链接.png

二:系统时钟配置

01-2时钟配置.png

时钟来源:

内部高精度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配置

01-3定时0配置.png

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>>
}
四:原理图:

01-4LED灯.png

这里的使用的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调试

01-5 调试界面.png

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




关键词: AIcube     创建    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]