找回密码
 立即注册
楼主: zhp

使用AiCube遇到的典型问题反馈与讨论

[复制链接]

28

主题

1327

回帖

5046

积分

超级版主

积分
5046
 楼主| 发表于 2026-5-14 15:49:10 | 显示全部楼层
yzhk*** 发表于 2026-5-14 11:29
今天第一次用。发现一个问题 def.h文件
为什么
重复定义别名?是为了多种命名习惯搭配?

是的,不同的程序员有不同的习惯
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

28

主题

1327

回帖

5046

积分

超级版主

积分
5046
 楼主| 发表于 2026-5-14 15:50:56 | 显示全部楼层
yzhk*** 发表于 2026-5-14 11:48
还有一个问题。定时器时间,从32ms改成别的数字一律自动改回去。莫名其妙!!!搞定了。这个最大就是32,可 ...

说明你当前的工作频率和工作模式,最大只能定时到32ms
要定时更长时间,可选择1T模式,或者选择具有24位定时模式的单片机
回复

使用道具 举报 送花

35

主题

205

回帖

948

积分

高级会员

积分
948
发表于 2026-5-17 12:07:24 | 显示全部楼层
aicube目前给出的定时器程序是

void TIMER0_Init(void)
{
#define T0_PSCR                 (1)
#define T0_RELOAD               (65536 - (float)SYSCLK / (T0_PSCR + 1) * 1 / 1000) //定时周期1毫秒

    TIMER0_TimerMode();                 //设置定时器0为定时模式
    TIMER0_1TMode();                    //设置定时器0为1T模式
    TIMER0_Mode0();                     //设置定时器0为模式0 (16位自动重载模式)
    TIMER0_DisableGateINT0();           //禁止定时器0门控
    TIMER0_SetPrescale(T0_PSCR);        //设置定时器0的8位预分频
    TIMER0_SetReload16(T0_RELOAD);      //设置定时器0的16位重载值
    TIMER0_Run();                       //定时器0开始运行 #define TIMER0_Run() (TR0 = 1)

    //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
    // 在此添加用户初始化代码  
        TF0 = 0;
        EA=1;
        ET0=1;
    //<<AICUBE_USER_TIMER0_INITIAL_END>>
}
咨询了GLM,给出的建议是
  1.     TIMER0_TimerMode();                 
  2.     TIMER0_1TMode();                    
  3.     TIMER0_Mode0();                     
  4.     TIMER0_DisableGateINT0();           
  5.     TIMER0_SetPrescale(T0_PSCR);        
  6.     TIMER0_SetReload16(T0_RELOAD);      
  7.     //<<AICUBE_USER_TIMER0_INITIAL_BEGIN>>
  8.     // 在此添加用户初始化代码  
  9.     TF0 = 0;          // 1. 先清标志位
  10.     EA  = 1;          // 2. 开总中断
  11.     ET0 = 1;          // 3. 开定时器0中断
  12.    
  13.     TIMER0_Run();     // 4. 最后再启动定时器,保证计时的绝对0起点
  14.     //<<AICUBE_USER_TIMER0_INITIAL_END>>
复制代码

总结
现状:在 1ms 周期下,你的代码逻辑没有任何问题,不会造成偏差。
原因:开中断的指令执行速度(纳秒级)远快于定时器溢出速度(毫秒级)。
优化:如果追求极致的时序严谨性(或者未来可能用极短的中断周期),
建议养成“先清标志、开中断,最后启动定时器”的习惯。
回复

使用道具 举报 送花

2

主题

11

回帖

56

积分

注册会员

积分
56
发表于 2026-9-6 20:41:13 | 显示全部楼层
AiCube生成的所有定时器默认就是开的,非常不人性化!有的时候主程序初始化还没跑,中断函数莫名其妙先跑起来了,莫名其妙死机,很难排查!虽说可以在定时器初始化函数里手动关,但是这样的代码太丑陋了。希望官方可以把类似这种的初始化行为改一下
回复

使用道具 举报 送花

2

主题

11

回帖

56

积分

注册会员

