琪琪鸭 发表于 2024-10-22 20:21:24

关于 32G12K128 取余计算 不运行的问题

基于官方资料 STC_USB_LIBRARY_DEMO\STC_CDC_INTERRUPT_LIBRARY\stc32g_cdc_interrupt_demo进行usb功能测试。
一下是自己写了一个 usb接收到长度进行长度数值打印。num预计取值范围1-25.
完整代码放在二楼,望大神解答一下为啥我的取余会直接卡死。
错误情况查看代码后的注释。

void aixx(u8 num)
{

if(num >= 10)
{
      
outnum12 = (num/100)+0x30;
      outnum12 = num;
      USB_SendData(outnum12,2);

      //以上是可以执行的
      
      //一下是错误的
      
//P2=(num-( (num/100)*100)) /10;   // 错误不会继续执行   我试了一下 去掉/10可以运行
//      P2=num%100;    //错误不会继续执行了
      
      //以下修改可运行
//         num = 15;
      //      P2=num%100;    //这样可以继续执行了
      
      
      //         num = 15;
//P2=(num-( (num/100)*100)) /10;   //这样可以继续执行了
      

      outnum12 =0x31;
//outnum12 =(num%10)+0x30;

}
else
{
outnum12 =0x30;
      outnum12 = 0x30;
outnum12 = num + 0x30;

}

}

琪琪鸭 发表于 2024-10-22 20:21:44

本帖最后由 琪琪鸭 于 2024-10-22 20:23 编辑

#include "stc32g.h"
#include "stc32_stc8_usb.h"

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";
      u8 outnum12;
void main()
{
    P_SW2 |= 0x80;
   
    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;

    usb_init();                                     //USB CDC 接口配置
   
    IE2 |= 0x80;                                    //使能USB中断
    EA = 1;
   
    while (DeviceState != DEVSTATE_CONFIGURED);   //等待USB完成配置

    while (1);
}


void aixx(u8 num)
{

if(num >= 10)
{
      
outnum12 = (num/100)+0x30;
      outnum12 = num;
      USB_SendData(outnum12,2);

      //以上是可以执行的
      
      //一下是错误的
      
//P2=(num-( (num/100)*100)) /10;   // 错误不会继续执行   我试了一下 去掉/10可以运行
//      P2=num%100;    //错误不会继续执行了
      
      //以下修改可运行
//         num = 15;
      //      P2=num%100;    //这样可以继续执行了
      
      
      //         num = 15;
//P2=(num-( (num/100)*100)) /10;   //这样可以继续执行了
      

      outnum12 =0x31;
//outnum12 =(num%10)+0x30;

}
else
{
outnum12 =0x30;
      outnum12 = 0x30;
outnum12 = num + 0x30;

}

}

/************************************************
函数功能:USB-CDC串口接收数据的回调函数
函数描述:回调函数由USB中断在接收到串口数据时自动调用
          回调函数处理完成串口数据后需要返回1
函数返回:返回1:USB中断服务程序自动完成后续的收尾工作
          返回0:USB会暂停接收串口数据,直到用户自行调用
               usb_OUT_done()函数后USB才会重新恢复接收数据
注意事项:当函数返回1时用户无需调用usb_OUT_done()
          只有返回0时才需要调用usb_OUT_done()进行手动收尾
          强烈建议usb_OUT_callback返回1
************************************************/
BOOL usb_OUT_callback()
{
aixx(OutNumber);
         USB_SendData(outnum12,3);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
      
    USB_SendData(UsbOutBuffer,OutNumber);         //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
      
   
    return 1;
}


但是    outnum12 = (num %10)   + 0x30;可以正确执行。此时num值=12

发送→               123456781112
接收←012            123456781112

琪琪鸭 发表于 2024-10-22 20:22:42

芯片型号   屠龙刀三。2测试板


正在检测目标单片机 ...
单片机型号: STC32G12K128

当前芯片的硬件选项为:
. 系统ISP工作频率: 24.000MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 32.575KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 5 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚仍为复位脚
. 检测到低压时不复位,可产生低压中断
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,不擦除用户EEPROM区
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1188 mV (参考范围: 1100~1300mV)

单片机型号: STC32G12K128

正在擦除目标区域 ... 完成 !               
正在下载用户代码 ... 完成 !               
正在设置硬件选项 ... 完成 !               

更新后的硬件选项为:
. 系统ISP工作频率: 24.000MHz
. 内部IRC振荡器的频率: 24.000MHz
. 掉电唤醒定时器的频率: 32.575KHz
. 振荡器放大增益使能
. 用户EEPROM大小被设置为 5 K
. P3.2和P3.3与下次下载无关
. 上电复位时增加额外的复位延时
. 复位引脚仍为复位脚
. 检测到低压时不复位,可产生低压中断
. 低压检测门槛电压 : 2.00 V
. 上电复位时,硬件不启动内部看门狗
. 上电自动启动内部看门狗时的预分频数为 : 256
. 空闲状态时看门狗定时器停止计数
. 下次下载用户程序时,不擦除用户EEPROM区
. 下次下载用户程序时,没有相关的端口控制485
. 下次下载时不需要校验下载口令
. 内部参考电压: 1188 mV (参考范围: 1100~1300mV)
芯片出厂序列号 : F7E3C92200A702

单片机型号: STC32G12K128

邮箱 发表于 2024-10-23 00:40:30


你试下

琪琪鸭 发表于 2024-10-24 21:16:50

邮箱 发表于 2024-10-23 00:40
你试下

谢谢大神你的程序怎么改都是好用的。。。但是没找到啥不一样的地方,我把我的mian.c复制进去都是好用的。希望大神指点一二,难道是我的keill缺东西吗?谢谢

琪琪鸭 发表于 2024-10-24 21:18:18

邮箱 发表于 2024-10-23 00:40
你试下

刚开始是开心的找问题 ,直到20分钟没看出来问题, 现在已经哭一个小时了{:5_270:}

邮箱 发表于 2024-10-25 00:29:35

琪琪鸭 发表于 2024-10-24 21:18
刚开始是开心的找问题 ,直到20分钟没看出来问题, 现在已经哭一个小时了 ...

不使用 REMOVEUNUSED

琪琪鸭 发表于 2024-10-25 19:39:57

邮箱 发表于 2024-10-25 00:29
不使用 REMOVEUNUSED

看到了看到了谢谢大神。   我说怎么你工程多了41个警告。   但是还是不明白为啥这个设置导致的取余错误。。。

邮箱 发表于 2024-10-25 20:31:21

本帖最后由 邮箱 于 2024-10-25 20:33 编辑

琪琪鸭 发表于 2024-10-25 19:39
看到了看到了谢谢大神。   我说怎么你工程多了41个警告。   但是还是不明白为啥这个设置导致的取余错误 ...
https://www.stcaimcu.com/forum.p ... REMOVEUNUSED&page=1

别人都只能这样解决

琪琪鸭 发表于 2024-10-25 22:49:21

邮箱 发表于 2024-10-25 20:31
https://www.stcaimcu.com/forum.p ... REMOVEUNUSED&page=1

别人都只能这样解决

谢谢大神这个问题还真不是个例{:5_281:}研究了半晚上还是去掉优化来的简单
页: [1] 2
查看完整版本: 关于 32G12K128 取余计算 不运行的问题