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

【实战经验】STM32 擦除内部 FLASH 时间过长导致 IWDG 复位

[复制链接]
STMCU-管管 发布时间:2019-3-19 09:33
STM32 擦除内部 FLASH 时间过长导致IWDG 复位6 J6 Z* d: s! K) q7 I$ ~

) U' g. w9 z3 {& f3 ?1 前言
' m$ ~# J: c3 ?: X
. M' b, Y7 l' v% C1 w- s
客户反馈在使用 STM32F412 的时候,擦除 sector 8~11 发现时间过长,从而导致意外触发IWDG 复位。
4 r+ C% W5 r( w% d) m# o* x
8 c/ v( p* e. u% p2 问题分析 : m4 T7 J, U( A/ }+ o& y

! r/ \0 J! C3 d. E2.1 问题详情 & O- L( f6 |: W/ w
$ p2 F2 p8 ]4 T" w( ]1 e$ X
通过与客户邮件和电话沟通,了解到客户主要是想使用内部 FLASH 暂时保存 IAP 升级时的程序数据,在 IAP 升级的过程中,需要首先擦除内部 FLASH 中一块足够大的空间,然后再写入升级数据。客户的工程中有使用到 IWDG,喂狗间隔大约 1.5S,客户的通过 SysTick 的方式计算出擦除 Sector8大约需要 2ms,因此认为若一次擦除 sector8~11 大约需要 8ms,于是在代码中一次性擦除 sector8~11后最后再来喂狗,但是,这样会触发 IWDG 复位,这个与预期不一致,固此产生疑问。7 h- L9 D  C9 R$ y& ?

" i9 f3 o, a; T+ J; z8 D2.2 问题重现 / |0 j. {+ m% q( p, |4 I

. r$ @$ D. f3 u* ?* P使用 NUCLEO-F412ZG 板尝试重现客户问题,主要代码如下:8 D( _7 M+ m6 Y8 y" ?4 p2 N
1 q# _+ D4 i& S" {) l% n
int main(void)
" S0 N9 g6 @0 M6 h{
# U* [7 H1 l1 p5 f* Y) t /* USER CODE BEGIN 1 */
& h. E, t  f! D5 l5 buint32_t beginTick =0,endTick =0;
& A& Q& \2 I+ Y7 w6 l. m. ]0 }uint32_t curSysTick=0,endSysTick =0;
, l3 n* q- O% c! F /* USER CODE END 1 */6 E6 t; c9 V  X# ]& A  k
/* MCU Configuration----------------------------------------------------------*/1 \% N- @7 b3 c7 Y6 I2 w( L
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ D; W% k/ h7 J2 o2 G1 Y HAL_Init();
: Y1 u( V- _$ |0 @% e4 I4 |1 ? /* Configure the system clock */* w: F, C# \) M/ [  l# n' U
SystemClock_Config();) g- k- R6 e' h. ~. V
/* Initialize all configured peripherals */
  F# ?# U2 Y% G; H$ f  w, g MX_GPIO_Init();
3 d4 `/ b# ], L MX_IWDG_Init();$ K1 p4 J% E  P" k
/* USER CODE BEGIN 2 */& U- }0 @7 R, j! u1 }( _
if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) //如果是看门狗复位8 {  }' @, L0 s4 _, O
{+ n( `5 G  Z) Q$ z8 A# Y
/* Clear reset flags */( ]1 Y: g6 W8 c9 h) C) C  t8 R$ a
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,GPIO_PIN_SET);- [% T% w* r0 s1 t! \- A9 l0 L; l7 Z
__HAL_RCC_CLEAR_RESET_FLAGS();
# f0 _9 [6 d8 m$ qError_Handler();6 k5 w5 V, |5 @0 p1 v
}
+ b+ n: c- q( ?; e! G6 d) u- j7 lHAL_FLASH_Unlock();; ]$ |) i; C: C; d- H) I
/* Fill EraseInit structure*/
& ^4 i( x) E% E1 ^+ ^% K EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;4 k2 w3 w8 \" D5 z% V% u6 |
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
7 ^) g5 `* E7 ]% T EraseInitStruct.Sector = FLASH_SECTOR_8;3 a- G8 g: {4 L. ], Z8 a6 b5 z
EraseInitStruct.NbSectors = 1;8 y. @' A& V$ A4 e- u" K
// if(HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK)- m) E& b) o! Y
// {
$ P/ [4 o! D7 l9 _" w// Error_Handler();6 F# |# B, @- D! W
// }* y# u6 K+ i5 q4 p! p
beginTick =HAL_GetTick();) }* @9 R- n8 L  F4 H
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);- w8 s% c& L6 T% o2 T" E
curSysTick =SysTick->VAL;' N1 Y8 v" C/ V  c9 T0 Y0 E# o
if(HAL_FLASHEx_Erase_IT(&EraseInitStruct)!= HAL_OK) //擦除 sector8+ K4 m- Q3 f, ]9 X5 J5 H
{$ B; L, q) e, v" e. x# l
Error_Handler();4 h' h) H! r; n% @. r3 s3 G4 S
}
& g8 _* p! _" Q1 G8 PendSysTick =SysTick->VAL; // curSysTick, endSysTick 保存着 SysTick 寄存器的值
- V- Z+ L, w. \HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET); //PC8 波形表示擦除 FLASH 的时间间隔
, w% T+ h+ D3 w& i  k9 B% m8 [endTick =HAL_GetTick(); // beginTick, endTick 保存着全局变量 Tick 的值2 x( H. f! w  j& y
g_TickCount =endTick -beginTick; //变量 Tick 的时间差
  [* l" \  o. u% CHAL_IWDG_Refresh(&hiwdg);9 l+ x& X( }( S" a8 c! q1 T
/* USER CODE END 2 */
$ y2 l6 Y, {: C  M8 h /* Infinite loop */# O, @; ]+ W+ b. r" ?
/* USER CODE BEGIN WHILE */! i6 S, D/ e2 s, g% z9 W
while (1)% v0 K& M& E# N: {' y, I! D1 q
{
0 b5 z2 ^: r6 I /* USER CODE END WHILE */
. z+ Z! J; K2 c /* USER CODE BEGIN 3 */
3 R4 o; w7 W- e- L/ B3 Rif (HAL_IWDG_Refresh(&hiwdg) != HAL_OK)
' v8 c  t7 T/ q7 P+ P! B3 C, B {9 m, `8 e- ?7 \2 E, M
/* Refresh Error */3 _% d3 F. r! l
Error_Handler();
/ s3 }2 v+ L% F: w. H9 h2 n7 O" { }
. l, _* q8 a% C" w6 [  m  YHAL_Delay(10);& t3 |5 r+ t0 |# j
}3 T. q. I. ?* s- C
/* USER CODE END 3 */

