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

STM32F7-discovery QSPI接口使用心得  

[复制链接]
feiting94 发布时间:2015-9-8 22:09
STM32电机培训online,大佬带你玩电机
. H' g( `- Y! s) z% m- {# W- I/ v4 N  k" t( H
FMC和QSPI引脚冲突的解决
3 t  D1 ?1 ^" u% ]
" I' o4 R$ S3 h( q6 t6 }: p分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式6 H( r% Y9 y- F( Z/ l# a
" _' S5 ?7 j! a5 q1 F/ S1 X
, {) [& ~' ~) }0 q
1.QuadSPI接口的特点。与普通的SPI Flash接口相比,quadSPI可以接四位数据线,传输速率大大提高0 o& R( I4 F9 h, n. d" {& l
STM32F7的quad-spi接口有三种模式. u; E) Y$ L8 [9 x
(1)indirect mode(间接模式):所有操作都是用的QUADSPI寄存器,通常在对FLASH寄存器配置时用这种模式) p4 p: H" A) ^5 J* f1 r
(2)status polling mode(状态轮询模式):外部Flash的状态寄存器查询使用的是这种模式,如果开启中断,可以产生中断信号$ Z" V* e& _: z5 j$ F* ~( [
(3)memory-mapped mode(内存映射模式):外部flash映射到MCU的地址空间,可以视为内部闪存,读写数据用的这种模式+ a) |& [: ~) p5 x8 e
7 J! |* p4 ~; I  m1 B: l8 A5 A
STM32F7的quad-spi接口主要特点:
8 G& _9 V9 {8 G8 _(1)三种工作模式
" D3 h. K$ ~: l; g* t+ t! b(2)Dual-Flash模式,可以同时接两片Flash,共用CLK和CS片选线。这样可以最多同时传输8位数据(4+4)
3 @5 [, V" i7 s% K) O(3)支持SDR和DDR# b2 L9 |. O$ b4 p9 p. k% |' l
(4)间接模式的DMA通道6 O# I& K7 d& E$ g  N( n2 [
(5)内嵌接收和发送FIFO; {2 S5 s0 R, Z" y
(6)支持FIFO threshold, timeout, operation complete, access error四种中断" a: n; s, j$ ^4 O2 z. H, e9 P

+ L# @/ a- v7 D8 C$ T! G" i2 RQuad-spi完整的命令格式由5部分组成,分别是Instruction,Address,Alternate-bytes,dummy-cycles和Data这5个阶段,时序图如图所示. |+ q( V( f8 n% ~9 S/ b2 n
3.png
5 v) R' p, [/ k% ?8 i, ?8 G8 m总结一下特点:- S( s* q; c0 c. Z
(1)每个阶段都可以选择是 1bit(SO/SI线 single SPI mode),2bit(IO0/IO1线 dual SPI mode),和4bit(IO0/IO1/IO2/IO3线 quad SPI mode)传输,
" p# F0 a3 n& e(2)写数据时,dummy cycle可以为0;读数据时,为了保证足够的转换时间,因为之前是写数据,现在要变成读,至少要1个dummy cycle
( n# T1 R! ~, a/ K(3)这5个阶段都不是必须的,可以没有" {- m& K/ F- V
(4)indirect mode模式,数据读取时通过QUADSPI_DR寄存器;memory-mapped mode模式,数据直接返回和输出通过AHB总线或者DMA* {2 [$ Y  r, u1 u2 }
(5)SDR和DDR模式的区别:两者的instruction阶段都是CLK信号的下降沿数据传输;在DDR模式中,Address,Alternate-bytes和Data这3个阶段都是上升沿和下降沿都有数据传输
* J1 m1 Q/ P8 a( g' u' D2 A! [(6)F7有32-byte FIFO,可以设置threshold(阈值),接收数据数目超过该值时,FTF(FIFO threshold flag)=1
  f4 v, f* T+ P+ j, c. a$ ^; a' m% u

8 j3 A& \+ c. {0 K  z; ]9 {. E* g# F& C. D% x. d3 w5 }
3.STM32F7-Discovery的quad-spi flash使用的是micron公司的N25Q128A系列,有128Mbit容量,后面附上数据手册,原理图如图所示' Y5 Q& W! ]7 J

: Y' |; Y7 i0 Q: A& n) q 1.png
- G+ ]) D4 d7 L- I1 u2 V这里主要说明quad-spi flash代码流程分析
, w" P( P; n* R! t& z' w论坛可以下载STM32Cube_FW_F7_V1.1.0压缩包,我也是从里面的例程中学习的。
0 \0 F; V  X  f( \! F3 O" H选择STM32Cube_FW_F7_V1.1.0/project/STM32746G-Discovery/example/QSPI/QSPI_ExecuteInPlace例程' i2 \! U9 J- A  V9 X# ?
(1)Flash配置寄存器初始化
5 j4 g& a8 ]( ]1 Z* ]
  1.   /* Initialize QuadSPI ------------------------------------------------------ */
    - I# r& N' f2 @' d
  2.   QSPIHandle.Instance = QUADSPI;         
    " W5 L- k- q- Q; h  Q+ E
  3.   HAL_QSPI_DeInit(&QSPIHandle);
    1 D0 M( r3 C8 s, d2 B
  4.         - ^4 `& h1 V# q8 c' X% z
  5.   /* ClockPrescaler set to 2, so QSPI clock = 216MHz / (2+1) = 72MHz */
    * r/ \9 K! L6 @4 ]! f) ]
  6.   QSPIHandle.Init.ClockPrescaler     = 2;                                                                // <span style="background-color: rgb(255, 255, 255);">查阅手册可知,最大频率108MHz,这里为什么不用1呢??</span>
    1 h% Y7 {# @' B9 g5 Y, a; T
  7.   QSPIHandle.Init.FifoThreshold      = 4;                                                                 // FIFO的阈值为4bytes,
    % y" t% I9 Y1 a2 R
  8.   QSPIHandle.Init.SampleShifting     = QSPI_SAMPLE_SHIFTING_HALFCYCLE; 6 e) u- U& N2 o
  9.   QSPIHandle.Init.FlashSize          = POSITION_VAL(0x1000000) - 1;                         //0x1000000=16MB,
    ; U, ~/ B1 ?0 h, r
  10.   QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;        //nCS stay high for at least 2 clock cycles between commands
    . R! K' L0 r# w5 }2 M
  11.   QSPIHandle.Init.ClockMode          = QSPI_CLOCK_MODE_0;                                    //Clk stays low while nCS is released
    ( B6 \; {; P# v2 f( A- _/ w/ n
  12.   QSPIHandle.Init.FlashID            = QSPI_FLASH_ID_1;                                               //选择第1片flash0 x7 P! R9 Y/ G1 }
  13.   QSPIHandle.Init.DualFlash          = QSPI_DUALFLASH_DISABLE;
    : b! L6 p) [1 V1 T% @
  14.   " N0 @0 H, M. h& Z2 D
  15.   if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)
    ! G$ {! ~& }9 ]4 W7 d
  16.   {6 r, @# o, Z  ]3 l
  17.     Error_Handler();& j4 _4 u6 ^2 q/ @; X
  18.   }
复制代码
(2)使能写操作' |3 o/ V4 t- f) n& G
  1.   /* Enable write operations ------------------------------------------ */
    5 {, X* e7 P6 o, `" }" n
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;            4 o1 T, Y. m. ]% b7 @+ `
  3.   sCommand.Instruction       = WRITE_ENABLE_CMD;
    7 g* {* Y3 t' u( n9 e
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;, y; B1 n. `& C
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;% `' j8 _. p& f
  6.   sCommand.DataMode          = QSPI_DATA_NONE;! u1 n# Y7 C7 X  s
  7.   sCommand.DummyCycles       = 0;: y8 n' k: q3 n' {2 n
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
    9 X# q0 t* O+ n
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;; g/ C4 i- }$ L* h2 i$ K( ]/ W; U
  10.   sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;
    - N0 |/ U$ s  t! w1 q5 X5 U' t, x$ o

  11. / a, P- D0 K9 b$ W
  12.   if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK). s6 c  |5 h& Q2 `0 T
  13.   {
    0 D+ I+ t4 K( M9 E
  14.     Error_Handler();: E! K: k; y: X9 |& W- H
  15.   }/ B7 N* f" k1 }$ \% z8 q* V
  16.     y2 b# g; N: j4 Z% R. y
  17.   /* Configure automatic polling mode to wait for write enabling ---- */
    % N3 \# X) Y- b$ |- d
  18.   sConfig.Match           = 0x02;
    , u/ r$ t3 Q# y! [& Z
  19.   sConfig.Mask            = 0x02;6 c+ u) |. u* p3 B' n% i) }
  20.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    " V9 g* U) r  q
  21.   sConfig.StatusBytesSize = 1;
    , O) R, N, O6 W6 W$ H4 \! Y/ b' ^; m! \
  22.   sConfig.Interval        = 0x10;3 g1 r( a( t- A' O) K6 Z  i$ H
  23.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;
    6 ~* |+ Y, u4 I6 |* @9 A: A8 g! ?
  24. 2 k$ }0 \6 c, {* Q8 t6 M) N
  25.   sCommand.Instruction    = READ_STATUS_REG_CMD;
    ! k; H% E$ G8 j# k2 g* E. _! R
  26.   sCommand.DataMode       = QSPI_DATA_1_LINE;
    4 R- F4 G6 ?8 J$ S+ l! m3 P) w
  27. 8 `0 [* e, l/ [# }; Z
  28.   if (HAL_QSPI_AutoPolling(&QSPIHandle, &sCommand, &sConfig, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)4 w1 p' O; m  Q7 a7 Z
  29.   {
    5 D4 ^; I3 @0 D9 U7 ?  A
  30.     Error_Handler();
    ' c% W+ Z5 ?& k) F- u
  31.   }
复制代码
首先使用indrect mode,使用1bit instruction传输,命令是 WRITE_ENABLE_CMD,无其他4个阶段
( A, T8 M  ]0 k  Z源码中定义   #define WRITE_ENABLE_CMD                     0x06;
$ v  ]/ y7 Q+ o! W$ U$ J这里要查阅芯片手册
2 v: ^6 _  ]8 n" |$ T4 u6 q! U$ K 5.png ' z" k% y' B9 ]/ N
确实是一致的。
7 [  i) @! L& c8 d9 \接着使用automatic polling mode,命令是READ_STATUS_REG_CMD,读status register
1 B3 X- h- U$ ^. zautomatic polling mode有如下功能,它将查询的得到的值和设置的Match值比较,只比较Mask中bit=1的位,设置可以为AND或者OR模式,
3 g: N; D; C- s2 a; [; T/ A; q0 k查阅手册:; H' m9 O" O) K7 f' M3 h: |9 D

/ h( M$ [  a" R8 F 6.png
8 F% D9 Z1 \7 |% @确实是bit1,即mask=0x02,当该位为1时,说明写使能,故match=0x02;: T$ j; s- a, H9 p/ |2 M
(3)擦除flash的第一个sector
1 ?% U- \( K) [! x4 K: _  _
  1.         /* Erasing Sequence -------------------------------------------------- */; }9 S9 O/ I6 `1 D  _5 {
  2.         sCommand.Instruction = SECTOR_ERASE_CMD;   //块擦除,64KB one sector1 C% I7 ?- Z; r- Y8 V* J- d* a
  3.         sCommand.AddressMode = QSPI_ADDRESS_1_LINE;  J: a$ `" m, b* X2 o$ \  x! M
  4.         sCommand.Address     = qspi_addr;                          //qspi_addr=0
    5 L' `! A( ]$ j
  5.         sCommand.DataMode    = QSPI_DATA_NONE;
    % i0 k8 l1 n: H6 ~! L/ S6 _$ e1 l
  6.         sCommand.DummyCycles = 0;
    & \9 ?' F6 }- `( J$ ~$ B

  7. * O7 z: i- u& B7 [+ D
  8.         if (HAL_QSPI_Command_IT(&QSPIHandle, &sCommand) != HAL_OK)
    5 d: |4 }' U0 i; t. B
  9.         {
    6 Q) c' d8 |% W" T% l7 N1 N& J0 Z
  10.           Error_Handler();) I6 E- g( A8 d1 b5 X
  11.         }
