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

STM32F7-discovery QSPI接口使用心得  

[复制链接]
feiting94 发布时间:2015-9-8 22:09
STM32电机培训online,大佬带你玩电机# l: Q8 i( m7 h+ A

# G' F& V) e' Q- Q, [1 `, f' SFMC和QSPI引脚冲突的解决# }& f$ Y! I: a2 C% R) D
' |  U7 x. I+ N; y2 D* }; |# L
分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式4 v5 r- H+ a1 |' }5 W3 W' D9 _
1 L+ c' t3 h7 T  o) U
9 o' v$ r) L" f" l$ _2 Z* |
1.QuadSPI接口的特点。与普通的SPI Flash接口相比,quadSPI可以接四位数据线,传输速率大大提高( _% S* m3 O: P: C, \
STM32F7的quad-spi接口有三种模式
0 a" V5 Z6 Z- x& j) T  N6 k(1)indirect mode(间接模式):所有操作都是用的QUADSPI寄存器,通常在对FLASH寄存器配置时用这种模式3 L- w& |2 `) h7 `' N
(2)status polling mode(状态轮询模式):外部Flash的状态寄存器查询使用的是这种模式,如果开启中断,可以产生中断信号
9 U+ \! x8 H$ x6 W  G- s; t(3)memory-mapped mode(内存映射模式):外部flash映射到MCU的地址空间,可以视为内部闪存,读写数据用的这种模式0 q) N2 S; j7 N3 e1 f
$ ~0 k; N4 e4 a! w4 M: d
STM32F7的quad-spi接口主要特点:1 |& t/ N# z1 Q- H
(1)三种工作模式+ x/ ]7 K) m- R
(2)Dual-Flash模式,可以同时接两片Flash,共用CLK和CS片选线。这样可以最多同时传输8位数据(4+4); k  o$ g3 A9 |) v/ C
(3)支持SDR和DDR
" g- v5 e$ y' d+ i' j+ |(4)间接模式的DMA通道
; B3 u& M6 K  S/ [( b: T7 P9 C(5)内嵌接收和发送FIFO# P; Q( i% F$ _
(6)支持FIFO threshold, timeout, operation complete, access error四种中断6 h9 r) E* t4 u
+ K! J5 j  I8 X+ U& d; K( k
Quad-spi完整的命令格式由5部分组成,分别是Instruction,Address,Alternate-bytes,dummy-cycles和Data这5个阶段,时序图如图所示' Q# F5 u" r8 F" F# V9 N- \
3.png ' B+ K+ h+ l. p0 h2 ]
总结一下特点:5 s  P: h4 K0 N8 J9 A1 h4 }
(1)每个阶段都可以选择是 1bit(SO/SI线 single SPI mode),2bit(IO0/IO1线 dual SPI mode),和4bit(IO0/IO1/IO2/IO3线 quad SPI mode)传输,  g$ M; O! P2 W" F+ a
(2)写数据时,dummy cycle可以为0;读数据时,为了保证足够的转换时间,因为之前是写数据,现在要变成读,至少要1个dummy cycle" M* j; b$ b7 e
(3)这5个阶段都不是必须的,可以没有! }6 K5 _$ y0 N9 ?9 R: @  A' F/ y
(4)indirect mode模式,数据读取时通过QUADSPI_DR寄存器;memory-mapped mode模式,数据直接返回和输出通过AHB总线或者DMA
( w# A2 \. Y% H4 ^! U3 z3 z(5)SDR和DDR模式的区别:两者的instruction阶段都是CLK信号的下降沿数据传输;在DDR模式中,Address,Alternate-bytes和Data这3个阶段都是上升沿和下降沿都有数据传输
3 r6 V  [; S0 O0 l, f: I1 p$ R# i5 G(6)F7有32-byte FIFO,可以设置threshold(阈值),接收数据数目超过该值时,FTF(FIFO threshold flag)=1
5 X  f3 {3 E: b$ V
7 j% W2 @0 m4 p8 c) C, J$ ?; }' b  L  A5 g( ~3 l0 S3 f

9 k4 e4 w. r, l/ ?: K3.STM32F7-Discovery的quad-spi flash使用的是micron公司的N25Q128A系列,有128Mbit容量,后面附上数据手册,原理图如图所示) W- ?- H& x- B) V4 P
0 ^' r# I4 M; k5 X9 w+ Y
1.png
) i2 |4 o' D) a, ?( L( t: q这里主要说明quad-spi flash代码流程分析
; O3 r  ^% I3 m- W论坛可以下载STM32Cube_FW_F7_V1.1.0压缩包,我也是从里面的例程中学习的。& J$ v* {$ x7 k7 |2 }. R
选择STM32Cube_FW_F7_V1.1.0/project/STM32746G-Discovery/example/QSPI/QSPI_ExecuteInPlace例程
- C! j; l/ i! ]1 t(1)Flash配置寄存器初始化
" f( t/ l" @, g! t
  1.   /* Initialize QuadSPI ------------------------------------------------------ */
    ' v! }; X2 I2 T  I9 K2 w; Q: D" ]
  2.   QSPIHandle.Instance = QUADSPI;          3 q% G' G9 G% o
  3.   HAL_QSPI_DeInit(&QSPIHandle);5 e( x  W4 Q6 B
  4.         . q* M+ W# L: K9 I+ L
  5.   /* ClockPrescaler set to 2, so QSPI clock = 216MHz / (2+1) = 72MHz */" R3 W; C3 Q  |- U% q! k
  6.   QSPIHandle.Init.ClockPrescaler     = 2;                                                                // <span style="background-color: rgb(255, 255, 255);">查阅手册可知,最大频率108MHz,这里为什么不用1呢??</span>* p" ?. i8 x" D( U) [) a' W7 J5 Z) e- v
  7.   QSPIHandle.Init.FifoThreshold      = 4;                                                                 // FIFO的阈值为4bytes,9 z% g$ V' w1 @+ d" _
  8.   QSPIHandle.Init.SampleShifting     = QSPI_SAMPLE_SHIFTING_HALFCYCLE; ! {/ ?# X" |& ^+ t5 a* I2 ^0 y
  9.   QSPIHandle.Init.FlashSize          = POSITION_VAL(0x1000000) - 1;                         //0x1000000=16MB, * {( v* N2 u5 y: O, L4 g
  10.   QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;        //nCS stay high for at least 2 clock cycles between commands
    ' A9 h+ I& u  @8 F6 q( }4 x9 t) p! ]
  11.   QSPIHandle.Init.ClockMode          = QSPI_CLOCK_MODE_0;                                    //Clk stays low while nCS is released
    5 \8 R; X& ^1 P
  12.   QSPIHandle.Init.FlashID            = QSPI_FLASH_ID_1;                                               //选择第1片flash
    " D1 ?: t( r! E: w4 V2 \
  13.   QSPIHandle.Init.DualFlash          = QSPI_DUALFLASH_DISABLE;
    , k" e" O7 _+ R4 b, y. s
  14.   
    , m% D3 w0 ~7 m# }) J4 ~' d) S
  15.   if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)" v( T* \9 r" O
  16.   {
    / \( ?% M0 `- F7 ^, `* D/ [0 u
  17.     Error_Handler();
    9 e8 p( X+ K2 V. P
  18.   }
复制代码
(2)使能写操作0 b, F5 ?4 ?+ ]- ~( \' Y
  1.   /* Enable write operations ------------------------------------------ */' r, I# T) h# F
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;            9 K( ^) P: {! q8 L  D+ n# }  B
  3.   sCommand.Instruction       = WRITE_ENABLE_CMD;
    ) E- C: o: k1 x5 R) h. \
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;8 s/ D4 ?( G% R# k
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
    " W2 [/ j) v( c1 S) m2 Q1 [6 |5 |2 j
  6.   sCommand.DataMode          = QSPI_DATA_NONE;
    , f$ q" ^( c) j2 ~7 B$ w
  7.   sCommand.DummyCycles       = 0;
    0 b- `" A9 c+ ^6 h" G
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;1 x6 O1 F6 Z+ ^. W+ D' X
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    . L4 }& d+ S( c# E; @3 z0 s/ N9 L" M7 g
  10.   sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
    ! n- p# X2 `' z/ D1 w

  11. " F/ w& Q& x1 O( y' F. T
  12.   if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)! \/ W2 ?7 \/ N( \- _: B; `6 u6 |* M
  13.   {1 ?/ \( [& K# ~1 W( |! {- H
  14.     Error_Handler();
    ; F2 F  u* s: y9 l8 ^3 [+ B# N
  15.   }
      Q9 a  x  r7 r( H
  16.   / n0 s# m6 _% n3 c
  17.   /* Configure automatic polling mode to wait for write enabling ---- */
    ; }1 u! o9 o1 o. o. ]+ B
  18.   sConfig.Match           = 0x02;% W+ s, I0 v0 \8 D4 Z! x
  19.   sConfig.Mask            = 0x02;
    " l5 w6 T8 Z9 f3 G3 T
  20.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    ( ~: I% \& k1 m
  21.   sConfig.StatusBytesSize = 1;0 X8 y7 ^! U$ I1 Z/ ]# w. F
  22.   sConfig.Interval        = 0x10;
    3 E5 b0 K  K2 [: Q) o7 i3 {
  23.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;  f/ R  ~+ @* a" D& S
  24. ' H* G# i; G4 S/ l* h
  25.   sCommand.Instruction    = READ_STATUS_REG_CMD;1 I: ?* i/ V7 ]" a  w4 m
  26.   sCommand.DataMode       = QSPI_DATA_1_LINE;
    8 W! u1 A$ v) ~; H, G# g! l3 c

  27. / V7 ~/ z* }4 ^' v  W# M
  28.   if (HAL_QSPI_AutoPolling(&QSPIHandle, &sCommand, &sConfig, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)/ Q3 i: p4 I2 X" E3 R
  29.   {
    8 J4 b3 B7 m- D2 v0 o8 n
  30.     Error_Handler();+ W0 O* _5 G2 z8 A2 m/ @
  31.   }
复制代码
首先使用indrect mode,使用1bit instruction传输,命令是 WRITE_ENABLE_CMD,无其他4个阶段
( V4 _' j/ P  f+ i源码中定义   #define WRITE_ENABLE_CMD                     0x06;
2 j7 g- L6 E  J! G" S这里要查阅芯片手册( s) U3 q$ D+ d( a- h7 z
5.png
' d  n( G7 H# W确实是一致的。
3 K$ v0 p/ D, R* s接着使用automatic polling mode,命令是READ_STATUS_REG_CMD,读status register5 ^( X/ ^! B' D' S
automatic polling mode有如下功能,它将查询的得到的值和设置的Match值比较,只比较Mask中bit=1的位,设置可以为AND或者OR模式,
$ A* l  a2 a& k& W1 Q9 }( m0 @查阅手册:
% w# ~5 y$ q% f% }7 L* }' r8 F
- s' M; G. [5 y& @6 \' q2 s! _ 6.png
" R( s( j, B+ t! q1 }6 [确实是bit1,即mask=0x02,当该位为1时,说明写使能,故match=0x02;' J+ V8 @" E! G! I4 q
(3)擦除flash的第一个sector
3 }2 L$ X$ [! U: Z
  1.         /* Erasing Sequence -------------------------------------------------- */6 f& L7 q6 Z) F. x
  2.         sCommand.Instruction = SECTOR_ERASE_CMD;   //块擦除,64KB one sector: N; K* u5 R6 }
  3.         sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
    - m  o7 }: \8 A1 \! M$ c0 d5 _
  4.         sCommand.Address     = qspi_addr;                          //qspi_addr=00 b7 |, z. }& T, D
  5.         sCommand.DataMode    = QSPI_DATA_NONE;0 |& T9 C( G: G
  6.         sCommand.DummyCycles = 0;) f6 n  V! X* ^# p
  7. * T! I: d1 L) D+ L% q# `8 a2 S. f
  8.         if (HAL_QSPI_Command_IT(&QSPIHandle, &sCommand) != HAL_OK)
    3 V# B: x$ ?5 j' |5 r
  9.         {; o9 S$ i$ Y9 D" Q1 h6 C
  10.           Error_Handler();
      T8 g% X( @. X
  11.         }
复制代码
(4)等待擦除完毕,使用automatic polling mode查询,这里还是读status register,但读的是bit0位,而且预期值bit0=0;查阅手册2 O' x  M* t" q% J+ A
7.png
: U  i+ D7 d; N0 `  D/ i5 ]
  1.   /* Configure automatic polling mode to wait for memory ready ------ */  
    . ^, p) s" w5 Z. }# Z7 h
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;2 t6 U# y" C/ S& T6 P
  3.   sCommand.Instruction       = READ_STATUS_REG_CMD;
    3 x( g( w- [- {9 {  W( t) M) _
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;& H+ c- c- h- o8 b
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;6 `) E5 i  l) L
  6.   sCommand.DataMode          = QSPI_DATA_1_LINE;
    6 L5 M2 L2 N/ T. W! Z( |
  7.   sCommand.DummyCycles       = 0;
    $ U+ k& h% l4 n4 r8 w. u% m
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
    ) K& D+ F3 a. Y" u1 d
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    ' |! {" h) Z; h7 J- u; h, w
  10.   sCommand.SIOOMode         = QSPI_SIOO_INST_EVERY_CMD;( v, g3 `4 i+ L# W- z

  11. ( T+ b6 i; c  M/ m4 O* S
  12.         //bit0:write in progress 0:ready 1:busy
    ! T4 F" ]- n8 ~8 T/ u1 r8 P1 ]
  13.   sConfig.Match           = 0x00;, y7 u; |& q' ^! O: {
  14.   sConfig.Mask            = 0x01;) q' r3 R) t* u9 P4 L$ f* P
  15.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    / v" \7 d- P6 x3 Y4 k
  16.   sConfig.StatusBytesSize = 1;
    ) i2 u* J6 T1 u; A" h3 W
  17.   sConfig.Interval        = 0x10;3 `$ o( f1 R1 L, A0 |- E5 g8 Z
  18.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;- Z0 J$ K) i- F1 S7 O6 F
  19. $ o* ?- X& |1 `' f( M. L
  20.   if (HAL_QSPI_AutoPolling_IT(&QSPIHandle, &sCommand, &sConfig) != HAL_OK)7 O7 w! |6 {, u
  21.   {
    ; B) O& B# r2 o6 b2 f3 M! ?9 a
  22.     Error_Handler();( Q9 K  C* X' ^; ]
  23.   }
复制代码
(5)写使能并且写数据
6 _6 j8 {- u- {/ P
  1. /* Enable write operations ----------------------------------------- */" m: u) p. o; P8 ]) G- L
  2.           QSPI_WriteEnable(&QSPIHandle);
    . _3 X/ D& n5 t

  3. * H# F0 x2 S& a% ~  T3 J- Y% \
  4.                                         //QUAD INPUT FAST PROGRAM Data In:DQ[3:0];Address In:DQ0
    6 y$ C8 I* L' t7 b3 _  k+ V6 [( r
  5.           /* Writing Sequence ------------------------------------------------ */' T8 x& ?- }% M
  6.           sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;
    " U# j3 V1 u8 @/ D. S) U1 i4 {
  7.           sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
    % J2 Y! i- [8 F, _) G4 J! t
  8.           sCommand.Address     = qspi_addr;                                              //qspi_addr=06 M* x/ N- U: W2 S5 _0 k/ o
  9.           sCommand.DataMode    = QSPI_DATA_4_LINES;6 }  H6 g0 U) u& r' ^7 W9 w
  10.           sCommand.NbData      = size;                                                         //size = QSPI_PAGE_SIZE = 256
    % Y; R9 j6 O! n! b

  11. 7 D  c4 A; J& P5 H
  12.           if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    5 n5 Q: m2 _; z( E1 s! _% t+ n
  13.           {9 M9 M; s: L4 m; Z: h1 u+ j& l
  14.             Error_Handler();
    / ^% n9 L: C7 a7 ?& S, ?# J
  15.           }$ i" }2 u+ z3 y8 C- s
  16. 0 K2 p% {8 ^& r9 R% L
  17.           if (HAL_QSPI_Transmit_DMA(&QSPIHandle, flash_addr) != HAL_OK)         //flash_addr = (uint8_t *)(&Load$QSPI$Base);
    / m* Q4 J7 `* {; b9 m
  18.           {
    - m6 |" P" K6 \! ~* Q' v1 x: W
  19.             Error_Handler();6 H& \5 b' W6 Z+ v5 o2 ^; n
  20.           }
复制代码
看到这里就不得不提一下scatter file文件- I2 R: U7 m( N( F
8.png
, G& L1 |& \. ]打开这个文件,STM32746G-DISCOVERY.sct
- F, k2 k: e! E% Z- k
  1. ; *************************************************************( e0 Y. z( U+ L' C+ M8 y
  2. ; *** Scatter-Loading Description File generated by uVision ***( h- z  [1 }3 a
  3. ; *************************************************************# C8 M8 F& ^2 a4 O
  4. ) m* {# m1 C1 n3 B) Y
  5. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region/ k) R  o5 K; l8 |9 r7 y
  6.   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address6 {0 t# ^7 ]( F+ F4 l) W( T% Y
  7.    *.o (RESET, +First)0 {1 H' W- U' L  t
  8.    *(InRoot$Sections)1 \* ^' }7 l# t3 c" [+ E' v. F1 R  w
  9.    .ANY (+RO)
    & V: }* r6 ^6 A3 Z4 U
  10.   }
    : g4 o/ p/ E. d0 u( J4 r" R
  11.   RW_IRAM1 0x20000000 0x00050000  {  ; RW data
    ) m, u: V( Z, C$ {; m- J
  12.    .ANY (+RW +ZI)' O$ e2 ~$ B1 {- P1 m
  13.   }
    : T5 d6 G( @+ \( r/ m  }# y
  14.   QSPI 0x90000000 0x00100000  {. v, _! d) a% |" F8 k
  15.    *.o (.qspi)
    ; h: _! N3 C/ V9 t5 Z6 s% Q
  16.   }9 j0 q6 K9 ?! ]" K  }0 @# n+ B
  17. }
复制代码
可以看到和一般的scatter file(分散加载描述文件)相比,多了一个QSPI执行域,, h4 k3 Z% b7 B% W' f1 L! j
学过的都知道,这里表示链接时,将所有目标文件的.qspi段放在QSPI执行域,3 j; A3 t6 k4 X, M
再看一下F7的内存映射" M7 g/ B9 D/ J( _! d( P7 b% t" \
9.png
/ T" m0 _8 D7 x6 |& O在0x8000 0000到0x9FFF FFFF有一个Quad SPI,这就是memory-mapped mode的由来。. d" J7 z. Y  m: O( K1 s
因此上面flash_addr = (uint8_t *)(&Load$$QSPI$$Base) = 0x9000 0000; DMA传输就是将 0x9000 0000处开始的size = 256bytes的数据传递到flash,模式是indrect read mode
, |+ K6 K) l! G3 W4 A(6)判断传输是否完成,判断的方法同步骤4; N5 g1 f2 c7 F, T" {- v" z! S
(7)重复5、6步直到传输完max_size = (uint32_t)(&Load$$QSPI$$Length)=  0x00100000
! h4 c2 ^1 k( |1 D(8)设置dummy-cycle的值,配置为memory-mapped mode,命令是 QUAD_OUT_FAST_READ_CMD=0x6B,就是说映射完后,相对于内部flash
* V6 t( R& i! w! A+ T
  1. /* Configure Volatile Configuration register (with new dummy cycles) */
    , o1 ?  W  H. V$ h9 V7 H
  2.             QSPI_DummyCyclesCfg(&QSPIHandle);) h) B6 r) p' P5 f; t- p- q
  3.   N8 J- i- f1 p5 ?" Z0 X
  4.             /* Reading Sequence ------------------------------------------------ */
    : l1 N7 u8 H8 N& N2 f
  5.             sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;/ z8 y1 X) C' r
  6.             sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;6 p- n# m: D( x
  7. 8 \. G. A8 _- B5 o  E; N/ G
  8.             sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
    + v. ~- I% K. M$ |2 R

  9. 1 Y$ {% L! ?$ b$ v0 D5 e  ~2 t# }4 U
  10.             if (HAL_QSPI_MemoryMapped(&QSPIHandle, &sCommand, &sMemMappedCfg) != HAL_OK)3 X  R0 A: N% y( G
  11.             {9 U% u) r6 G1 W( @
  12.               Error_Handler();0 v$ V& d7 \8 c5 ]  [9 p
  13.             }
复制代码
(9)执行.qspi段的代码
* I$ t0 F& A7 m- ^7 Z1 {+ u1 ]
  1. /* Execute the code from QSPI memory ------------------------------- */
    ) }. e( z8 Y/ _/ {% {! F5 N
  2.           GpioToggle();
复制代码
注意% }* G% A6 c( b# o7 }) B$ K1 H
  1. #if defined(__CC_ARM)
    * a9 Y# c5 Y% S9 q1 R) W
  2. #pragma arm section code = ".qspi"  E1 t2 t$ M; b" L
  3. #pragma no_inline1 N) U- K/ g" R0 w$ X% A+ {+ a$ B6 S
  4. static void GpioToggle(void)/ G7 ^/ m0 w% Y; D' v: D' {, J; m- @
  5. #elif defined(__ICCARM__): K0 V+ x  k# s, E3 j- y/ q
  6. static void GpioToggle(void) @ ".qspi"
    ; b  o1 ?: m- I! i
  7. #elif defined(__GNUC__)
    1 B( T8 q1 e6 w& B0 s
  8. static void __attribute__((section(".qspi"), noinline)) GpioToggle(void)3 ?3 i! H1 b0 w8 U
  9. #endif
    ) D* B$ m. ]' D8 }

  10. / l3 S7 Q" r0 G. X
  11. {
    0 \' z/ t5 ^2 u' r
  12.   BSP_LED_Toggle(LED1);
    5 x2 }+ H; G+ D$ l% u( K
  13.   /* Insert delay 200 ms */; i" Y5 i8 e1 q1 ~9 E' ?* z9 |
  14.   HAL_Delay(200);1 P  M7 F7 R" F7 \$ x
  15. }
复制代码
# p1 n3 g* H  C: q0 e
我的问题:
3 b* @8 L4 U: L学完之后,我一直对一个问题感到困惑,再用st-link烧写程序时,这个.qspi段是不是放在内部flash中,只有在执行时,MCU才会到0x9000 0000处执行,这时MCU读flash,但是对我们来说是屏蔽的,我们可以直接当内部flash使用。如果前面没有执行DMA将0x9000 0000处数据传递到flash,后面是不是就不对了。这个时候为什么0x9000 0000处会有数据呢,实际上这里并没有flash啊,希望有人能帮忙解答一下! D- \& Q% ?7 z6 M
收藏 8 评论21 发布时间:2015-9-8 22:09

举报

21个回答
feiting94 回答时间:2015-9-9 12:00:44
netlhx 发表于 2015-9-9 09:14
- V3 z& z* p' S这个位置就是映射到4G空间的FLASH的地址

; t3 j+ L/ B" S: w- p请问一下,这个位置实际上并没有flash,那程序在执行步骤5,6,7,将这个位置的内容通过DMA写入到实际的flash上时,MCU是怎么怎么知道要传输数据的内容,毕竟映射的地址那里并没有flash。还有程序烧写进去时 .qspi段是放在哪里呢
党国特派员 回答时间:2015-9-9 09:35:02
学习了。。。 blank.png blank1.png blank2.png blank3.png blank4.png
feiting94 回答时间:2016-3-13 09:28:04
狂奔的小冉 发表于 2016-3-11 17:46
3 R5 Y* l6 K" Z/ m8 L6 w  E我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体 ...

& ~, m0 x7 Y4 m# W n25q_128mb_3v_65nm.pdf (1.11 MB, 下载次数: 133)
moyanming2013 回答时间:2015-9-8 23:30:21
先学习下。。。
你好我好大家好! 回答时间:2015-9-8 23:43:28
学习下                     
netlhx 回答时间:2015-9-9 09:14:44
这个位置就是映射到4G空间的FLASH的地址
yanhaijian 回答时间:2015-9-9 12:37:42
研究的比较细。
埃斯提爱慕 回答时间:2015-9-10 23:23:52
提示: 作者被禁止或删除 内容自动屏蔽
anny 回答时间:2015-9-17 15:03:36
( T+ W  {% v2 E6 v7 o
支持楼主的原创分享
yanhaijian 回答时间:2015-9-17 15:21:05
学习了,顶顶。
狂奔的小冉 回答时间:2016-3-11 17:45:52
我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体说明。谢谢
狂奔的小冉 回答时间:2016-3-11 17:46:10
我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体说明。谢谢
狂奔的小冉 回答时间:2016-3-13 10:01:09
/ w. H  c5 M9 i, ?) G" {. h
原来是在EEPROM的 datasheet里。。。谢谢了!
绝影 回答时间:2016-8-26 13:37:49
今天也在研究Qspi 在keil添加FLASH的界面可以添加外部的Qspi存储器,应该可以将程序下载进去( U) v( t5 K4 R( K! c& N( U
11223.png
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版