接着就自动产生项目框架:
看看主函数:
这里我们肯定有点不习惯
////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void SYS_Init(void)
{
EnableAccessXFR(); //使能访问扩展XFR
AccessCodeFastest(); //设置最快速度访问程序代码
AccessIXramFastest(); //设置最快速度访问内部XDATA
IAP_SetTimeBase(); //设置IAP等待参数,产生1us时基
//<<AICUBE_USER_PREINITIAL_CODE_BEGIN>>
// 在此添加用户预初始化代码
//<<AICUBE_USER_PREINITIAL_CODE_END>>
PORT3_Init(); //P3口初始化
CLK_Init(); //时钟模块初始化
delay_ms(1);
USBLIB_Init(); //USB库初始化
delay_ms(1);
//<<AICUBE_USER_INITIAL_CODE_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_INITIAL_CODE_END>>
EnableGlobalInt(); //使能全局中断
}
之前都是直接对寄存器操作,现在看上去都是函数:
例如EnableAccessXFR(); //使能访问扩展XFR
我们打开这个函数看看:
是在Ai8051u_def.h里定义的
而这个Ai8051u_def.h,会在config.h里包含:
单说这一句定义:
#define EnableAccessXFR() SET_REG_BIT(P_SW2, EAXFR_MSK)
肯定要去追寻 SET_REG_BIT(P_SW2, EAXFR_MSK):
偶,原来是在def.h定义:
#define SET_REG_BIT(r, b) ((r) |= (b))
((r) |= (b))是什么?
真没找到!
其实我觉得80% 的可能就是这一句:
EAXFR = 1; //允许访问扩展的特殊寄存器,XFR
只要不出错,能正常运行就可以啦,时代变了,以后都是Ai,哪里能每一句都看懂?
不过要是真正帮人开发项目,还是不要啦,太心虚..........
这句大家都搞的懂,就怕细微的地方出问题!
先不管,加点东西进去,看看能否正常动起来!
接着回去添加Time0
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: timer.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2026-01-17) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h"
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 定时器0初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_Init(void)
{
#define T0_PSCR (102)
#define T0_RELOAD (65536 - (float)SYSCLK / 12 / (T0_PSCR + 1) * 2 / 1) //定时周期2秒
TIMER0_TimerMode(); //设置定时器0为定时模式
TIMER0_12TMode(); //设置定时器0为12T模式
TIMER0_Mode0(); //设置定时器0为模式0 (16位自动重载模式)
TIMER0_DisableGateINT0(); //禁止定时器0门控
TIMER0_SetIntPriority(0); //设置中断为最低优先级
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>>
}
////////////////////////////////////////
// 定时器0中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void TIMER0_ISR(void) interrupt TMR0_VECTOR
{
//<<AICUBE_USER_TIMER0_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
//<<AICUBE_USER_TIMER0_ISR_CODE1_END>>
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
重新生成(增加了Time0)
先看看上面的timer.c:是不是不能说看不懂,但心里不习惯,没有自己给寄存器赋值踏实的感觉有没有?