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;
// }
// }
}
把memory mode改成xSmall模式试试:
此外需要注意C语言对大小写敏感:
页:
[1]