zhp
发表于 2025-5-26 14:31:04
ercircle 发表于 2025-5-26 13:21
EEPROM的问题:
1.MOV方式操作和手册例程差异,函数内未加绝对地址0xFF0000
由于两个程序访问EEPROM的方式不一样,如下:
zhp
发表于 2025-5-26 14:36:03
ercircle 发表于 2025-5-26 13:21
EEPROM的问题:
1.MOV方式操作和手册例程差异,函数内未加绝对地址0xFF0000
数据手册中有详细说明
哪些硬件选项立即生效,哪些需要重启才生效
如果觉得单个记麻烦,可以下载后强制重新上电,所有的选项就都有效了
davidyan
发表于 2025-5-26 15:30:28
<p>提bug,AiCube创建PCA相关代码中,空闲模式停止计数设置 和 生成的代码是反的。</p>
<p><img src="data/attachment/forum/202505/26/152737kbhg6vb8dpg77dz2.png" alt="974adb28876dfbeed208d87c847391ef.png" title="974adb28876dfbeed208d87c847391ef.png" /></p>
<p><img src="data/attachment/forum/202505/26/152754nsfpkp4p6s23ukq3.png" alt="6c18ad278f1b0790ae2c28718dc79bad.png" title="6c18ad278f1b0790ae2c28718dc79bad.png" /></p>
<p><img src="data/attachment/forum/202505/26/152809bqkmccceqkqelm2a.png" alt="e6dbb34e8d0516fd374ecd0daacaeb5c.png" title="e6dbb34e8d0516fd374ecd0daacaeb5c.png" /></p>
zhp
发表于 2025-5-26 17:32:29
davidyan 发表于 2025-5-26 15:30
提bug,AiCube创建PCA相关代码中,空闲模式停止计数设置 和 生成的代码是反的。
多谢,收到!
HelloWorld
发表于 2025-5-27 10:22:15
使用STC32F12K54,需要注释掉SYS_Init函数中的CLK_Init(),否则时钟压根就不对,USB虚拟串口和串口都没能使用。
zhp
发表于 2025-5-27 18:19:38
HelloWorld 发表于 2025-5-27 10:22
使用STC32F12K54,需要注释掉SYS_Init函数中的CLK_Init(),否则时钟压根就不对,USB虚拟串口和串口都没能使 ...
STC32F12K54和STC32G12K128差异比较大,特别是时钟部分
用AiCube产生的基于STC32G12K128的代码在STC32F12K54不能直接运行
stc-xuewei
发表于 2025-5-29 19:27:52
使用Aicube生成工程,配置uart1,禁止接收数据,不开启串口中断。
其中生成putchar()函数如下:
////////////////////////////////////////
// 重写printf字符发送重定向函数
// 入口参数: dat (printf函数待打印的字符)
// 函数返回: 需要返回入口参数的数据
////////////////////////////////////////
char putchar (char dat) //将串口1和printf函数绑定
{
while (!UART1_CheckTxFlag());
UART1_ClearTxFlag();
UART1_SendData(dat);
return dat;
}
下载运行,发现没发应,好像进行了某种循环。
主程序如下:
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
printf("Hello World !\n");
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
printf()会调用putchar()函数
而putchar()先查询标志,会导致得不到执行,一直在循环。
应作如下修改:
char putchar (char dat) //将串口1和printf函数绑定
{
UART1_SendData(dat);
while (!UART1_CheckTxFlag());
UART1_ClearTxFlag();
return dat;
}
就是先发送字符,再查询标志,然后清标志。
zhp
发表于 2025-5-30 09:14:13
stc-xuewei 发表于 2025-5-29 19:27
使用Aicube生成工程,配置uart1,禁止接收数据,不开启串口中断。
其中生成putchar()函数如下:
AiCube产生的代码没有问题
按照你的设置,串口初始化时会自动增加下面这个语句
即,初始化时将TI置1
在putchar函数中先判断TI,再发送数据
可以避免发送数据时死等
这是Keil标准处理方法
davidyan
发表于 2025-5-30 10:50:29
我在看Ai8051U的传统库函数代码,觉得它的代码质量也很高,复用性很强。但是它的代码跟AiCube两套体系,虽然说没有不兼容吧,但是如果跟AiCube一起用,不小心就会存在两套功能相似的代码。
从功能上库函数包含了初始化和一些功能函数(比如串口收发缓冲区, LIN总线协议,595驱动等),而AiCube主要定位是初始化设置,所以有个心愿,就是希望AiCube能直接集成库函数,把库函数中复用性强的代码也移植进来。
davidyan
发表于 2025-5-30 11:26:15
zhp 发表于 2025-5-30 09:14
AiCube产生的代码没有问题
按照你的设置,串口初始化时会自动增加下面这个语句
<p>我测试了一下,aicube版本V1.00L, isp版本6.95R</p>
<p><img src="data/attachment/forum/202505/30/112422cud4gpb0ldnj0z4w.png" alt="23cb6c46-0bc6-4c3c-abbd-a94fd64e3632.png" title="23cb6c46-0bc6-4c3c-abbd-a94fd64e3632.png" /></p>
<p>现在开启print重定向后,会使用一个fPrintfBusy标识变量,但发送完成后中断函数中没有重置为0,导致只能发一个字符,再发还是死循环(附aicube生成的代码main.c)。这里putchar要么同步等待数据发送完再退出,要么用异步缓冲区的方式(附ai8051u库函数代码,怀疑异步队列方式,发送数据量大会溢出覆盖,还未测试)<a href="forum.php?mod=attachment&aid=102027" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:AI8051U_UART.c</a><a href="forum.php?mod=attachment&aid=102028" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:AI8051U_UART.h</a><a href="forum.php?mod=attachment&aid=102029" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:AI8051U_UART_Isr.c</a></p>
<p><a href="forum.php?mod=attachment&aid=102025" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:main.c</a></p>