积分
56
发表于 2026-9-6 20:43:04 | 显示全部楼层
zh*** 发表于 2026-5-14 15:49
是的,不同的程序员有不同的习惯

把定义和函数拆成两个头文件,有助于头文件的编写者维护头文件,同时也可以按需包含,只编译需要的部分,对二十年前的老电脑很友好。freertos就是这么做的
回复

使用道具 举报 送花

0

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2026-9-8 11:19:16 | 显示全部楼层
AiCube-ISP-v6.97A  生成的AI8051U_DEF.H 多了一个括号
#define PWMA_ClearBreakFlag()           WRITE_REG((PWMA_SR1, ~PWMASR1_BIF_MSK)
#define PWMA_ClearTriggerFlag()         WRITE_REG((PWMA_SR1, ~PWMASR1_TIF_MSK)
#define PWMA_ClearCOMFlag()             WRITE_REG((PWMA_SR1, ~PWMASR1_COMIF_MSK)
#define PWMA_ClearCC4Flag()             WRITE_REG((PWMA_SR1, ~PWMASR1_CC4IF_MSK)
#define PWMA_ClearCC3Flag()             WRITE_REG((PWMA_SR1, ~PWMASR1_CC3IF_MSK)
#define PWMA_ClearCC2Flag()             WRITE_REG((PWMA_SR1, ~PWMASR1_CC2IF_MSK)
#define PWMA_ClearCC1Flag()             WRITE_REG((PWMA_SR1, ~PWMASR1_CC1IF_MSK)
#define PWMA_ClearUpdateFlag()          WRITE_REG((PWMA_SR1, ~PWMASR1_UIF_MSK)


AiCube-ISP-v6.97A

AiCube-ISP-v6.97A

点评

多谢反馈,确实多了一个左括号,后续版本更正  详情 回复 发表于 2026-9-8 11:38
回复

使用道具 举报 送花

28

主题

1327

回帖

5046

积分

超级版主

积分
5046
 楼主| 发表于 2026-9-8 11:38:30 | 显示全部楼层
鹏_T*** 发表于 2026-9-8 11:19
AiCube-ISP-v6.97A  生成的AI8051U_DEF.H 多了一个括号
#define PWMA_ClearBreakFlag()           WRITE_RE ...

多谢反馈,确实多了一个左括号,后续版本更正
回复

使用道具 举报 送花

9

主题

28

回帖

183

积分

注册会员

积分
183
发表于 2026-9-10 16:29:53 | 显示全部楼层
建议I2C设置增加I2C_MasterWait函数的超时处理,要不容易锁死。
////////////////////////////////////////
// I2C主机模式等待命令完成
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
/*
void I2C_MasterWait(void)
{
    while (!I2C_CheckMasterFlag());     //等待完成标志
    I2C_ClearMasterFlag();              //清除完成标志
    I2C_Idle();                         //恢复IDLE状态
}
回复

使用道具 举报 送花

2

主题

11

回帖

56

积分

注册会员

积分
56
发表于 2026-10-1 17:32:29 | 显示全部楼层
反馈问题:
虽然公告上说STC8G,89C52等系列都能当作STC8H8K64U来配置,但是我在配置STC8G1K08A的时候发现,貌似两边的PWM,PCA和CCP的结构完全不一样,地址和配置不能通用,导致在这里头配置的这些外设不能在STC8G上正常运行。希望官方可以上新STC8G的相关配置
截图202610011731596126.jpg
回复

使用道具 举报 送花

9

主题

28

回帖

183

积分

注册会员

积分
183
发表于 2026-10-14 21:20:44 | 显示全部楼层
反馈问题,AI8051U单片机的串口没有校验的设置

点评

Ai8051U只有串口1和串口2试USART,有自动校验功能 串口3和串口4为普通UART,无自动校验功能 使能串口1和串口2校验位的步骤: 1、使能串口模块 2、选择9位数据位 3、选择校验位格式 [attachimg]149845[/attachimg  详情 回复 发表于 2026-10-15 10:05
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-11-7 12:08 , Processed in 0.086328 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表