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

STM32F7-discovery QSPI接口使用心得  

[复制链接]
feiting94 发布时间:2015-9-8 22:09
STM32电机培训online,大佬带你玩电机
' ]0 J! k7 Y. |. W- i2 O4 p5 G$ f& I  i% r0 f' R; X+ g' i" n# [( ]5 f& ^
FMC和QSPI引脚冲突的解决
! V6 d6 j7 x5 O: J9 f
$ K9 ^3 _9 ?$ P: g. w分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式' H7 z/ u8 x$ K/ |

9 n# K9 n0 C, k! z
' a+ H9 j& J/ ^9 P+ _! T1.QuadSPI接口的特点。与普通的SPI Flash接口相比,quadSPI可以接四位数据线,传输速率大大提高4 h" x7 z. j' E4 v$ Q) o2 {
STM32F7的quad-spi接口有三种模式& E3 k( i( P; z$ K; O7 ~  w" r
(1)indirect mode(间接模式):所有操作都是用的QUADSPI寄存器,通常在对FLASH寄存器配置时用这种模式
1 x8 e* z, X9 n  V7 B# h(2)status polling mode(状态轮询模式):外部Flash的状态寄存器查询使用的是这种模式,如果开启中断,可以产生中断信号) f9 m0 H7 H6 d  u! v
(3)memory-mapped mode(内存映射模式):外部flash映射到MCU的地址空间,可以视为内部闪存,读写数据用的这种模式
8 l7 W) N- o! M. M) [( p: @2 u* A( G
STM32F7的quad-spi接口主要特点:% N' o" c% ?: ~& B3 Y
(1)三种工作模式* \5 s3 _. J" G1 U: e& x
(2)Dual-Flash模式,可以同时接两片Flash,共用CLK和CS片选线。这样可以最多同时传输8位数据(4+4)  }% D  z: P8 _. D
(3)支持SDR和DDR
9 J. x7 |- |, X& q4 T; h% D  x(4)间接模式的DMA通道$ {( j1 m2 F' k) |" A3 N& T
(5)内嵌接收和发送FIFO. r9 K; r( b1 j; _
(6)支持FIFO threshold, timeout, operation complete, access error四种中断
4 e2 B& R1 ?5 d/ N$ U: L7 H7 P" D% e- W" l
Quad-spi完整的命令格式由5部分组成,分别是Instruction,Address,Alternate-bytes,dummy-cycles和Data这5个阶段,时序图如图所示: n6 M/ I7 k' s# f( x$ |4 h$ l
3.png
  A! l1 a' P' m4 F总结一下特点:$ }+ u% t, p- Y9 `7 w& P5 y1 d
(1)每个阶段都可以选择是 1bit(SO/SI线 single SPI mode),2bit(IO0/IO1线 dual SPI mode),和4bit(IO0/IO1/IO2/IO3线 quad SPI mode)传输,
7 w: f5 m5 u5 x: N$ @7 G# s/ H% q(2)写数据时,dummy cycle可以为0;读数据时,为了保证足够的转换时间,因为之前是写数据,现在要变成读,至少要1个dummy cycle9 O$ m6 G6 e$ @, E$ T
(3)这5个阶段都不是必须的,可以没有
. p4 U# w1 s+ r+ R(4)indirect mode模式,数据读取时通过QUADSPI_DR寄存器;memory-mapped mode模式,数据直接返回和输出通过AHB总线或者DMA
! e( D: n1 b$ ^; o$ r4 L(5)SDR和DDR模式的区别:两者的instruction阶段都是CLK信号的下降沿数据传输;在DDR模式中,Address,Alternate-bytes和Data这3个阶段都是上升沿和下降沿都有数据传输
2 K4 x8 T4 F( J9 }2 w5 v(6)F7有32-byte FIFO,可以设置threshold(阈值),接收数据数目超过该值时,FTF(FIFO threshold flag)=1# W6 h( M+ J' T+ }. t% u: [
2 P0 L4 E2 U3 C9 Q) E& ]% j2 F
; n$ J  A+ x) \, X

) V1 V  ^) D6 a$ U# ?/ w3.STM32F7-Discovery的quad-spi flash使用的是micron公司的N25Q128A系列,有128Mbit容量,后面附上数据手册,原理图如图所示
3 G- |8 U7 p; f& I) f6 m6 {0 b- T& h3 r" Z
1.png * _* Q' y; B, S5 f
这里主要说明quad-spi flash代码流程分析
9 x: H" s6 [* W( o, L; |论坛可以下载STM32Cube_FW_F7_V1.1.0压缩包,我也是从里面的例程中学习的。
8 z. i0 s& I2 W* T) o' G选择STM32Cube_FW_F7_V1.1.0/project/STM32746G-Discovery/example/QSPI/QSPI_ExecuteInPlace例程
( Z# I4 v' x' A0 T5 E! v! h(1)Flash配置寄存器初始化) O$ v/ s6 l* {7 B! v8 z" {
  1.   /* Initialize QuadSPI ------------------------------------------------------ */8 l) P  O7 c$ Y0 l* L& q9 @
  2.   QSPIHandle.Instance = QUADSPI;         
    5 e" X2 @0 m9 u& E8 _" x/ {
  3.   HAL_QSPI_DeInit(&QSPIHandle);
      y2 B; c- }. {
  4.         , v% X$ v1 L+ ^5 r+ A* h2 a: B
  5.   /* ClockPrescaler set to 2, so QSPI clock = 216MHz / (2+1) = 72MHz */. z1 t; J8 L& U
  6.   QSPIHandle.Init.ClockPrescaler     = 2;                                                                // <span style="background-color: rgb(255, 255, 255);">查阅手册可知,最大频率108MHz,这里为什么不用1呢??</span>- V9 {6 }. b, j8 E8 Y+ J
  7.   QSPIHandle.Init.FifoThreshold      = 4;                                                                 // FIFO的阈值为4bytes,
    + w1 f7 `; x7 O- S
  8.   QSPIHandle.Init.SampleShifting     = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
    2 z% ?5 e+ T) |. ?. |  O' s
  9.   QSPIHandle.Init.FlashSize          = POSITION_VAL(0x1000000) - 1;                         //0x1000000=16MB,
    3 q4 C. {" v) ^+ H1 `$ o9 H4 I" S
  10.   QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;        //nCS stay high for at least 2 clock cycles between commands
    * q. s) n- p8 P# p5 s
  11.   QSPIHandle.Init.ClockMode          = QSPI_CLOCK_MODE_0;                                    //Clk stays low while nCS is released
    . Z% ]8 l8 V" ?2 l
  12.   QSPIHandle.Init.FlashID            = QSPI_FLASH_ID_1;                                               //选择第1片flash7 U+ L9 f  W/ S& w. p. D' \
  13.   QSPIHandle.Init.DualFlash          = QSPI_DUALFLASH_DISABLE;
    0 Y3 u1 q8 I5 @. y5 R+ g
  14.   ) `0 A: z  {8 t& p, }/ J- a
  15.   if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)
    6 f+ v7 Q8 Z* |# V1 ?
  16.   {
    ; {( z- k6 S/ i* M) A8 [
  17.     Error_Handler();
    4 {4 e$ u7 L8 l0 r5 N1 S
  18.   }
复制代码
(2)使能写操作3 q7 M, z9 ~' a
  1.   /* Enable write operations ------------------------------------------ */
    : ]& {8 T" M% c+ A$ r: @" M5 W5 {
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;            
    " v. U" B! }8 L4 v
  3.   sCommand.Instruction       = WRITE_ENABLE_CMD;
    ! F- Q/ i; h) t0 e) L
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;; _3 |3 E5 F9 v1 s" e
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;, F! ]  L7 T' u  Y$ p
  6.   sCommand.DataMode          = QSPI_DATA_NONE;
    / u7 Y. a* \  `' ~( z
  7.   sCommand.DummyCycles       = 0;/ w( C6 E1 P; H& b/ B3 D1 o6 H
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;) C- M, z7 ]. N1 f8 ]
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    % ]% y1 |4 T  G1 @( f4 h. N  w
  10.   sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
    ! f! G; a' E9 A

  11. * [: c- i0 M/ C0 c
  12.   if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)) c: W$ Z/ m& M( j
  13.   {
    ( T6 ]% y+ V* j  {0 b( x0 w$ a
  14.     Error_Handler();
    5 d, M6 H% Y$ |# I1 m& l4 w
  15.   }
    % i7 {& f# C$ a
  16.   3 D. m' P8 `( a. R$ y1 c
  17.   /* Configure automatic polling mode to wait for write enabling ---- */ + \2 T- m1 y8 L, r7 m" p
  18.   sConfig.Match           = 0x02;2 D( `  m3 [' D5 ~7 Q, F) z8 I4 z
  19.   sConfig.Mask            = 0x02;
    * y! m0 Y5 }5 O" h* i) I- ]& Y; ?
  20.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    7 X! O* }, q6 {2 ?0 [( V$ w" N. d
  21.   sConfig.StatusBytesSize = 1;
    4 s) l' S5 q1 v+ J: [+ }. H$ e& R
  22.   sConfig.Interval        = 0x10;) \1 J' H" I/ _" ]; W" T
  23.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;+ y2 k0 j# [! S/ z: [
  24. , k: L3 x4 b- I5 w
  25.   sCommand.Instruction    = READ_STATUS_REG_CMD;
    + i/ R; k/ {4 k) a
  26.   sCommand.DataMode       = QSPI_DATA_1_LINE;
    * M! V0 U& S5 |  y5 W" ~

  27. 3 f  v* Y5 l% K$ X6 k& E( Z; k, Y
  28.   if (HAL_QSPI_AutoPolling(&QSPIHandle, &sCommand, &sConfig, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)2 ~9 E- X1 X; u3 M* h+ \; m2 l0 _/ H
  29.   {. K2 L0 f* ^! W. P
  30.     Error_Handler();
    % D! j' t0 w" {% B* d
  31.   }
复制代码
首先使用indrect mode,使用1bit instruction传输,命令是 WRITE_ENABLE_CMD,无其他4个阶段
# c% G$ d4 L6 D7 U* k' o* B2 O源码中定义   #define WRITE_ENABLE_CMD                     0x06;
8 l* R, ~' O$ A5 U% {7 y这里要查阅芯片手册
' l9 n& A: G$ \( X 5.png
1 j9 o! J# w+ d: B7 c: F确实是一致的。' A% n% z2 x* u/ O1 m2 q) r9 a
接着使用automatic polling mode,命令是READ_STATUS_REG_CMD,读status register6 `* z/ R7 y. V/ L
automatic polling mode有如下功能,它将查询的得到的值和设置的Match值比较,只比较Mask中bit=1的位,设置可以为AND或者OR模式,
$ r' R+ f3 P+ ]+ u查阅手册:
. d8 c9 S& E4 x$ a4 V/ ?7 @6 R  D6 L! l5 o8 [
6.png 4 z& u9 i) V. @9 v" O- T
确实是bit1,即mask=0x02,当该位为1时,说明写使能,故match=0x02;$ L8 D( R  g, T, ], o4 Y1 E
(3)擦除flash的第一个sector
9 y, Y  b, H5 u1 U
  1.         /* Erasing Sequence -------------------------------------------------- */
    0 ^" N1 x4 }( c
  2.         sCommand.Instruction = SECTOR_ERASE_CMD;   //块擦除,64KB one sector( G9 Q! F) m; H
  3.         sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
    : F. M2 |( j: u2 ~  l  D1 Q& t
  4.         sCommand.Address     = qspi_addr;                          //qspi_addr=0; F* j, y$ u: K' q3 |+ Y# W: E
  5.         sCommand.DataMode    = QSPI_DATA_NONE;6 I( }. A; c! q# ~5 b$ G
  6.         sCommand.DummyCycles = 0;2 g& S1 O6 ?& D* }

  7. , s+ S9 w# C* O8 K. x
  8.         if (HAL_QSPI_Command_IT(&QSPIHandle, &sCommand) != HAL_OK)
    . x9 L5 d9 Z3 {! ?* t) T
  9.         {
    ) ]/ j  K2 X( X; s4 P8 C* j1 b) B
  10.           Error_Handler();
    ( L0 |6 v/ @1 Y1 [' b4 U0 h
  11.         }
复制代码
(4)等待擦除完毕,使用automatic polling mode查询,这里还是读status register,但读的是bit0位,而且预期值bit0=0;查阅手册
% ^6 P) Q# f2 T, a0 W  f 7.png . J) a" y+ D* s" z6 b
  1.   /* Configure automatic polling mode to wait for memory ready ------ */  
    ( O1 i0 h' v% M; a( m: |
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;/ h1 Q$ x9 r4 f. F: b& ^# U- q
  3.   sCommand.Instruction       = READ_STATUS_REG_CMD;: `( J, H) F% e# r% r; o" H
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;
    9 V& A4 t; F9 z' S( I! i* u
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;1 H, s1 l" s0 ]" N& I2 P
  6.   sCommand.DataMode          = QSPI_DATA_1_LINE;& G7 ]& f, H, l
  7.   sCommand.DummyCycles       = 0;# N) ~" Z- Y6 C3 F
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
    - z! t0 D" A# I7 f" K# i
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    # W5 [% E- D) v$ i/ j( I
  10.   sCommand.SIOOMode         = QSPI_SIOO_INST_EVERY_CMD;
    . u5 u. {  u% F2 ~5 V

  11. 4 o5 B  h# Z9 y* |" O% o
  12.         //bit0:write in progress 0:ready 1:busy # ~( j* W' m" d/ H( {
  13.   sConfig.Match           = 0x00;
    ! _- r6 }9 o+ W' Y) w: z
  14.   sConfig.Mask            = 0x01;
    & e( C! ]9 w+ Z0 Y6 I, G& v8 p
  15.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    ; V/ Q6 q) J7 A9 r: z- Y8 p. {
  16.   sConfig.StatusBytesSize = 1;
      l) \# e  G% P+ R5 c$ j6 W! t
  17.   sConfig.Interval        = 0x10;
    $ o, r, i( n# M( w0 S3 }2 u
  18.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;
    5 h; C) Y; ~4 z2 N3 E' Z

  19. & b! f/ X: ]4 V& `6 ^$ C0 ]
  20.   if (HAL_QSPI_AutoPolling_IT(&QSPIHandle, &sCommand, &sConfig) != HAL_OK)
    8 A1 E  h8 h3 ~! ^' v0 S
  21.   {7 y. ]( Y. P' z2 m0 U- C  Q
  22.     Error_Handler();' G/ I' b& a: @2 Y& e+ N, i
  23.   }
复制代码
(5)写使能并且写数据( |+ B6 e7 j8 P1 i  {  ]. w" m' Z
  1. /* Enable write operations ----------------------------------------- */
    * z8 w- v% ?) g2 [1 q: n* A
  2.           QSPI_WriteEnable(&QSPIHandle);+ Q/ S, K$ Q0 f9 R2 ^4 i

  3. 1 H& I% S# I  A0 U  N/ @
  4.                                         //QUAD INPUT FAST PROGRAM Data In:DQ[3:0];Address In:DQ0% A+ x8 a+ |/ w0 u
  5.           /* Writing Sequence ------------------------------------------------ *// C3 h6 ?: Y9 D( z- ?
  6.           sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;
    % {: b, V/ p. P5 h  u
  7.           sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
    * g$ Y5 y6 j3 X+ ~
  8.           sCommand.Address     = qspi_addr;                                              //qspi_addr=0
    ! s8 R) R+ P' @" O
  9.           sCommand.DataMode    = QSPI_DATA_4_LINES;/ f6 F9 Q7 |8 n7 [+ p& _) G
  10.           sCommand.NbData      = size;                                                         //size = QSPI_PAGE_SIZE = 256
    ) S1 O. Q/ }& w1 ~" y+ g

  11. " K8 u: C) g! U) H( [7 a  D( A
  12.           if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)+ e. T, `4 _! |2 _$ e, |1 _
  13.           {; \) L8 E- ^3 I6 W. G' C( }
  14.             Error_Handler();. i$ T% o4 U! s7 Q- M; Y
  15.           }
    6 Q$ }* @6 y# v2 ]2 _! K

  16. " C. ~; g( G# @& Z4 T, J1 u) g/ d5 k2 g
  17.           if (HAL_QSPI_Transmit_DMA(&QSPIHandle, flash_addr) != HAL_OK)         //flash_addr = (uint8_t *)(&Load$QSPI$Base);) {) T& W0 H/ x8 Q0 z3 i
  18.           {
    ! H( h7 O& r# T  z
  19.             Error_Handler();1 }0 j) j0 l5 T3 d4 Y
  20.           }
复制代码
看到这里就不得不提一下scatter file文件8 ~7 R( H2 g( s  V7 T) n
8.png ' n1 g9 M# a3 b. w. g1 k
打开这个文件,STM32746G-DISCOVERY.sct0 H/ J, F6 k, N' c
  1. ; *************************************************************, i! B3 F( [4 b4 A
  2. ; *** Scatter-Loading Description File generated by uVision ***5 |9 [3 _3 ~0 G
  3. ; *************************************************************# j4 ^- \: d$ C6 g0 t
  4. ) U9 q% W  ~1 H9 z5 r' S
  5. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
    4 W5 O9 d7 W& H! c& [
  6.   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
    1 w8 o  l2 F& ~1 ]
  7.    *.o (RESET, +First)6 w9 u2 ?+ w: w' O. c7 h3 c4 K" M% Y
  8.    *(InRoot$Sections)  ?# W# v2 Y; _7 Y. v$ D; w2 a3 B# ?
  9.    .ANY (+RO)
    ! T' g8 i! e$ J8 C, _& `) I7 G+ c; G
  10.   }( q5 j- ?- R; |
  11.   RW_IRAM1 0x20000000 0x00050000  {  ; RW data) L* {$ e0 j* H6 U9 Z: e/ f
  12.    .ANY (+RW +ZI)" b0 F$ ^! S* @- y
  13.   }
    # h% M0 J& V7 A2 w
  14.   QSPI 0x90000000 0x00100000  {
    % j! r$ c* b) V) N8 ?
  15.    *.o (.qspi)" w( J3 R' }  T) r
  16.   }4 x- M2 i; G  l
  17. }
