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

STM32F7-discovery QSPI接口使用心得  

[复制链接]
feiting94 发布时间:2015-9-8 22:09
STM32电机培训online,大佬带你玩电机9 ^6 l# [6 b; Z+ L2 p) P7 [$ u
$ i% W; T; e$ z% p. t
FMC和QSPI引脚冲突的解决7 U7 m6 l8 L5 d+ K: \+ k
! L. ^7 c3 L% o
分享一个 QSPI N25Q256A的读写程序,支持QUAD, 4字节模式
' c& K) c8 [7 o4 q' ^" ]
+ U  @( U: h$ R7 ?/ A4 ]$ M* a8 l" l, ^5 n
1.QuadSPI接口的特点。与普通的SPI Flash接口相比,quadSPI可以接四位数据线,传输速率大大提高/ g" x7 O# `" y8 y
STM32F7的quad-spi接口有三种模式
4 P% o7 A6 q) X9 i3 i% {+ P, z' E(1)indirect mode(间接模式):所有操作都是用的QUADSPI寄存器,通常在对FLASH寄存器配置时用这种模式
; e/ u/ i6 a/ E5 }( F+ X' B(2)status polling mode(状态轮询模式):外部Flash的状态寄存器查询使用的是这种模式,如果开启中断,可以产生中断信号/ V2 C3 j( a- ?( O
(3)memory-mapped mode(内存映射模式):外部flash映射到MCU的地址空间,可以视为内部闪存,读写数据用的这种模式/ J* t1 p2 }  ]5 t6 A, s' B% z  @

