江北一阳指 发表于 2025-4-17 14:06:18

32G实验箱串口通讯不正常

<p>#include &quot;COMM/STC32G.h&quot;                //使用usb_hid之必须<br />
#include &quot;COMM/stc32_stc8_usb.h&quot;      //使用usb_hid之必须</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
#include &lt;stdlib.h&gt;</p>
<p>#define MAIN_Fosc24000000UL         //定义主时钟频率<br />
<img src="data/attachment/forum/202504/17/140609loqssiotponxinsw.png" alt="局部截取_20250417_140425.png" title="局部截取_20250417_140425.png" /></p>
<p>char *USER_DEVICEDESC = NULL;<br />
char *USER_PRODUCTDESC = NULL;<br />
char *USER_STCISPCMD = &quot;@STCISP#&quot;;      //设置&quot;自定义下载&quot;命令</p>
<p>//函数声明区<br />
void sys_init();<br />
void delay_ms(u16 ms);</p>
<p>void main()<br />
{<br />
//变量定义必须在函数的开头处,定义在中间会有问题<br />
int i=0;</p>
<pre><code>sys_init();   //usb功能 + IO口初始化
usb_init();   //usb库的初始化
EA=1;         //打开所有中断

while (1)
{
    //USB串口调试段功能代码
    if(DeviceState != DEVSTATE_CONFIGURED)
      continue;
    if (bUsbOutReady)
    {
      usb_OUT_done(); //接收应答(固定格式)
      printf(&quot;hello-OK&quot;);
    }

    //业务逻辑部分
    P40=0;                              //开通电源

    for (i = 0; i &lt; 8; i++)
    {
      P6 = 0xFF &amp; ~(1 &lt;&lt; i);          //点亮LED
      delay_ms(200);
      P6 = 0xFF;                      //熄灭LED
      delay_ms(500);            
    }
}
</code></pre>
<p>}</p>
<p>void sys_init()<br />
{<br />
WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快<br />
EAXFR = 1; //扩展寄存器(XFR)访问使能<br />
CKCON = 0; //提高访问XRAM速度</p>
<pre><code>P0M1 = 0x00;P0M0 = 0x00;//设置为准双向口
P1M1 = 0x00;P1M0 = 0x00;//设置为准双向口
P2M1 = 0x00;P2M0 = 0x00;//设置为准双向口
P3M1 = 0x00;P3M0 = 0x00;//设置为准双向口
P4M1 = 0x00;P4M0 = 0x00;//设置为准双向口
P5M1 = 0x00;P5M0 = 0x00;//设置为准双向口
P6M1 = 0x00;P6M0 = 0x00;//设置为准双向口
P7M1 = 0x00;P7M0 = 0x00;//设置为准双向口

P3M0 = 0x00;
P3M1 = 0x00;

P3M0 &amp;= -0x03;
P3M1 != 0x03;

//设置USB使用的时钟源
IRC48MCR = 0X80;    //使能内部48M高速IRC
while (!(IRC48MCR &amp; 0X01));

//使用CDC时要用下面两行,使用HID要禁用下面两行
USBCLK = 0x00;
USBCON = 0x90;
</code></pre>
<p>}</p>
<p>void delay_ms(u16 ms)<br />
{<br />
u16 i;<br />
do{<br />
i = MAIN_Fosc / 6000;<br />
while(--i);<br />
}while(--ms);<br />
}</p>

江北一阳指 发表于 2025-4-17 14:08:19

main()函数中第13行的 printf("hello-OK"); 语句似乎根本就没有执行,没搞懂。

江北一阳指 发表于 2025-4-17 14:08:59

哪位大神指点一下。

国芯人工智能 发表于 2025-4-17 14:08:00

问题分析

从您提供的代码片段来看,您在使用STC32G实验箱进行串口通讯时遇到了问题。以下是对代码的初步分析以及可能的问题原因:

1. 头文件引用问题:
代码中引用了"COMM/STC32Gh"和"COMM/stc32stc8usbh",但未明确说明这些头文件的具体内容。如果这些头文件中缺少必要的函数声明或宏定义,可能会导致编译或运行时错误。
#include 、#include 和#include 的引用方式有误,正确的应该是#include 、#include 和#include 。

2. 主时钟频率定义:
#define MAINFosc 24000000UL定义了主时钟频率为24MHz,这需要与硬件实际使用的晶振频率一致。如果硬件使用的是其他频率,可能会导致串口通讯不正常。

3. USB初始化:
sysinit()和usbinit()函数用于初始化USB功能,但未提供这些函数的具体实现。如果初始化过程中存在问题,可能会导致USB通讯无法正常进行。