. o$ w. V# w! B) D8 |此外,同时在每个 SysTick 中断输出一个波形,用来检测 SysTick 是否正常
: Q- d  ~% l$ m' }( \
! ^+ E: L0 w0 m6 m' H" G
void HAL_SYSTICK_Callback(void); q' Z0 n( v2 w8 d. g; M
{
2 Q, O: t; b# }0 rHAL_GPIO_TogglePin(GPIOA,GPIO_PIN_11);//用 PA11 来检测 SysTick 波形4 x1 X# W: m) D. W! b) T% w
}

9 u* C/ b6 g- j8 A2 Y  {, V& G最终得出的波形如下:: \% I4 \! D; f  }+ t" }& k

9 `9 X# D+ d9 K2 D$ ?
1.png
............
7 V! s/ U" P% G7 Y. f
想了解更多,请下载原文阅读
" R* p$ y$ \! ?3 [! f" b$ T6 [5 r

$ N3 x1 R0 B2 W& D( F: d
收藏 评论2 发布时间:2019-3-19 09:33

举报

2个回答
七哥 回答时间:2019-3-19 10:20:07
测试程序分析,步骤清晰。但是不明白,擦除时间怎么那么长。
Kevin_G 回答时间:2019-3-19 12:56:46
Flash的擦除时间是固定的么?查找哪个资料呢?

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版