蒙蒙plus 发表于 2023-4-22 12:53:47

STC32G记录一个magic事件

本帖最后由 蒙蒙plus 于 2023-4-22 12:58 编辑

例程放这里了
MCU情况

. 内部参考电压: 1186 mV (参考范围: 1100~1300mV)
. 内部安排测试时间: 2022年8月6日

单片机型号: STC32G12K128-Beta
固件版本号: 7.4.5U



功能分配情况
Timer0 做全局的滴答时钟

UART1 用BRT_Timer1 做波特率发生器

3个LED 灯




#define LED_RED P50
#define LED_GREEN P51
#define LED_YELLOW P52



两个按键 P54,P32
主程序任务
/**
* @brief 主程序 程序入口
*
*/
void main()
{
      /** 局部变量定义*/

      /** 变量初始化*/
      /*!< 1.CPU 初始化 */
      WTST = 0;// 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
      EAXSFR();// 扩展SFR(XFR)访问使能
      CKCON = 0; // 提高访问XRAM速度
      /*!< 2.模块初始化 */
      Tick_init();
      Tick_start();
      LED_Init();
      UART_init();
      EA = 1;
      /*!< 3.任务初始化 */
      Task_Button_init();

      PrintString1("STC32G UART1 Test Programme!\r\n"); // UART1发送一个字符串

      while (1)
      {
                /** @brief 1.LED 流水灯功能
               * 这里查询时间
               */
                LED_Task();
                /**
               * @brief 串口收发任务
               *
               */
                Task_UART();

                Task_Button_tick();
      }
}

上面的 结构不动,出问题在LED_Task();任务里
这里一共放了4个任务 分别是
1.流水灯
2.RED 1s一闪烁
3.GREEN 2s一闪烁
3.YELLOW 4s 一闪烁
当前发现的 魔法现象是
1.只开任务1 流水灯正常
2.只开后面3个的任意一个,可能也正常
3.3个全开,很大概率不正常,换个时间再烧录这个hex,它又正常了

全程录音录像,可以随时查阅我的操作。
根据当前测试可以排除以下问题
1.我量产多块板子,问题一样
2.LED没烧,IO也没烧 因为流水灯就正常
3.多次测试,问题相似
4.我用了待串口心跳包的,心跳包有的正常10s一条数据,有事没有,但是有心跳包的时候 LED也不亮
5.也不是负载不起来,我流水灯全点亮或者灭,也都是能亮的
6.更换板子,同样的代码也能出现不同的异常

总之就是一个魔法事件,里面也未用指针操作,我无法对STC32G进行实时仿真,只好放在这里,希望有人能够解决这个疑惑
/**
* @brief LED 任务入口
*
*/
void LED_Task()
{
    /** @brief 1.LED 流水灯功能
   * 这里查询时间
   */
       uint32_t tick_curr = Tick_GetClock();
   {
         static uint32_t tick_last; // 滴答时钟
         if (tick_curr > tick_last + 1000)
         { // 1000ms 执行一次 避免了阻塞
             tick_last = tick_curr;
             LED_setLED_all(LED_Data);
             i = (i + 1) % numof(LED_Data);
         }
   }


//    {
//      static uint8_t flag;
//      static uint32_t tick_last; // 滴答时钟
//      if (tick_curr > tick_last + 1000)
//      { // 100ms 闪烁
//            tick_last = tick_curr;
//            LED_setLED(LED_RED_PIN, flag);
//            flag = !flag;
//      }
//    }
//    {
//      static uint8_t flag;
//      static uint32_t tick_last; // 滴答时钟
//      if (tick_curr > tick_last + 2000)
//      { // 100ms 闪烁
//            tick_last = tick_curr;
//            LED_setLED(LED_GREEN_PIN, flag);
//            flag = !flag;
//      }
//    }
//    {
//      static uint8_t flag;
//      static uint32_t tick_last; // 滴答时钟
//      if (tick_curr > tick_last + 4000)
//      { // 100ms 闪烁
//            tick_last = tick_curr;
//            LED_setLED(LED_YELLOW_PIN, flag);
//            flag = !flag;
//      }
//    }
}













乘风飞扬 发表于 2023-4-23 11:28:09

把memory mode改成xSmall模式试试:



此外需要注意C语言对大小写敏感:


页: [1]
查看完整版本: STC32G记录一个magic事件