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&amp;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&amp;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&amp;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&amp;aid=102025" title="attachment"><img src="/source/plugin/zhanmishu_markdown/template/editor/images/upload.svg" alt="upload" /> 附件:main.c</a></p>

zhp 发表于 2025-5-30 11:35:20

davidyan 发表于 2025-5-30 11:26
我测试了一下,aicube版本V1.00L, isp版本6.95R

现在开启print重定向后,会使用一个fPrintfBusy标识变量 ...
如果你需要测试这个功能请新建项目,项目名称或者路径不能和之前的项目都相同
不要在原来的代码基础上重新配置

新建项目,生成的代码如下:



但你如果在原来代码的基础上重新配置,
初始化代码会重新生成,但中断处理代码在
    //<<AICUBE_USER_UART1_ISR_CODE1_BEGIN>>
    //<<AICUBE_USER_UART1_ISR_CODE1_END>>
之间,中断处理代码不会重新生成

   //<<AICUBE_USER_***_BEGIN>>
   //<<AICUBE_USER_***_END>>
之间的代码是用户自行编写的,
首次创建项目,AiCube会给出最简单的示例代码
后续再重复配置,这中间的代码就不会变化了


mechray 发表于 2025-5-30 17:37:05

图形化时钟配置赞。不过平时一般好像也不用配置时钟。

神农鼎 发表于 2025-5-30 21:59:33

mechray 发表于 2025-5-30 17:37
图形化时钟配置赞。不过平时一般好像也不用配置时钟。



冬不拉 发表于 2025-5-31 10:02:33

支持 AI8051U-8位 了
页: 22 23 24 25 26 27 28 29 30 31 [32] 33 34 35 36 37 38 39 40 41
查看完整版本: 程序自动生成器,AiCube-ISP V6.96A, STC89/15/STC8H/STC32/8051U