本帖最后由 蒙蒙plus 于 2023-4-22 12:58 编辑
例程放这里了
05_MultiButton.zip
(797.43 KB, 下载次数: 76)
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 = (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;
- // }
- // }
- }
复制代码
|