wuzhengmin 发表于 2026-1-17 12:27:47

接着就自动产生项目框架:

wuzhengmin 发表于 2026-1-17 12:31:27

看看主函数:

wuzhengmin 发表于 2026-1-17 12:33:44

这里我们肯定有点不习惯


////////////////////////////////////////
// 系统初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
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();                  //使能全局中断
}


之前都是直接对寄存器操作,现在看上去都是函数:


wuzhengmin 发表于 2026-1-17 12:35:21

例如EnableAccessXFR();                  //使能访问扩展XFR

我们打开这个函数看看:

wuzhengmin 发表于 2026-1-17 12:38:09

是在Ai8051u_def.h里定义的

而这个Ai8051u_def.h,会在config.h里包含:



wuzhengmin 发表于 2026-1-17 12:41:12

单说这一句定义:

#define EnableAccessXFR()               SET_REG_BIT(P_SW2, EAXFR_MSK)

肯定要去追寻 SET_REG_BIT(P_SW2, EAXFR_MSK):

wuzhengmin 发表于 2026-1-17 12:43:30

偶,原来是在def.h定义:

#define SET_REG_BIT(r, b)       ((r) |= (b))

((r) |= (b))是什么?

wuzhengmin 发表于 2026-1-17 12:45:48

真没找到!

wuzhengmin 发表于 2026-1-17 12:51:23

其实我觉得80% 的可能就是这一句:

EAXFR = 1;                                        //允许访问扩展的特殊寄存器,XFR

只要不出错,能正常运行就可以啦,时代变了,以后都是Ai,哪里能每一句都看懂?

不过要是真正帮人开发项目,还是不要啦,太心虚..........

这句大家都搞的懂,就怕细微的地方出问题!

先不管,加点东西进去,看看能否正常动起来!


接着回去添加Time0

wuzhengmin 发表于 2026-1-17 13:01:56

//<<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:是不是不能说看不懂,但心里不习惯,没有自己给寄存器赋值踏实的感觉有没有?


页: 64 65 66 67 68 69 70 71 72 73 [74] 75 76 77 78 79 80 81 82 83
查看完整版本: 有关DMA,山东大学陈桂友教授