单片机问题总结:MPU6050的DMP模块初始化放在RTOS线程启动之前
问题复现
在MPU6050初始化成功,在自检时,总是失败
问题总结
在RTOS,RTThread中,会在 S u b Sub Sub m a i n ( ) 中 进 行 操 作 系 统 初 始 化 , ∗ ∗ main()中进行操作系统初始化,** main()中进行操作系统初始化,∗∗Sub$$main()在用户main()之前进行**,而我们在初始代码中,放在main函数进行硬件初始化。即操作系统调度已经开始rt_system_scheduler_start()(此时未进行线程任务的初始化,系统心跳已经开始,有默认创建的空闲线程)
int main(void)
{
HardWareInit();
OsTaskInit();
return 0;
}
int $Sub$$main(void)
{
rtthread_startup();
return 0;
}
int rtthread_startup(void)
{
rt_hw_interrupt_disable();
/* board level initialization
* NOTE: please initialize heap inside board initialization.
*/
rt_hw_board_init();
/* show RT-Thread version */
rt_show_version();
/* timer system initialization */
rt_system_timer_init();
/* scheduler system initialization */
rt_system_scheduler_init();
#ifdef RT_USING_SIGNALS
/* signal system initialization */
rt_system_signal_init();
#endif
/* create init_thread */
rt_application_init();
/* timer thread initialization */
rt_system_timer_thread_init();
/* idle thread initialization */
rt_thread_idle_init();
/* start scheduler */
rt_system_scheduler_start();
/* never reach here */
return 0;
}
问题解决
run_self_test()这一步过不去,即使我的I2C可以正常通讯(因为MPU6050的初始化是正常的,我可以读出温度值),在这里依然会出现读写错误。上网查资料,网上很多人提到中断问题,自检过程中,有中断的程序在这里很容易被打断I2C读写,导致读写的结果不一致。我一开始以为是什么定时器中断,但是我没用到定时器,所以一直困惑于找不到原因。后来发现是操作系统由于线程的切换造成,所以要在线程调度开启之前,进行硬件初始化。
void rt_hw_board_init()
{
SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND ); /* 初始化SysTick */
HardWareInit();/**< 将硬件初始化放在这里 */
}