复制代码
可以看到和一般的scatter file(分散加载描述文件)相比,多了一个QSPI执行域,
5 L( Z: u- F% Z0 K8 j7 ^, _学过的都知道,这里表示链接时,将所有目标文件的.qspi段放在QSPI执行域,
$ f( Q5 W% l7 g3 v1 l: q再看一下F7的内存映射
# ^+ r7 W' R0 |. W0 D 9.png
8 M4 P; U4 H: @/ k/ E+ s: [在0x8000 0000到0x9FFF FFFF有一个Quad SPI,这就是memory-mapped mode的由来。
9 D# |" l) K4 @" v% z* i1 y# m因此上面flash_addr = (uint8_t *)(&Load$$QSPI$$Base) = 0x9000 0000; DMA传输就是将 0x9000 0000处开始的size = 256bytes的数据传递到flash,模式是indrect read mode
  A# @* H/ q* @! z( I# J- ](6)判断传输是否完成,判断的方法同步骤4' x% v+ M$ s9 X, F
(7)重复5、6步直到传输完max_size = (uint32_t)(&Load$$QSPI$$Length)=  0x00100000 ) @5 B# V& L9 d* c
(8)设置dummy-cycle的值,配置为memory-mapped mode,命令是 QUAD_OUT_FAST_READ_CMD=0x6B,就是说映射完后,相对于内部flash
# D' ~8 z$ Y' c9 `
  1. /* Configure Volatile Configuration register (with new dummy cycles) */
    - a% ?, P- l; A# I1 a7 f
  2.             QSPI_DummyCyclesCfg(&QSPIHandle);8 m; E# b  x& l7 V0 C* ~( g
  3. & G9 H! t' L% g. c/ `& d. X: H
  4.             /* Reading Sequence ------------------------------------------------ */; }( V, |; L% r% o
  5.             sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;
    : `" l3 X/ d  |3 g& p% @) E- q
  6.             sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;
    0 w  X8 ]( {* t0 ~: y

  7. : B5 I# A3 O2 d
  8.             sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;- c$ p* F  K4 V1 ]" d0 ]

  9. / \8 h! z1 x! A! l* ^2 I, Y
  10.             if (HAL_QSPI_MemoryMapped(&QSPIHandle, &sCommand, &sMemMappedCfg) != HAL_OK)
    9 ?' K0 A" K+ P
  11.             {- }  o3 |6 @" p9 T$ q
  12.               Error_Handler();
    3 t2 e3 f* v+ K( i1 z
  13.             }
复制代码
(9)执行.qspi段的代码1 Z, T) G/ [8 A8 q5 }% G$ I$ z
  1. /* Execute the code from QSPI memory ------------------------------- */
    ) k+ m6 x0 X! V1 C" n9 P
  2.           GpioToggle();
复制代码
注意) q2 _8 k+ Z4 g* k$ N% }
  1. #if defined(__CC_ARM)
    , {2 {4 i  b8 Z% m7 @
  2. #pragma arm section code = ".qspi"
    " F& s2 |3 B. a8 X
  3. #pragma no_inline
    ; W( \, i% z0 x4 U7 K
  4. static void GpioToggle(void)& }! J1 f; u0 P$ g: ]9 J
  5. #elif defined(__ICCARM__)
    - f& p; }+ H' ~( t' s! _1 G
  6. static void GpioToggle(void) @ ".qspi"+ K4 Z% ^9 C! |/ @" a2 |6 |; F
  7. #elif defined(__GNUC__)
    / G; j+ @/ p( x. `: ]
  8. static void __attribute__((section(".qspi"), noinline)) GpioToggle(void)
    9 ]4 `" E4 w4 h
  9. #endif
    + u( e) v- u1 ]  l9 g

  10. 5 X* m3 r/ c; ^
  11. {
    1 G$ U+ _# ~- o" `# u# e2 Q8 d
  12.   BSP_LED_Toggle(LED1);1 S" \- T/ Z. u' W1 z/ v) o
  13.   /* Insert delay 200 ms */& a0 f# a- ?" ^, f5 z
  14.   HAL_Delay(200);
    , H& Q/ M5 _6 J% l9 @
  15. }
