找回密码
 立即注册
查看: 50|回复: 9

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 12:16:00
已绑定手机

2

主题

10

回帖

66

积分

注册会员

积分
66
发表于 2025-4-17 14:06:18 | 显示全部楼层 |阅读模式

#include "COMM/STC32G.h" //使用usb_hid之必须
#include "COMM/stc32_stc8_usb.h" //使用usb_hid之必须

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAIN_Fosc 24000000UL //定义主时钟频率
局部截取_20250417_140425.png

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#"; //设置"自定义下载"命令

//函数声明区
void sys_init();
void delay_ms(u16 ms);

void main()
{
//变量定义必须在函数的开头处,定义在中间会有问题
int i=0;

sys_init();     //usb功能 + IO口初始化
usb_init();     //usb库的初始化
EA=1;           //打开所有中断

while (1)
{
    //USB串口调试段功能代码
    if(DeviceState != DEVSTATE_CONFIGURED)
        continue;
    if (bUsbOutReady)
    {
        usb_OUT_done(); //接收应答(固定格式)
        printf("hello-OK");
    }
  
    //业务逻辑部分
    P40=0;                              //开通电源
  
    for (i = 0; i < 8; i++)
    {
        P6 = 0xFF & ~(1 << i);          //点亮LED
        delay_ms(200);
        P6 = 0xFF;                      //熄灭LED
        delay_ms(500);              
    }
}

}

void sys_init()
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度

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 &= -0x03;
P3M1 != 0x03;

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

//使用CDC时要用下面两行,使用HID要禁用下面两行
USBCLK = 0x00;
USBCON = 0x90; 

}

void delay_ms(u16 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 12:16:00
已绑定手机

2

主题

10

回帖

66

积分

注册会员

积分
66
发表于 2025-4-17 14:08:19 | 显示全部楼层
main()函数中第13行的 printf("hello-OK"); 语句似乎根本就没有执行,没搞懂。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 12:16:00
已绑定手机

2

主题

10

回帖

66

积分

注册会员

积分
66
发表于 2025-4-17 14:08:59 | 显示全部楼层
哪位大神指点一下。
回复 支持 反对

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 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的具体定义,并确保它们正确初始化和更新。

示例代码

以下是一个修正后的示例代码,供您参考:
  1. c
  2. include "COMM/STC32G.h"                //使用usbhid之必须
  3. include "COMM/stc32stc8usb.h"        //使用usbhid之必须
  4. include
  5. include
  6. include
  7. define MAINFosc  24000000UL           //定义主时钟频率
  8. char USERDEVICEDESC = NULL;
  9. char USERPRODUCTDESC = NULL;
  10. char USERSTCISPCMD = "@STCISP#";      //设置"自定义下载"命令
  11. //函数声明区
  12. void sysinit();
  13. void usbinit();
  14. void delayms(u16 ms);
  15. void usbOUTdone();
  16. void main()
  17. {
  18.     //变量定义必须在函数的开头处,定义在中间会有问题
  19.     int i = 0;
  20.     sysinit();     //usb功能 + IO口初始化
  21.     usbinit();     //usb库的初始化
  22.     EA = 1;         //打开所有中断
  23.     while (1)
  24.     {
  25.         //USB串口调试段功能代码
  26.         if (DeviceState != DEVSTATECONFIGURED)
  27.             continue;
  28.         if (bUsbOutReady)
  29.         {
  30.             usbOUTdone(); //接收应答(固定格式)
  31.             printf("hello-OK\n");
  32.         }
  33.     }
  34. }
  35. void sysinit()
  36. {
  37.     // 初始化USB功能和IO口
  38.     // 具体实现略
  39. }
  40. void usbinit()
  41. {
  42.     // 初始化USB库
  43.     // 具体实现略
  44. }
  45. void delayms(u16 ms)
  46. {
  47.     // 延时函数实现
  48.     // 具体实现略
  49. }
  50. void usbOUTdone()
  51. {
  52.     // USB输出完成处理
  53.     // 具体实现略
  54. }
复制代码

总结

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

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-17 14:17:02 | 显示全部楼层
官网USB库文件里面有例子可参考,烧录例程到芯片运行正常后再进行修改或者移植。
下载地址:https://www.stcai.com/khs

点评

依照你的建议,去下载了最新USB库文件,使用了其中一个示例,能够正常实现串口通讯!  发表于 2025-4-17 14:47
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-17 14:17:39 | 显示全部楼层
这是参考哪的例程?
这两行写反了,另外检查usb头文件里是否启用了PRINT_USB宏,启用后printf才能替换为printf_usb生效

        usb_OUT_done(); //接收应答(固定格式)
        printf("hello-OK");
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-22 12:16:00
已绑定手机

2

主题

10

回帖

66

积分

注册会员

积分
66
发表于 2025-4-17 14:26:09 | 显示全部楼层
erci*** 发表于 2025-4-17 14:17
这是参考哪的例程?
这两行写反了,另外检查usb头文件里是否启用了PRINT_USB宏,启用后printf才能替换为prin ...

我是照抄冲哥的视频写的,至于有没有相关函数,我不确定。我只是加载了相应的库,两个语句的先后顺序也是严格参照冲哥视频写的,
按说这些函数都是有的,因为编译时并没有报错说找不到相关函数。


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

点评

可以下载上面USB库函数测试或者官网下载实验箱例程包测试。 这个宏在"stc32_stc8_usb.h"中,需要放开注释或者在include之前定义。 #define PRINTF_USB  详情 回复 发表于 2025-4-17 14:33
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-4-17 14:33:58 | 显示全部楼层
江北*** 发表于 2025-4-17 14:26
我是照抄冲哥的视频写的,至于有没有相关函数,我不确定。我只是加载了相应的库,两个语句的先后顺序也是 ...

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


这个宏在"stc32_stc8_usb.h"中,需要放开注释或者在include之前定义。
#define PRINTF_USB
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 22:10 , Processed in 0.127454 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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