" d0 d+ J# N0 YSTM32F7的quad-spi接口主要特点:
% n" e$ o4 i. H; ^(1)三种工作模式+ w- T- n& H4 j# W5 I
(2)Dual-Flash模式,可以同时接两片Flash,共用CLK和CS片选线。这样可以最多同时传输8位数据(4+4)) R, J& I7 y0 ]6 i
(3)支持SDR和DDR* i- R. \6 c" e! @( E$ q
(4)间接模式的DMA通道1 H3 ~  R; o% D. I- \, m
(5)内嵌接收和发送FIFO3 N- }/ K2 O/ p8 k4 L* V
(6)支持FIFO threshold, timeout, operation complete, access error四种中断
, u& @2 |; A( o' ^, R3 u! c* C5 C; v( {7 X/ T; Z5 ?
Quad-spi完整的命令格式由5部分组成,分别是Instruction,Address,Alternate-bytes,dummy-cycles和Data这5个阶段,时序图如图所示
" ]; X$ a) Q& s2 F, E5 U" j6 T 3.png * O7 s% O. h5 ~( N" d8 F" I
总结一下特点:, f. [. ?  X6 Z; d" H$ L: e2 m. r
(1)每个阶段都可以选择是 1bit(SO/SI线 single SPI mode),2bit(IO0/IO1线 dual SPI mode),和4bit(IO0/IO1/IO2/IO3线 quad SPI mode)传输,
7 u1 v0 _6 D+ Y9 f(2)写数据时,dummy cycle可以为0;读数据时,为了保证足够的转换时间,因为之前是写数据,现在要变成读,至少要1个dummy cycle/ X+ I9 |5 n- l
(3)这5个阶段都不是必须的,可以没有
, O0 o# W) X5 _% ~; Z(4)indirect mode模式,数据读取时通过QUADSPI_DR寄存器;memory-mapped mode模式,数据直接返回和输出通过AHB总线或者DMA
# K$ {* w# M6 I1 Q" G! N(5)SDR和DDR模式的区别:两者的instruction阶段都是CLK信号的下降沿数据传输;在DDR模式中,Address,Alternate-bytes和Data这3个阶段都是上升沿和下降沿都有数据传输
1 ]3 @3 c$ @. [/ v# X' j& B(6)F7有32-byte FIFO,可以设置threshold(阈值),接收数据数目超过该值时,FTF(FIFO threshold flag)=1
2 ^4 }  t& k) Q& G/ x3 [  g5 `# j+ V4 n

* |& X/ m6 i, Q# M6 Z* l: [6 t( k0 O" ?0 ]$ V/ S$ U
3.STM32F7-Discovery的quad-spi flash使用的是micron公司的N25Q128A系列,有128Mbit容量,后面附上数据手册,原理图如图所示9 s( b7 `# @9 ~0 [) K4 `7 G

4 v7 N3 v4 E0 M2 Y0 w: @( ^ 1.png ; g7 D8 Z+ N7 W) a. X
这里主要说明quad-spi flash代码流程分析) E+ D+ m3 p$ D) a; a
论坛可以下载STM32Cube_FW_F7_V1.1.0压缩包,我也是从里面的例程中学习的。
2 O: J8 K( }* O选择STM32Cube_FW_F7_V1.1.0/project/STM32746G-Discovery/example/QSPI/QSPI_ExecuteInPlace例程
" I' u7 e" g" M, }- l2 V(1)Flash配置寄存器初始化/ A1 _5 M2 S, Y8 b* A
  1.   /* Initialize QuadSPI ------------------------------------------------------ */
    0 U4 b) e" S! o
  2.   QSPIHandle.Instance = QUADSPI;         
    5 P3 M; z. N7 a# \: l6 @0 Z
  3.   HAL_QSPI_DeInit(&QSPIHandle);) [+ Q6 H. D1 h5 e
  4.         
    2 I$ g' C$ G& {% H& V/ ?; }
  5.   /* ClockPrescaler set to 2, so QSPI clock = 216MHz / (2+1) = 72MHz */$ o/ T' r& U5 B/ o" ~  O/ T" z
  6.   QSPIHandle.Init.ClockPrescaler     = 2;                                                                // <span style="background-color: rgb(255, 255, 255);">查阅手册可知,最大频率108MHz,这里为什么不用1呢??</span>8 V( Q" P1 T$ r/ W$ U8 a+ H
  7.   QSPIHandle.Init.FifoThreshold      = 4;                                                                 // FIFO的阈值为4bytes,
    . c/ C8 Y. K  O" @/ L; {/ E
  8.   QSPIHandle.Init.SampleShifting     = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
    4 Y5 C" u2 E' W5 N
  9.   QSPIHandle.Init.FlashSize          = POSITION_VAL(0x1000000) - 1;                         //0x1000000=16MB,
    . v+ u: d* I! _2 C8 O+ H3 h9 S
  10.   QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE;        //nCS stay high for at least 2 clock cycles between commands
    % z4 |7 O8 E3 _
  11.   QSPIHandle.Init.ClockMode          = QSPI_CLOCK_MODE_0;                                    //Clk stays low while nCS is released
    4 s1 `7 {4 w, J
  12.   QSPIHandle.Init.FlashID            = QSPI_FLASH_ID_1;                                               //选择第1片flash
    & {$ o! j0 c& ?4 U7 _0 ]% \
  13.   QSPIHandle.Init.DualFlash          = QSPI_DUALFLASH_DISABLE;$ D3 k! k" U8 V6 A0 V- v" B
  14.   
    * B! u0 E( N* k4 A
  15.   if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK)4 c% }' N3 d0 U6 j  Z* a
  16.   {
    # b- p$ l/ B0 y1 O! V# n: j5 [  n
  17.     Error_Handler();  _& Q" j4 J. f, Z6 Z
  18.   }
复制代码
(2)使能写操作6 n- D- R0 \1 v2 o" o2 J" O
  1.   /* Enable write operations ------------------------------------------ */
    6 f* {" e% f1 ]3 F1 B
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;            
    7 x/ V( v2 ]3 T+ f3 D. f# I8 G
  3.   sCommand.Instruction       = WRITE_ENABLE_CMD;5 v0 \' Y& w2 v' u0 L
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;# x" C$ y6 S* p, [6 I& _
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
    / D# y4 s7 R! E- m
  6.   sCommand.DataMode          = QSPI_DATA_NONE;
    : F! t% c; o8 m2 F& `9 S0 w8 T
  7.   sCommand.DummyCycles       = 0;
    4 j% C& N* F. S6 a$ H
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
    . `: k7 u; O1 h
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;& L" C- ?$ ~1 g# |0 y- l# `( S
  10.   sCommand.SIOOMode          = QSPI_SIOO_INST_EVERY_CMD;1 u7 ^- V' c2 Q' C# q  D

  11. , l7 H4 @( j5 O; l0 m
  12.   if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    0 i5 G9 x* o# _. }) H! p: H
  13.   {
    * ^- H3 e( j" g$ P+ D, a; X( N: n
  14.     Error_Handler();' T- G- ~* k# N2 Y# ?. y0 }$ M
  15.   }
    ! M$ d6 t7 _7 h( `) |; l
  16.   3 }4 F, B4 O" s7 d
  17.   /* Configure automatic polling mode to wait for write enabling ---- */
    % _1 e5 M4 Q6 z' N4 v/ E
  18.   sConfig.Match           = 0x02;# L& @4 H1 ^% ^6 c
  19.   sConfig.Mask            = 0x02;4 A* I2 a7 R" D  Z. a
  20.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    - {8 `! d+ Y) o/ P
  21.   sConfig.StatusBytesSize = 1;
    + s  t6 d: G  \7 n! t' |. I: b
  22.   sConfig.Interval        = 0x10;
    ! C2 I9 L! l: s" o' t) F* S8 d
  23.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;  n$ V+ a7 A$ f
  24. : Q' j; j$ p) |+ ~; `0 @9 Z7 b
  25.   sCommand.Instruction    = READ_STATUS_REG_CMD;
    5 ?9 i( }4 P" Y$ t2 b& S. T
  26.   sCommand.DataMode       = QSPI_DATA_1_LINE;8 @8 A+ `* x1 b( g
  27. : H  \  d' ^6 U# z4 l0 [/ T/ X; ^4 Y
  28.   if (HAL_QSPI_AutoPolling(&QSPIHandle, &sCommand, &sConfig, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)
    ' Q7 D+ H6 R3 ]. x7 ], y
  29.   {' l* I8 v' g& i: Q0 l
  30.     Error_Handler();
    # U0 V' ?0 a. `/ A% g- M
  31.   }
复制代码
首先使用indrect mode,使用1bit instruction传输,命令是 WRITE_ENABLE_CMD,无其他4个阶段9 C+ H! G$ s9 W8 m8 }; P+ l0 L
源码中定义   #define WRITE_ENABLE_CMD                     0x06;! R0 k4 ^0 h& Z& D, u
这里要查阅芯片手册. o/ @+ T5 v/ Q/ j2 @9 G" o2 ~# w
5.png
6 E$ v' I5 h. |: C' J5 ~8 h! K; j确实是一致的。
$ l7 t" {+ @6 o接着使用automatic polling mode,命令是READ_STATUS_REG_CMD,读status register: f. [; {' ^" W9 ]$ @- c
automatic polling mode有如下功能,它将查询的得到的值和设置的Match值比较,只比较Mask中bit=1的位,设置可以为AND或者OR模式,
  r, U" F% t9 T; U4 _查阅手册:
; N1 `6 d; c  @% j* C
* U1 d; g  L" k+ }; E/ F7 k 6.png 9 S% I& J/ K* r* r2 c
确实是bit1,即mask=0x02,当该位为1时,说明写使能,故match=0x02;
) a& I2 A1 P8 H! {/ w(3)擦除flash的第一个sector1 p- f( u' [, t8 H$ j! ?' {9 g
  1.         /* Erasing Sequence -------------------------------------------------- */
    4 ?/ o# B2 X" D  z" u/ i  U# `
  2.         sCommand.Instruction = SECTOR_ERASE_CMD;   //块擦除,64KB one sector$ b' e* O' {: z1 l4 t
  3.         sCommand.AddressMode = QSPI_ADDRESS_1_LINE;
    % `" E# B7 ?  t" y$ K
  4.         sCommand.Address     = qspi_addr;                          //qspi_addr=0
    5 e9 b6 Q3 t4 d' x- N. F: `' f+ s
  5.         sCommand.DataMode    = QSPI_DATA_NONE;% @& q& k* T2 @9 r
  6.         sCommand.DummyCycles = 0;
    2 Z) j% @# @' q2 N0 H# @

  7. 1 N) P6 K3 }& G& {$ F
  8.         if (HAL_QSPI_Command_IT(&QSPIHandle, &sCommand) != HAL_OK)/ {1 B# C: r; x$ }: c) I, x
  9.         {" w  Z5 U7 P( S
  10.           Error_Handler();
    % F: D0 T: p0 Z, h7 @
  11.         }
复制代码
(4)等待擦除完毕,使用automatic polling mode查询,这里还是读status register,但读的是bit0位,而且预期值bit0=0;查阅手册
) ~% o. D' l2 _7 D7 `3 k, T 7.png
8 C, [6 p: C2 d
  1.   /* Configure automatic polling mode to wait for memory ready ------ */  
    & d' [/ Q2 d! j* q
  2.   sCommand.InstructionMode   = QSPI_INSTRUCTION_1_LINE;2 m, }# R, s  T# ?
  3.   sCommand.Instruction       = READ_STATUS_REG_CMD;7 j+ S# u! Z0 c6 s) N
  4.   sCommand.AddressMode       = QSPI_ADDRESS_NONE;) \  v9 t( n9 ?" j  x; R! ?
  5.   sCommand.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;
    & R6 S; {3 C  {! f# m4 K
  6.   sCommand.DataMode          = QSPI_DATA_1_LINE;
    : r+ S9 ]) X0 C3 e( P6 F1 y
  7.   sCommand.DummyCycles       = 0;- i% F) K- N  g0 q% E4 b9 P
  8.   sCommand.DdrMode           = QSPI_DDR_MODE_DISABLE;
    ( {1 X7 d4 O5 T; a
  9.   sCommand.DdrHoldHalfCycle  = QSPI_DDR_HHC_ANALOG_DELAY;
    3 Z" ~. f  y* R) N
  10.   sCommand.SIOOMode         = QSPI_SIOO_INST_EVERY_CMD;8 `+ k; a% Y$ ?% Q6 A

  11. ! V; c) p' f2 m9 O- _. ^8 ?& n( v
  12.         //bit0:write in progress 0:ready 1:busy ! C6 z+ g0 T+ n# h* ~
  13.   sConfig.Match           = 0x00;
    / f' {# S  f7 n! |
  14.   sConfig.Mask            = 0x01;; A! X% T& ~) P6 ]
  15.   sConfig.MatchMode       = QSPI_MATCH_MODE_AND;
    3 Z: l1 F* k1 k% B" @9 `
  16.   sConfig.StatusBytesSize = 1;( u3 |# }6 F; p& [8 m8 |
  17.   sConfig.Interval        = 0x10;
    4 Y( _4 e3 [) g
  18.   sConfig.AutomaticStop   = QSPI_AUTOMATIC_STOP_ENABLE;  w8 g3 l" X, q8 M0 k
  19. ! u* n, I* N7 x, d  p
  20.   if (HAL_QSPI_AutoPolling_IT(&QSPIHandle, &sCommand, &sConfig) != HAL_OK)$ l7 O9 j6 w, y- H3 c: }; V
  21.   {
      P! _4 h& j2 y6 h. M( ~2 D
  22.     Error_Handler();8 h; O; P! l5 l
  23.   }
复制代码
(5)写使能并且写数据8 c1 L: \5 {: p! F
  1. /* Enable write operations ----------------------------------------- */
    - P: J% g0 x& G' h/ ?9 [" J
  2.           QSPI_WriteEnable(&QSPIHandle);/ y" Q/ h6 ^( \" F7 c% X: `

  3. 3 @4 K# Q* [0 W
  4.                                         //QUAD INPUT FAST PROGRAM Data In:DQ[3:0];Address In:DQ0; g7 ?/ S1 ~( s6 S
  5.           /* Writing Sequence ------------------------------------------------ */
    7 s2 U; A! v% c  ]0 z! q* F; x
  6.           sCommand.Instruction = QUAD_IN_FAST_PROG_CMD;
    9 t/ P/ W7 a5 b3 g1 N$ t
  7.           sCommand.AddressMode = QSPI_ADDRESS_1_LINE;* a1 d# S( C) P/ k, S
  8.           sCommand.Address     = qspi_addr;                                              //qspi_addr=0# e6 q3 ^  H  S# Y; ?
  9.           sCommand.DataMode    = QSPI_DATA_4_LINES;
    . Q6 Z6 L  T7 {- P8 U- y, J- J4 |' s
  10.           sCommand.NbData      = size;                                                         //size = QSPI_PAGE_SIZE = 256  [6 ]: M! b: D& X0 |& h1 M& {

  11. 8 u1 y+ X. \+ i
  12.           if (HAL_QSPI_Command(&QSPIHandle, &sCommand, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK)6 P& }' q1 p' r* x6 j& K
  13.           {
    " E4 X; ^. o  H2 E2 D9 x/ ?
  14.             Error_Handler();$ V, q, ?- y3 }+ D7 g
  15.           }. \5 U! [* C- w# B: U

  16. - @0 d$ h6 j6 z; V' o
  17.           if (HAL_QSPI_Transmit_DMA(&QSPIHandle, flash_addr) != HAL_OK)         //flash_addr = (uint8_t *)(&Load$QSPI$Base);0 f- `' `  B( o* {* a7 }
  18.           {
    ) s& X; `' K: _( I
  19.             Error_Handler();
    . @1 G0 N+ w  ^$ t4 b9 X6 i
  20.           }
复制代码
看到这里就不得不提一下scatter file文件/ ]; `% {$ w" _9 m
8.png ( S7 [0 f, C: _! o( j7 D
打开这个文件,STM32746G-DISCOVERY.sct
( K! U2 p; j* n- Z
  1. ; *************************************************************
    " U7 C- F" v6 O) `, O  l
  2. ; *** Scatter-Loading Description File generated by uVision ***2 E0 _0 Q6 H  `- Q0 V
  3. ; *************************************************************% }: m  z, `; }6 M9 t; _/ P2 C
  4. ' G3 b6 }+ R2 Z) Y7 @( \+ N2 L* \+ P
  5. LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
    : Y9 X! s: e3 A2 V
  6.   ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address3 I" n# a' w+ C. ?9 q& @
  7.    *.o (RESET, +First)
    : k# d' B( l8 H1 g0 q$ H
  8.    *(InRoot$Sections)" V' ?8 l- m0 [# ]
  9.    .ANY (+RO)
    ) {2 h. a9 Q1 K
  10.   }
    $ \0 b& z  f- W5 h. z
  11.   RW_IRAM1 0x20000000 0x00050000  {  ; RW data
    8 r, n; ?! Q+ l2 W' Q
  12.    .ANY (+RW +ZI)
    1 R0 r* r3 @' S6 O
  13.   }/ g5 v: M; h* X+ Y
  14.   QSPI 0x90000000 0x00100000  {# i  Q1 ?% P. ]- o) B1 r
  15.    *.o (.qspi)
    ) h. |& Z# Z! u! i2 I3 N. j
  16.   }
    ; {% n& z" D. B- q. n* ]
  17. }
复制代码
可以看到和一般的scatter file(分散加载描述文件)相比,多了一个QSPI执行域,4 H$ v# t1 A: I5 _- N+ l
学过的都知道,这里表示链接时,将所有目标文件的.qspi段放在QSPI执行域,
- j3 Q" Z# F* i8 _; `( q" K再看一下F7的内存映射
( v- V4 Q/ a7 e1 l 9.png
( {& Z/ _/ b  H$ [* k9 P在0x8000 0000到0x9FFF FFFF有一个Quad SPI,这就是memory-mapped mode的由来。0 A. Q/ q# P- \  ~& d" @6 Z+ y
因此上面flash_addr = (uint8_t *)(&Load$$QSPI$$Base) = 0x9000 0000; DMA传输就是将 0x9000 0000处开始的size = 256bytes的数据传递到flash,模式是indrect read mode : t- f; E$ ?, f  n
(6)判断传输是否完成,判断的方法同步骤4
; r, V! L. z9 g( K0 C" v& m(7)重复5、6步直到传输完max_size = (uint32_t)(&Load$$QSPI$$Length)=  0x00100000 & c6 v, w7 e4 N* o
(8)设置dummy-cycle的值,配置为memory-mapped mode,命令是 QUAD_OUT_FAST_READ_CMD=0x6B,就是说映射完后,相对于内部flash+ P9 L; K" {' s! p3 f
  1. /* Configure Volatile Configuration register (with new dummy cycles) */! Y5 o9 ?% `2 K3 b! X3 |  P# J
  2.             QSPI_DummyCyclesCfg(&QSPIHandle);" ^7 r) [  u& s

  3. ; V4 y6 M" @' d/ ?
  4.             /* Reading Sequence ------------------------------------------------ */
    4 a2 e0 j7 J& g$ J  V6 h- I
  5.             sCommand.Instruction = QUAD_OUT_FAST_READ_CMD;
    , y  n$ S+ [5 k% Y) A% }, t
  6.             sCommand.DummyCycles = DUMMY_CLOCK_CYCLES_READ_QUAD;9 E5 K9 k1 c+ v& ^* T

  7. 3 F8 a, O- B( W3 c
  8.             sMemMappedCfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;6 x! h, R' v8 \9 ]0 z! f

  9. ' M" Y" H; u  ], V/ O3 Q
  10.             if (HAL_QSPI_MemoryMapped(&QSPIHandle, &sCommand, &sMemMappedCfg) != HAL_OK)0 y. a9 B4 S! U8 K  T
  11.             {9 s2 f# }1 b' Y- ^
  12.               Error_Handler();$ q" S3 h7 U5 r' L
  13.             }
复制代码
(9)执行.qspi段的代码
, Z, Y7 V$ R& Q9 @5 w
  1. /* Execute the code from QSPI memory ------------------------------- */
    6 P+ m! i: ?0 [& w/ W
  2.           GpioToggle();
复制代码
注意
8 S# ]. n; I+ T6 M& y% d6 [
  1. #if defined(__CC_ARM)$ j5 N& m& f& e0 a3 S- R
  2. #pragma arm section code = ".qspi": b% B" Q0 l+ p/ `0 w4 R, e
  3. #pragma no_inline& t& A% K& j; j2 d( d% d
  4. static void GpioToggle(void)3 s- F' U& b& W/ y  n5 _) O
  5. #elif defined(__ICCARM__)
    : c. X% ~$ ]; Y% M$ ^, ~
  6. static void GpioToggle(void) @ ".qspi"
    % G! `) P0 j# v- K. n( o- d
  7. #elif defined(__GNUC__)5 @1 J$ h( `  n: B: d9 F5 {: i
  8. static void __attribute__((section(".qspi"), noinline)) GpioToggle(void)6 B% X- G/ w2 w
  9. #endif
    & Q! }. Z% g" |* g
  10. 6 D* z- l: E. {5 F' T
  11. {
    & v" g/ A) j" x/ p( p8 A
  12.   BSP_LED_Toggle(LED1);
    7 a' p4 F3 p1 B+ b8 K8 i+ f
  13.   /* Insert delay 200 ms */
    & c1 v1 _! D! ~/ t: A$ l
  14.   HAL_Delay(200);, X- G) _: v. p' j
  15. }
复制代码
9 U: q) {& V, x
我的问题:
, Z9 O+ d9 G" q& N& W" N7 G$ S( }学完之后,我一直对一个问题感到困惑,再用st-link烧写程序时,这个.qspi段是不是放在内部flash中,只有在执行时,MCU才会到0x9000 0000处执行,这时MCU读flash,但是对我们来说是屏蔽的,我们可以直接当内部flash使用。如果前面没有执行DMA将0x9000 0000处数据传递到flash,后面是不是就不对了。这个时候为什么0x9000 0000处会有数据呢,实际上这里并没有flash啊,希望有人能帮忙解答一下9 B) Z2 R8 l- I5 Z5 s" a
收藏 8 评论21 发布时间:2015-9-8 22:09

举报

21个回答
feiting94 回答时间:2015-9-9 12:00:44
netlhx 发表于 2015-9-9 09:14
3 X7 }' g5 U6 o" @% s这个位置就是映射到4G空间的FLASH的地址

$ Z- v# b4 S* m) P' @6 j" a请问一下,这个位置实际上并没有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: v! t( V5 j9 ~( e
我想问一下,WRIRE ENABLE这些参数的说明是那份文档,我最近做F446,但是user manual没有Instruction的具体 ...
, k$ `, w( R( O, T+ \% _) }6 u" X
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
" e! ?3 r. }9 h0 m$ v
支持楼主的原创分享
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
6 k; ]2 q( m# O. K* S
原来是在EEPROM的 datasheet里。。。谢谢了!
绝影 回答时间:2016-8-26 13:37:49
今天也在研究Qspi 在keil添加FLASH的界面可以添加外部的Qspi存储器,应该可以将程序下载进去
9 w% w4 C% `# m+ E 11223.png
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版