复制代码
" i9 a. Q. @; ?6 K* S
我的问题:5 y8 b6 H' i/ W1 `
学完之后,我一直对一个问题感到困惑,再用st-link烧写程序时,这个.qspi段是不是放在内部flash中,只有在执行时,MCU才会到0x9000 0000处执行,这时MCU读flash,但是对我们来说是屏蔽的,我们可以直接当内部flash使用。如果前面没有执行DMA将0x9000 0000处数据传递到flash,后面是不是就不对了。这个时候为什么0x9000 0000处会有数据呢,实际上这里并没有flash啊,希望有人能帮忙解答一下
; k' U) U1 q- t' c
收藏 8 评论21 发布时间:2015-9-8 22:09

举报

21个回答
feiting94 回答时间:2015-9-9 12:00:44
netlhx 发表于 2015-9-9 09:14( {& A1 s1 F) ]  W( \0 s
这个位置就是映射到4G空间的FLASH的地址

; b3 _% [4 p4 R5 \0 s4 c请问一下,这个位置实际上并没有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
* W" }6 e; j7 a' H, n% W5 y- i我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体 ...
+ r) B2 L" f) N# n1 y
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
0 [# i8 H% N1 Q9 M& r" x- U7 U
支持楼主的原创分享
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
) V8 l: s+ j. y5 T; v; D% H8 k+ F
原来是在EEPROM的 datasheet里。。。谢谢了!
绝影 回答时间:2016-8-26 13:37:49
今天也在研究Qspi 在keil添加FLASH的界面可以添加外部的Qspi存储器,应该可以将程序下载进去3 O4 q0 U, ~2 p9 w9 O
11223.png
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版