你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

f407 在HAL_FLASHEx_Erase()前如果调用了 uart1打印数据就会卡死

[复制链接]
dogpi 提问时间:2024-3-1 18:09 / 已解决

使用stm32f407zgt6,使用uart1与pc通信。pc发送命令,f4接收到以后擦除flash。

问题:如果在接收命令前通过uart1向pc打印一些数据就会导致HAL_FLASHEx_Erase()函数卡死;取消uart1打印后可以正常擦除。

#define FLASH_FLAG_ALL_ERRORS (FLASH_FLAG_EOP| \
                              FLASH_FLAG_OPERR| \
                              FLASH_FLAG_WRPERR| \
                              FLASH_FLAG_PGAERR| \
                              FLASH_FLAG_PGPERR| \
                              FLASH_FLAG_PGSERR)


uint8_t flash_erase_cpu_flash_by_sector(uint32_t _sector)
{
  uint8_t re;
  uint32_t page_error=0;
  FLASH_EraseInitTypeDef pEraseInit;

  pEraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;           //页擦除
  pEraseInit.Sector = _sector;                              //擦除地址
  pEraseInit.NbSectors = 1;                                 //擦除页数



  /* 解锁 */
  HAL_FLASH_Unlock();
  __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS) ;
  FLASH_WaitForLastOperation(10) ;//等待一下,提升擦除成功率
  HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);      // 绿灯亮
  /* 扇区擦除 */  
  re = HAL_FLASHEx_Erase(&pEraseInit, &page_error);
  HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_SET);        // 绿灯灭
  /* 擦除完毕后,上锁 */
  HAL_FLASH_Lock();  

  return re;
}
收藏 评论3 发布时间:2024-3-1 18:09

举报

3个回答
dogpi 最优答案 回答时间:2024-3-2 17:28:12

问题解决了,减小打印函数中字符数组大小就可以了:

void printmsg(char *format,...)
{
#ifdef BL_DEBUG_MSG_EN
    char str[64];  // 设置为256会程序会失败
    memset(str,0,64);
    va_list args;
    va_start(args,format);
    vsprintf(str,format,args);
    HAL_UART_Transmit(&BL_UART,(uint8_t *)str,strlen(str),HAL_MAX_DELAY);
    va_end(args);
#endif
}
dogpi 回答时间:2024-3-3 16:41:43

dogpi 发表于 2024-3-2 17:28
问题解决了,减小打印函数中字符数组大小就可以了:</p>
<pre><code class="language-c">

[md]应该是栈溢出了,导致硬件错误
背影101 回答时间:2024-3-5 11:08:55
[md]
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版