复制代码
(4)等待擦除完毕,使用automatic polling mode查询,这里还是读status register,但读的是bit0位,而且预期值bit0=0;查阅手册& j: g2 q5 l- J# P& q
7.png
2 S. L) d) F$ p! n2 p
  1.   /* Configure automatic polling mode to wait for memory ready ------ */  
    * B' _- D# n! T( t$ s
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;
    5 N, O3 K( z' ~" B& g% k
  3.   sCommand.Instruction       = READ_STATUS_REG_CMD;) E! ~' r  t! x
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;
    4 N1 t8 d8 q& d# g' z# W5 X
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;/ z- t+ X. j8 A- Z, U7 i
  6.   sCommand.DataMode          = QSPI_DATA_1_LINE;
    ' j; [3 a  m2 }
  7.   sCommand.DummyCycles       = 0;) ]2 R! C) B( W- ?
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;- }( r# ~" \, X5 _) z2 y  d0 E3 @
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    $ m! r3 [9 W* f3 n) p
  10.   sCommand.SIOOMode         = QSPI_SIOO_INST_EVERY_CMD;
    3 ?; E- @" \. D# }4 ], H2 m$ V! H

  11. , _3 G  t6 k+ u6 b6 s
  12.         //bit0:write in progress 0:ready 1:busy
    6 g3 k1 d7 d% U
  13.   sConfig.Match           = 0x00;
    4 W5 A- \; S) w3 l8 A5 H3 g" Z
  14.   sConfig.Mask            = 0x01;" T- M  }: g0 p$ E$ j0 k" c' c( M: S
  15.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    - W  P- V2 d: {5 F: i" o. L
  16.   sConfig.StatusBytesSize = 1;' g" m- E  b6 G6 [: Y, R6 p1 t
  17.   sConfig.Interval        = 0x10;" ^2 n4 \1 d: U7 y) m2 n
  18.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;8 F  S7 \, A. T' B/ o
  19. ( x' n5 h5 }* b2 i2 c( b- V2 W% j; Q6 u
  20.   if (HAL_QSPI_AutoPolling_IT(&QSPIHandle, &sCommand, &sConfig) != HAL_OK)! D. i! d0 u7 y' Z& j. p* n; ]
  21.   {+ N6 A0 |# d2 I" ~
  22.     Error_Handler();, z  E) q' L* [3 X* u% ?! ^
  23.   }
复制代码
(5)写使能并且写数据
/ {4 d* h2 R) v( D4 a
  1. /* Enable write operations ----------------------------------------- */
    2 A$ q' D2 D1 u: k
  2.           QSPI_WriteEnable(&QSPIHandle);
    9 d7 y* W) _  S' b7 ]) I. {
  3. ( W1 a+ L7 ^9 c! j% I/ \+ w3 P) ?# O8 C
  4.                                         //QUAD INPUT FAST PROGRAM Data In:DQ[3:0];Address In:DQ05 O( D$ c1 {9 r3 X8 H4 i
  5.           /* Writing Sequence ------------------------------------------------ */
    ' T/ d, ~7 G4 Z! Y7 z, W! n+ c
  6.           sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;9 H( y% b8 s' u
  7.           sCommand.AddressMode = QSPI_ADDRESS_1_LINE;) }2 T9 t5 i3 x* p1 u. O' @
  8.           sCommand.Address     = qspi_addr;                                              //qspi_addr=0# t! C8 V/ @1 a$ ~: g! P- b2 Q& {
  9.           sCommand.DataMode    = QSPI_DATA_4_LINES;! G, J0 R# s9 y. u9 C( n
  10.           sCommand.NbData      = size;                                                         //size = QSPI_PAGE_SIZE = 256
    7 ?# ]5 S8 |$ A

  11. + l- H2 }) K2 r2 e9 x' R
  12.           if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)9 V7 s) }: B+ h1 r
  13.           {% o1 y8 s; l% V% Q. e
  14.             Error_Handler();: w" `( ~4 S' j% `+ s
  15.           }
      t" `% u1 q& d5 P
  16. + S3 w: B. g# O
  17.           if (HAL_QSPI_Transmit_DMA(&QSPIHandle, flash_addr) != HAL_OK)         //flash_addr = (uint8_t *)(&Load$QSPI$Base);
    ! r( |9 C# ^; Q! n
  18.           {) P+ S- y$ F0 M6 k6 h! e
  19.             Error_Handler();+ I+ B8 i# i, l- F
  20.           }
