MCU 调试运行正常,去掉调试器不运行,解决方法

目录

硬件

现象

处理思路

处理过程记录

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 暂时还是只做系统时基使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值