STM32应用程序有时不运行,保留在DFU中 [英] STM32 app not running sometimes, remains in DFU

查看:11
本文介绍了STM32应用程序有时不运行,保留在DFU中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新:

STM32L4电路板在DFU更新后有时无法运行的问题,请跳至编辑2获取简短故事和示例代码。

我正在进行一个使用基于STM32L4的定制电路板的项目。 在通过USB发送字符串之前,我一直在格式化字符串时遇到问题。
在通过USB使用DFU更新MCU时出现此问题,在调试模式(使用STLink)下一切正常。
当向sprintf传递3个以上的参数时,MCU退出DFU模式,但应用程序永远不会启动(没有初始化步骤,没有运行,什么都没有)。

我已找到导致问题的行:

    sprintf(tx_buffer, "Hello World: %ld/%ld/%ld
", 1,2,3); // OK
    sprintf(tx_buffer, "Hello World: %ld/%ld/%ld, %ld
", 1,2,3, 4); // NOK
    sprintf(tx_buffer, "Hello World: %d/%d/%d
", 1,2,3); // NOK

tx_buffer是一个简单的char tx_buffer[255]

似乎添加太多参数和/或选择某些类型会导致问题。

问题是,对于NOK的情况,该应用程序甚至不会启动,也不会启动任何init,而在其他情况下,它工作得很好。
无论如何,在调试模式下,一切都运行得很好。

可与sprintffor STM32一起使用的参数或类型有限制吗?
有没有人经历过这个问题或有解决这个问题的想法。

注意:只有一个LED可以让我知道我是否处于初始化/运行状态。
当应用程序似乎无法启动时,错误处理程序或硬件故障处理程序会使LED按照我从未观察到的特定模式闪烁。

谢谢


编辑:经过一番挖掘后,我尝试去掉printf并发送一个纯缓冲区。
当向缓冲区添加一个字节使其正常工作或使其失败时,我仍然会遇到相同的问题。

我注意到更改编译器优化也会对行为产生影响。所有东西总是在Og中工作,但不总是在O中工作。添加-mno-unaligned-access也有影响。
也许这是内存对齐问题,堆栈大小也有问题吗?

第二次编辑: 这似乎是随机的,移除主循环末尾的一些LED闪烁会破坏代码,使其在那里工作。


编辑2: 我为这个黑板重新开始了一个新的空白项目。
即使使用最少的代码也会发生相同的事情:

#define LED_TOOGGLE() 

(HAL_GPIO_TogglePin(PWR_I2C_GPIO_Port,GPIO_PIN_4))
#define LED_BLINK(ntime) for(int i=0; i<ntime*2; i++) {LED_TOOGGLE(); HAL_Delay(100);}

uint8_t buff4[4] = {0, 1, '
','
'};
uint8_t buff5[5] = {0, 1, 2, '
','
'};
uint8_t buff6[6] = {0, 1, 2, 3, '
','
'};
uint8_t buff7[7] = {0, 1, 2, 3, 4, '
','
'};
uint8_t buff8[8] = {0, 1, 2, 3, 4, 5, '
','
'};

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_AES_Init();
  MX_I2C1_Init();
  MX_SPI1_Init();
  MX_I2C3_Init();
  MX_ADC1_Init();
  MX_CRC_Init();
  MX_USB_DEVICE_Init();

  HAL_Delay(100);

  while (1) {

    LED_BLINK(1);
    HAL_Delay(10);
    CDC_Transmit_FS(buff6, 6);
  }
}

当我将buff6(和相应的大小)更改为5时,应用程序不会启动,面板将返回到DFU模式。这与以前的行为相同。
如果有人能够复制并对如何挖掘这一点有见解,那将是一个很好的开始。谢谢

推荐答案

当使用DFU的系统没有正确编译代码时,特别是当DFU也是引导加载程序(在主程序之前启动)或有单独的微小引导加载程序(MBR)时,我看到了类似的随机故障:DFUmain app

我建议检查编译后的*.hex文件,并确保程序应从DFU加载程序的地址开始。

最简单、最快捷的方法是使用ST-Link Utility。只需将您的十六进制文件拖放到主窗口,您将立即获得您需要的东西。

对于STM32芯片,应将基本应用程序加载到闪存的开头,从0x08000000开始。

如果您使用的引导加载程序已经占用了该扇区,并且您的程序从不同的地址开始,链接器必须知道,因为您的程序必须使用在链接时计算的函数指针数组正确地初始化中断向量。

因此,如果您的DFU以ADDRESS0x08003000开始编写程序,那么您的链接器必须相应地汇编您的程序,并且您应该在ST-Link实用程序中看到该偏移量。

这篇关于STM32应用程序有时不运行,保留在DFU中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