复制代码
看到这里就不得不提一下scatter file文件2 k, N7 J0 K6 P" w' u
8.png
3 W$ V1 }6 n: @: U打开这个文件,STM32746G-DISCOVERY.sct
1 ]& M2 _) W+ e! {  |* N. f
  1. ; *************************************************************  K6 w3 ?" k9 k
  2. ; *** Scatter-Loading Description File generated by uVision ***" F+ t3 Z3 s  {0 _0 w
  3. ; *************************************************************& i, r) J3 B9 u1 I% a3 W
  4. . j7 @, |4 x4 A  D
  5. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
    . M, T. u5 c  O3 T( l  ~- j$ C& h
  6.   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address9 {9 m- [- s3 y% L, K
  7.    *.o (RESET, +First)& o+ L9 ^3 l. o. z5 j- o
  8.    *(InRoot$Sections)0 Z) L. N* W+ `
  9.    .ANY (+RO)
    # S. X) M0 K5 r; A7 F0 d
  10.   }/ b) @" o) W0 U; C4 x
  11.   RW_IRAM1 0x20000000 0x00050000  {  ; RW data
    0 e* m. R9 V: I! g! k/ u" g  m
  12.    .ANY (+RW +ZI)  d7 R3 C* u6 ?6 V. r  _3 f
  13.   }  L$ P9 U* V1 @$ D$ T& s; w2 e- {7 `( ^% I
  14.   QSPI 0x90000000 0x00100000  {4 z5 X7 @0 I3 o& S4 G# e
  15.    *.o (.qspi)4 V* D+ w9 B4 z0 o5 z. t
  16.   }
    0 c& E+ V5 G: ^% X7 S0 ]! i
  17. }
复制代码
可以看到和一般的scatter file(分散加载描述文件)相比,多了一个QSPI执行域,
2 x1 {9 k! D" l8 x学过的都知道,这里表示链接时,将所有目标文件的.qspi段放在QSPI执行域,
% e9 k8 W4 @# i, [再看一下F7的内存映射: k- n0 e0 M. e  @
9.png + J/ h  D8 m) G4 ^! W
在0x8000 0000到0x9FFF FFFF有一个Quad SPI,这就是memory-mapped mode的由来。4 k% a' N: b& V4 y1 X
因此上面flash_addr = (uint8_t *)(&Load$$QSPI$$Base) = 0x9000 0000; DMA传输就是将 0x9000 0000处开始的size = 256bytes的数据传递到flash,模式是indrect read mode $ Z! w% r$ i5 q3 X% Y
(6)判断传输是否完成,判断的方法同步骤4/ k, U3 L! A6 X3 c+ S. O
(7)重复5、6步直到传输完max_size = (uint32_t)(&Load$$QSPI$$Length)=  0x00100000
: l- {6 p3 A$ N- j0 n2 U(8)设置dummy-cycle的值,配置为memory-mapped mode,命令是 QUAD_OUT_FAST_READ_CMD=0x6B,就是说映射完后,相对于内部flash  \0 t3 ?7 g2 S$ r
  1. /* Configure Volatile Configuration register (with new dummy cycles) */
    & }4 A2 K- l6 [- @$ g$ h2 H  f
  2.             QSPI_DummyCyclesCfg(&QSPIHandle);
    ( X! B. _) F  I6 V7 g
  3. 8 q) T+ x* I( V: F1 u
  4.             /* Reading Sequence ------------------------------------------------ */5 P- W! ]: A4 C2 M2 u3 K
  5.             sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;
    6 T2 y$ P* B6 m- e
  6.             sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;
      c" k7 I1 p" z

  7. , d$ }7 @4 v2 S+ M- X
  8.             sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
    5 u$ O* G' M& h9 t) Q

  9. # f- B6 \5 f% I
  10.             if (HAL_QSPI_MemoryMapped(&QSPIHandle, &sCommand, &sMemMappedCfg) != HAL_OK). T) ^/ i# {+ C
  11.             {
    7 A( t+ e, y+ o$ e' y9 E
  12.               Error_Handler();
    1 b/ ^9 X+ g# n/ a3 G
  13.             }
复制代码
(9)执行.qspi段的代码
. ~* a% B( p1 }9 `6 ^9 v
  1. /* Execute the code from QSPI memory ------------------------------- */
    7 J5 ?9 U' v8 J1 T2 r# @
  2.           GpioToggle();
复制代码
注意  K" \2 W6 a9 @8 J; H3 ]
  1. #if defined(__CC_ARM)0 y& ?6 I5 @7 G  L
  2. #pragma arm section code = ".qspi"
    ) ^! s& U: n. H; ~
  3. #pragma no_inline
    4 \; c8 H( z2 t0 P; R
  4. static void GpioToggle(void)
    ( u+ w; p, H7 Y& J" ~' D$ a0 s
  5. #elif defined(__ICCARM__)3 X2 U8 U6 U. P6 _% @4 ~
  6. static void GpioToggle(void) @ ".qspi"
    ) |# _+ T0 c* ?3 [7 ~# d
  7. #elif defined(__GNUC__)
    7 v* B: }3 H1 C# T+ Z- V
  8. static void __attribute__((section(".qspi"), noinline)) GpioToggle(void)# P7 v3 d# h2 p5 a) ^2 _" t' P* Q
  9. #endif; {* y+ l% ^1 a( u6 B* o
  10. - H/ _' p, N  d1 `! z% @
  11. {2 A2 ]" W# k/ ~
  12.   BSP_LED_Toggle(LED1);' D2 b+ S5 D# }. Y6 X1 W$ p( S
  13.   /* Insert delay 200 ms */
    9 M; ^3 n$ P& X" m" s* [
  14.   HAL_Delay(200);+ m; a9 b4 [' z
  15. }
复制代码
5 e& J, ~8 ]2 f  L; Q1 G
我的问题:
8 A3 n" O$ d% F6 c) w学完之后,我一直对一个问题感到困惑,再用st-link烧写程序时,这个.qspi段是不是放在内部flash中,只有在执行时,MCU才会到0x9000 0000处执行,这时MCU读flash,但是对我们来说是屏蔽的,我们可以直接当内部flash使用。如果前面没有执行DMA将0x9000 0000处数据传递到flash,后面是不是就不对了。这个时候为什么0x9000 0000处会有数据呢,实际上这里并没有flash啊,希望有人能帮忙解答一下
: U% t- c5 ?' G# g) w
赞 收藏 8 评论21 发布时间:2015-9-8 22:09

举报

21个回答
feiting94 回答时间:2015-9-9 12:00:44
netlhx 发表于 2015-9-9 09:14. w& a8 O+ D1 ^& r* ?- S6 P, a; q* c
这个位置就是映射到4G空间的FLASH的地址
$ }, Z8 A0 l; B& G7 z" J* 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% u. N. x- j. y; H
我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体 ...
3 ?/ t2 W/ A3 t( ?; P9 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
# x5 ]9 _5 E1 k' l. f
支持楼主的原创分享
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
2 F$ R' M$ k" x
原来是在EEPROM的 datasheet里。。。谢谢了!
绝影 回答时间:2016-8-26 13:37:49
今天也在研究Qspi 在keil添加FLASH的界面可以添加外部的Qspi存储器,应该可以将程序下载进去3 O( O0 I* m1 X8 \  n' A
11223.png
12下一页

所属标签

相似技术帖

官网相关资源

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