4. 中断处理:
EA=1;用于打开所有中断,但未提供中断服务函数的具体实现。如果中断处理不当,可能会导致程序运行异常。

5. USB串口调试段功能代码:
if(DeviceState != DEVSTATECONFIGURED)和if (bUsbOutReady)用于检查USB设备状态和输出缓冲区是否准备好,但未提供DeviceState和bUsbOutReady的具体定义。如果这些变量未正确初始化或更新,可能会导致串口通讯不正常。

解决方案

1. 检查头文件:
确保"COMM/STC32Gh"和"COMM/stc32stc8usbh"头文件中的函数声明和宏定义完整且正确。
修正#include 、#include 和#include 为#include 、#include 和#include 。

2. 确认主时钟频率:
确认硬件实际使用的晶振频率与MAINFosc定义一致。如果不一致,需要修改MAINFosc的定义。

3. 完善USB初始化:
提供sysinit()和usbinit()函数的具体实现,确保USB功能正确初始化。

4. 完善中断处理:
提供中断服务函数的具体实现,确保中断处理正确。

5. 检查USB设备状态和输出缓冲区:
提供DeviceState和bUsbOutReady的具体定义,并确保它们正确初始化和更新。

示例代码

以下是一个修正后的示例代码,供您参考:

c
include "COMM/STC32G.h"                //使用usbhid之必须
include "COMM/stc32stc8usb.h"      //使用usbhid之必须
include
include
include

define MAINFosc24000000UL         //定义主时钟频率

char USERDEVICEDESC = NULL;
char USERPRODUCTDESC = NULL;
char USERSTCISPCMD = "@STCISP#";      //设置"自定义下载"命令

//函数声明区
void sysinit();
void usbinit();
void delayms(u16 ms);
void usbOUTdone();

void main()
{
    //变量定义必须在函数的开头处,定义在中间会有问题
    int i = 0;
    sysinit();   //usb功能 + IO口初始化
    usbinit();   //usb库的初始化
    EA = 1;         //打开所有中断

    while (1)
    {
      //USB串口调试段功能代码
      if (DeviceState != DEVSTATECONFIGURED)
            continue;
      if (bUsbOutReady)
      {
            usbOUTdone(); //接收应答(固定格式)
            printf("hello-OK\n");
      }
    }
}

void sysinit()
{
    // 初始化USB功能和IO口
    // 具体实现略
}

void usbinit()
{
    // 初始化USB库
    // 具体实现略
}

void delayms(u16 ms)
{
    // 延时函数实现
    // 具体实现略
}

void usbOUTdone()
{
    // USB输出完成处理
    // 具体实现略
}

总结

通过以上分析和修正,您应该能够解决STC32G实验箱串口通讯不正常的问题。如果问题仍然存在,建议进一步检查硬件连接和调试工具设置,确保所有环节都正确无误。

[本文内容由国芯人工智能辅助生成,仅供参考]

乘风飞扬 发表于 2025-4-17 14:17:02

官网USB库文件里面有例子可参考,烧录例程到芯片运行正常后再进行修改或者移植。
下载地址:https://www.stcai.com/khs

ercircle 发表于 2025-4-17 14:17:39

这是参考哪的例程?
这两行写反了,另外检查usb头文件里是否启用了PRINT_USB宏,启用后printf才能替换为printf_usb生效

      usb_OUT_done(); //接收应答(固定格式)
      printf("hello-OK");

江北一阳指 发表于 2025-4-17 14:26:09

ercircle 发表于 2025-4-17 14:17
这是参考哪的例程?
这两行写反了,另外检查usb头文件里是否启用了PRINT_USB宏,启用后printf才能替换为prin ...
我是照抄冲哥的视频写的,至于有没有相关函数,我不确定。我只是加载了相应的库,两个语句的先后顺序也是严格参照冲哥视频写的,
按说这些函数都是有的,因为编译时并没有报错说找不到相关函数。


刚才试了一下,把两个语句先后顺序交换,结果跟以前一样,没有必变

ercircle 发表于 2025-4-17 14:33:58

江北一阳指 发表于 2025-4-17 14:26
我是照抄冲哥的视频写的,至于有没有相关函数,我不确定。我只是加载了相应的库,两个语句的先后顺序也是 ...

可以下载上面USB库函数测试或者官网下载实验箱例程包测试。


这个宏在"stc32_stc8_usb.h"中,需要放开注释或者在include之前定义。
#define PRINTF_USB
页: [1]
查看完整版本: 32G实验箱串口通讯不正常