目录
硬件
现象
处理思路
处理过程记录
us延时准备用systick实现
实现
结论
硬件
官方评估板
现象
sdk例程 独立运行都正常。但是自己写的代码,调试运行正常,独立(去掉调试器)运行却不行。
处理思路
使用的代码一点点注释掉,把问题缩小。
处理过程记录
cs1237_init(0,g_cs1237_device_st, DEV_FREQUENCY_1280, DEV_PGA_1, DEV_CH_A);
注释掉上面一段之后系统独立运行正常,通过log/LED转台可以观察到。
问题进一步定位到是卡到delay us这个函数;
__STATIC_INLINE void delay_us (volatile uint32_t microseconds)
{uint32_t clk_cycle_start = DWT->CYCCNT;/* Go to number of cycles for system */microseconds *= (system_core_clock / 1000000);/* Delay till end */while ((DWT->CYCCNT - clk_cycle_start) < microseconds);
}
delay延时是使用的DWT外设,这个是我第一次使用,怀疑这个外设难道只能在线调试使用?
us延时准备用systick实现
vTaskStartScheduler();
xPortStartScheduler();
systick的配置与使能是在这里完成的
/* Shift the priority group value back to its position within the AIRCR* register. */ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;
找了大半天。
也就是说要在freertos 启动之后才能使用systick 相关的延时。
实现
创建一个任务,初始化完成之后删除自己。
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */// 这个任务进行初始化, 在完成后删除自身kalman_init(&g_kfp_st);// 设置cs1237参数cs1237_init(0,g_cs1237_device_st, DEV_FREQUENCY_1280, DEV_PGA_1, DEV_CH_A);vTaskDelete(NULL);/* USER CODE END StartDefaultTask */
}
在写systick delay的时候突然发现 上面使用的 DWT 是通过 delay_init 实现的,但是却没有初始化。
DWT 初始化之后 相关的延时函数正常,系统独立启动正常。
结论
系统不能独立启动的原因是 DWT 实现的延时函数卡死导致;
延时函数卡死是因为 DWT 没有初始化导致;(但是这个延时函数在线调试正常使用)。
初始化DWT 之后,系统正常。
systick 暂时还是只做系统时基使用。