单片机问题总结:MPU6050的DMP模块初始化放在线程启动之前

单片机问题总结: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();/**< 将硬件初始化放在这里 */
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值