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

【HAL库每天一例】第046例: SPI-串行Flash

[复制链接]
haohao663 发布时间:2016-6-20 08:57
本帖最后由 haohao663 于 2016-6-20 15:20 编辑
* b$ T1 Q6 `- c/ a$ u5 Z- P& e
6 v; }5 ]# i% y$ z3 a8 ]. N' p【HAL库每天一例】系列例程从今天开始持续更新。。。。。4 W, {( Q7 Z: M5 W* y
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
7 L- V$ o; l  _, j! M9 j/ ]该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
# y: \3 V' s% G& v: q* a同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。* n. J/ S8 g  M
例程下载:
% N8 ~7 G5 i- `+ c" ^, j! h- I! o资料包括程序、相关说明资料以及软件使用截图
/ e0 J: v& M% Y链接:https://pan.baidu.com/s/1i574oPv 9 C3 T& y4 ]1 W" ]! M
密码:r3s3
# {" ?, a# _$ T4 c; N! l
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-046. SPI-串行Flash
& w5 \7 S! d% U5 p+ l
/ V. _8 p8 j2 M2 {/**
6 d8 z, o" Y. Z! d* Q2 I' \% C  ******************************************************************************
. r9 P4 ]. u% o- l, l* V3 [0 a  *                           硬石YS-F1Pro开发板例程功能说明
; [! o$ h0 Y# p3 h  *, P, c6 V7 t$ T. ^* W, F/ x/ f
  *  例程名称: 1. 串行Flash读写测试$ [& E& B+ b5 n% r, @0 K
  *   
6 o- I) o9 |% U$ l7 X" {  ******************************************************************************
; c2 |5 p7 f, A( i- ]  * 说明:
1 V. X2 f2 F) \  * 本例程配套硬石stm32开发板YS-F1Pro使用。3 S" o9 I  @+ x& v$ ^
  * ; j4 s: _; }; C& o' I; j# h) w( N
  * 淘宝:9 u! O: I* ^  I8 y4 d& ^. C0 H
  * 论坛:www ing10bbs com$ _( d1 m8 s$ a3 F) n( [; v2 C
  * 版权归硬石嵌入式开发团队所有,请勿商用。4 T+ i! G$ \% k
  ******************************************************************************
/ J8 F% S" x8 k5 r: A$ R0 m  */5 x8 L0 F# F) {9 n( J
9 S1 y4 ?# `7 L, Q' x, d
【1】例程简介6 v. l3 _8 ~2 f- T! u7 k
  串行Flash用于存储数据。YS-F1Pro开发板集成了一个16M字节的W25Q128串行Flash芯片,可以
! C! [4 n* B6 r% @3 X5 J/ C0 e- D2 g用于存放数据。该芯片使用SPI1通信接口。. s# g: H: @" f6 r9 o+ S
  ( a; r3 |$ H; k5 E
【2】跳线帽情况
. v0 b4 J. A1 o- D  ^  l******* 为保证例程正常运行,必须插入以下跳线帽 **********
) |/ ?$ O% S: h; C% T丝印编号     IO端口      目标功能引脚        出厂默认设置
+ e& Y2 D: b9 B* ^7 O  JP1        PA10        TXD(CH340G)          已接入/ y% [; Y/ U- ~* `6 O) ~! s
  JP2        PA9         RXD(CH340G)          已接入6 T6 U; b0 T4 z7 d- K
  JP3        PB0           LED1               已接入
( _( L7 R7 R2 g$ E* s  JP4        PG6           LED2               已接入
' ]2 d" ?3 S* l3 A( ~  JP5        PG7           LED3               已接入
% @$ ~" J& g  m  a- a  
- E1 T& _  p4 S, Q【3】操作及现象
" f9 ?" e( T" f- J  p) D' M' Q5 k 使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱* u$ h* D8 W. ]( a* n
动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试
) o! j) J" {' c) D5 O助手窗口可接收到信息。只有LED1灯亮说明串行Flash读写测试正常。
" p" x. A" c# C- J+ B( W' \$ Q2 m9 P0 L$ s. k* _! g1 x
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

( j# B4 E4 p- e8 e, K5 }: |: m& T# B CubeMX_1.jpg 0 B8 h$ a, S1 ?" T
CubeMX_2.jpg
3 B/ _7 X, }$ r: g& Y CubeMX_3.jpg : |0 K+ E" z: l
CubeMX_4.jpg
% G  ^8 e. v$ Z2 L+ S' o9 n# N9 \0 ]  p( O3 e
/ |% c4 e: p& F6 {# Z' b7 w
  1. #ifndef __BSP_SPIFLASH_H__6 a! w. L6 |+ _2 z
  2. #define __BSP_SPIFLASH_H__
    1 J  ?! v7 g$ k

  3. 8 V  q( g4 T8 t/ e
  4. /* 包含头文件 ----------------------------------------------------------------*/
    9 P7 D7 Q: W2 v8 T0 L! Q$ \3 y+ d
  5. #include "stm32f1xx_hal.h"
    : q4 U) @3 Z1 l) h2 O+ ^
  6. 2 G3 J. J4 Y# ]- _$ a  F* W2 S( v
  7. /* 类型定义 ------------------------------------------------------------------*/
    / ]) M' `0 {7 n9 E9 ?) z, B4 r6 W
  8. /* 宏定义 --------------------------------------------------------------------*/
    0 W1 ]$ r  G+ x- T
  9. //#define  SPI_FLASH_ID                       0xEF3015     //W25X16   2MB" `9 f  X% I; x/ D! B+ ?
  10. //#define  SPI_FLASH_ID                       0xEF4015           //W25Q16   4MB  ^3 J$ l' S  [* S$ ^2 F
  11. //#define  SPI_FLASH_ID                       0XEF4017     //W25Q64   8MB
    4 P* j8 {  [/ k; k- ^# V2 E% @
  12. #define  SPI_FLASH_ID                       0XEF4018     //W25Q128  16MB YS-F1Pro开发默认使用
    . r5 ?- h, V/ A  F( M0 L. y

  13. ) K$ q0 ^8 G/ A
  14. #define FLASH_SPIx                                 SPI1
    : M: r6 H6 L: r; i4 Y. X1 q& \+ {) O
  15. #define FLASH_SPIx_RCC_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()6 U) ~, y# [! f  Q6 n; p% E
  16. #define FLASH_SPIx_RCC_CLK_DISABLE()               __HAL_RCC_SPI1_CLK_DISABLE()
    3 @8 E# J6 F) s7 Y# H: p/ E

  17. 3 F) s2 ?4 d% {* S9 ]: g
  18. #define FLASH_SPI_GPIO_ClK_ENABLE()                __HAL_RCC_GPIOA_CLK_ENABLE() / A- v1 ~, Y2 C1 w7 ^' h7 f! C
  19. #define FLASH_SPI_GPIO_PORT                        GPIOA" n/ O* d4 e' R3 `# I! F' H# Z7 L# }* V
  20. #define FLASH_SPI_SCK_PIN                          GPIO_PIN_5: e- B4 A. y/ k
  21. #define FLASH_SPI_MISO_PIN                         GPIO_PIN_67 U% l- H( \5 E' p- U2 k
  22. #define FLASH_SPI_MOSI_PIN                         GPIO_PIN_7
    0 _. u  a0 u4 \$ v2 ]

  23. 0 C( ?* N2 r& G5 P% j
  24. #define FLASH_SPI_CS_CLK_ENABLE()                  __HAL_RCC_GPIOA_CLK_ENABLE()    . R0 F, N& ~6 i2 K
  25. #define FLASH_SPI_CS_PORT                          GPIOA6 b/ p9 j) L9 v! @: F$ Y
  26. #define FLASH_SPI_CS_PIN                           GPIO_PIN_4
    2 Y% `" F# X: k+ p
  27.   b: @; e8 f# C1 ~/ V
  28. #define FLASH_SPI_CS_ENABLE()                      HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_RESET)7 h9 h: o  @+ r7 V+ e- h
  29. #define FLASH_SPI_CS_DISABLE()                     HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_SET)) }) |+ r- l" R
  30. 5 g4 ~8 ?6 e4 ?# T8 J+ K
  31. /* 扩展变量 ------------------------------------------------------------------*/
    ! S( |" ~. A3 o' i. Y
  32. extern SPI_HandleTypeDef hspiflash;
    " m* L* K0 ^  z. J% A0 _- D
  33. * Z: e- Z/ W) K" d
  34. /* 函数声明 ------------------------------------------------------------------*/( [' j) [& ?: w% U

  35. 5 q# k: Y% O1 N3 F$ Q' w" J7 a
  36. void MX_SPIFlash_Init(void);
      _/ N0 Y% s1 y6 `( g& v! n
  37. void SPI_FLASH_SectorErase(uint32_t SectorAddr);$ M0 @4 |0 x# i" r
  38. void SPI_FLASH_BulkErase(void);
    : }7 Q- c, l( M' Z. ^! Q' O0 c' G% I
  39. void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
    ) B7 e% z1 l, ^; p
  40. void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
    $ t* f7 ~- N0 H. [# ]
  41. void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
    + r( r! {6 H$ Z/ D8 `" n0 Z9 S
  42. uint32_t SPI_FLASH_ReadID(void);
    ( e: i: T7 `9 H$ }
  43. uint32_t SPI_FLASH_ReadDeviceID(void);
    2 y1 e& Z; i) h2 v* {
  44. void SPI_FLASH_StartReadSequence(uint32_t ReadAddr);* o6 E) y4 ^, e+ \
  45. void SPI_Flash_PowerDown(void);
    1 I+ b  A8 B' a" ^5 I
  46. void SPI_Flash_WAKEUP(void);9 X: X7 e, A0 B6 Z4 @9 l* P' J1 c+ x
  47. ( ~# I# {" C3 b/ `# W$ l( L
  48. uint8_t SPI_FLASH_ReadByte(void);
    ! N0 C# G- v0 `1 P) h  c
  49. uint8_t SPI_FLASH_SendByte(uint8_t byte);  V6 @+ M  |+ @- [5 w, M: Y
  50. void SPI_FLASH_WriteEnable(void);
    5 S/ m5 P! T" g2 Z
  51. void SPI_FLASH_WaitForWriteEnd(void);9 R7 |% ~8 A6 c
  52. / J/ y+ B0 R/ M
  53. #endif  /* __BSP_SPIFLASH_H__ */
    4 E8 T1 ~8 l- z, m1 N( T
  54. ) y; O; d9 B" M
  55. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/* v1 ^) V7 q0 ^* p
复制代码
+ O1 b3 K5 c, }7 y7 a

$ H" x* n9 b! L( I3 c' ~5 A2 H8 ~9 G
  1. /**3 l& ?) x+ c& u8 f# y: Y" p: I
  2.   ******************************************************************************
    ( q2 M  P$ r2 Y* K
  3.   * 文件名程: main.c
    + u* @6 Y% j$ d) r# S
  4.   * 作    者: 硬石嵌入式开发团队" M2 P: m& K0 v
  5.   * 版    本: V1.0
    6 U! {, G* d9 Q' p0 u
  6.   * 编写日期: 2015-10-04
    / F; \5 R& q& {* }$ Q* F7 r  N
  7.   * 功    能: 串行Flash驱动实现、读写测试
    ( I) N% B' v- N) t3 R
  8.   ******************************************************************************8 e6 @# A' z" i# |6 F0 S3 P
  9.   * 说明:: i* m1 R$ {% Q: ~/ n2 j% y
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。* ?. `' W8 a( ^- P% u0 p/ g
  11.   * % _, e3 `; S1 c) X2 t
  12.   * 淘宝:* L2 H$ V7 R7 K7 T. g/ d5 B
  13.   * 论坛:http://www.ing10bbs.com+ m+ B& Y1 T' e) J2 n, u
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。% e- z+ p6 E5 J& y1 E: Z8 \7 B  m
  15.   ******************************************************************************
    4 Q: a+ ]& f% w& C
  16.   */; T7 w9 v& J, }) C% |
  17. /* 包含头文件 ----------------------------------------------------------------*/9 O6 @+ \& z5 U! J, D( `
  18. #include "stm32f1xx_hal.h", N# S; Z7 j' ?' [
  19. #include "usart/bsp_debug_usart.h"
    ) N+ ?+ s5 w- `' m8 b' @) p% A, e5 y
  20. #include "spiflash/bsp_spiflash.h"  W5 |# L+ ~$ O# r' v9 q: b) H% J
  21. #include "led/bsp_led.h"; k/ P# P1 G' L

  22. ' Q% {) w- ?2 s; @
  23. /* 私有类型定义 --------------------------------------------------------------*/
    3 m; G3 Q* M/ F$ f+ L, x( m+ @3 A) c
  24. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;# d5 L& n( X$ m4 D. U
  25. 8 K  k# K" L% ]. s! _+ G
  26. /* 私有宏定义 ----------------------------------------------------------------*/
    ! C- D' B/ x% |
  27. /* 获取缓冲区的长度 */4 Y' Y2 u$ b! e! m# y
  28. #define countof(a)      (sizeof(a) / sizeof(*(a)))
    3 p+ E& D% X, v" [' J
  29. #define TxBufferSize1   (countof(TxBuffer1) - 1)
    " m9 n: F# j0 `& H
  30. #define RxBufferSize1   (countof(TxBuffer1) - 1)
    ! l% ^0 @' F* r6 r6 J
  31. #define BufferSize      (countof(Tx_Buffer)-1), m; B5 E! J" t$ ^. P1 a1 u7 K

  32. , \1 B1 H4 C. `2 B: W. X* q, ]: E2 ]
  33. #define  FLASH_WriteAddress     0x00000
    , \2 r" h8 `6 A2 I! ]+ n
  34. #define  FLASH_ReadAddress      FLASH_WriteAddress
    1 R, C# |! X% T
  35. #define  FLASH_SectorToErase    FLASH_WriteAddress
    1 p- |4 F3 l: o/ y5 |1 @

  36. 1 E% G9 r+ M/ F
  37. /* 私有变量 ------------------------------------------------------------------*/- D  S- P2 C% y% ?# x
  38. uint8_t Tx_Buffer[] = " 感谢您选用硬石stm32开发板\n今天是个好日子";5 b# K6 t* |  q9 C" d" r7 ]# q
  39. uint8_t Rx_Buffer[BufferSize];
    ! P& D6 V/ j% a- `

  40. 7 e+ A) `8 p. V5 K; Z, c) b
  41. __IO uint32_t DeviceID = 0;9 f' u+ y& C- s1 }5 q" K
  42. __IO uint32_t FlashID = 0;0 X& E. l7 H% x9 l
  43. __IO TestStatus TransferStatus1 = FAILED;
    ) C/ J. l2 K8 M

  44. / q% j1 g8 W' Y7 f
  45. /* 扩展变量 ------------------------------------------------------------------*/0 K' Y: V. e* _6 u6 [
  46. /* 私有函数原形 --------------------------------------------------------------*/
    ( [. l" W3 p3 s( N/ V
  47. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
    , C4 V& Y% @( s) k3 c6 B9 g

  48. + A  h; Y. r0 ]9 k5 E- I/ t
  49. /* 函数体 --------------------------------------------------------------------*/
    * ^" M2 r0 @1 D$ P! M. y9 k
  50. /**+ T  _3 n" Q$ S6 Q# @5 S: t
  51.   * 函数功能: 系统时钟配置% t% ]) Z( W, L
  52.   * 输入参数: 无
    & ]8 j/ ]( ]* ]
  53.   * 返 回 值: 无3 |/ h  t5 H2 b, ], L2 q# ~- W
  54.   * 说    明: 无
    . h' A9 G0 ?. v/ f5 ]# {: Q
  55.   */5 [5 p. J! H, D5 n2 q
  56. void SystemClock_Config(void)2 {) z$ }" H& Q& A8 P
  57. {
    6 n$ {3 ]2 q. M  k' s
  58.   RCC_OscInitTypeDef RCC_OscInitStruct;& r* r; c. }" Q; T. s+ k
  59.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    # }! m# [" H* J$ T; z/ n

  60. 2 H' R3 l4 o6 T% X$ V+ i
  61.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz6 s6 h" X9 h9 \  c6 l
  62.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;+ O5 s( y- g  w* R& a, O, B
  63.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    3 ?  X7 |" Q8 W1 A" V
  64.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    ! q7 y/ v2 w8 \# [5 M2 Y0 U
  65.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;7 z( k: V1 I, W3 r3 Y, r
  66.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
    ) |/ f9 d" F" V, ^- I  _0 g. E
  67.   HAL_RCC_OscConfig(&RCC_OscInitStruct);
    1 X0 S4 [9 P$ ]4 [  l

  68. ! |7 q: [0 ]/ |2 P: D/ `
  69.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK  k% L+ x7 |8 Y1 K6 x+ c0 w
  70.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;$ o' Y7 N% f; e8 [# m- }6 W
  71.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
    + U) Y" r2 [. m! ^+ b
  72.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
    / h7 I" Z7 X1 B& j
  73.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz
    * x+ O2 v" a6 }
  74.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz( O1 Y3 a9 `+ b" w% f6 |" h* T
  75.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
    2 g0 w/ t6 B/ y2 p: \

  76. $ [# Q1 P& L% X3 G
  77.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次, X8 S  W5 Q3 h: K
  78.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次
    9 c( y8 i3 V7 P* q* X" a
  79.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次: {5 T8 y* x' g8 D. W
  80.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器1 G5 f; j4 t1 C2 q& A
  81.   /* 系统滴答定时器时钟源 */& D! Q) D) j) x4 _3 {: u
  82.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    : {. }! r' d1 ~. |3 Y* O: @" K
  83.   /* 系统滴答定时器中断优先级配置 */1 H- P* D- [6 p* V+ C' j
  84.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);: f, a# P3 U2 }& ]9 A/ t
  85. }
    7 Y: x) U, p2 P1 Y; `* s
  86. ' u" J( j. I1 u# Q/ ?1 I1 p
  87. /**
    0 |! X' `  ]" q$ n& h! m. \
  88.   * 函数功能: 主函数.( \* B; z- W' r8 V
  89.   * 输入参数: 无
    2 ?) n: {3 U/ c) B) D% E, }
  90.   * 返 回 值: 无+ T5 _- l6 r4 m9 t: ^  j- b
  91.   * 说    明: 无
    ! R/ {7 `) _. C& ?6 o& a& q9 e: h
  92.   */
    3 W  u. m* @% x
  93. int main(void)9 ^  p7 R4 o0 O  Q/ Y0 M1 y6 x% D& Z
  94. {  7 z, _* U& v3 `
  95.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
    0 ^9 B3 n& s8 V, y# q8 J0 ]) l5 [6 U
  96.   HAL_Init();
    ' F# e7 t& m  @( \4 M! B8 _
  97.   /* 配置系统时钟 */
    + z. M/ y3 O, n7 I
  98.   SystemClock_Config();  m$ c, {( }$ a( v+ u/ V9 C

  99. ; U; \9 G9 N; v
  100.   /* LED灯初始化 */
    & I1 S1 T4 r$ j- L$ S9 M' y
  101.   LED_GPIO_Init();
    1 w" M! i( _9 v: q$ n- B
  102.   ( ~6 A4 }) f, P) w: c" S# m% u: C
  103.   /* 初始化串口并配置串口中断优先级 */
      u7 C0 B! N' j7 o# ?6 J% c
  104.   MX_DEBUG_USART_Init();
    * k. k* a& c2 a/ v/ Z1 ~* R, ~( i
  105.   /* 调用格式化输出函数打印输出数据 */3 A) F. z! w" ~3 h7 f+ ]- M
  106.   printf("这是一个16M byte串行flash(W25Q128)读写测试实验\n"); * G/ q+ A2 m- s9 c7 B
  107.   
    , z, o# w9 v* Y# \) Q: E
  108.   MX_SPIFlash_Init();
    , [$ R0 C; n: ?0 v& L) d1 I4 `
  109.   
    ! @$ }( z; I. f8 M
  110.   /* Get SPI Flash Device ID */  V* j& W% [% @8 W  }* M: t
  111.         DeviceID = SPI_FLASH_ReadDeviceID();
    - ~" Z6 K* _+ f  {
  112.   
    6 T2 x. n% Y+ W0 ^2 F& h+ W
  113.   HAL_Delay(100);7 }: m9 k% t( {& v* W& L% }$ C
  114.   
    ) [2 O& _0 J1 g, l* W) `
  115.   /* Get SPI Flash ID */9 B6 B# e, F! v% r
  116.         FlashID = SPI_FLASH_ReadID();
    : |* `) j7 |; N9 Y
  117.   
    1 A2 ]& [( Z  p; i5 F. k
  118.   printf("FlashID is 0x%X,  Manufacturer Device ID is 0x%X\n", FlashID, DeviceID);
    ( ?) C0 X9 O7 c8 |
  119.         " A; `7 f% [: u8 X8 s$ U* s
  120.         /* Check the SPI Flash ID */6 |+ r" F$ [9 I' @& ?, Z
  121.         if (FlashID == SPI_FLASH_ID)  /* #define  sFLASH_ID  0XEF4018 */" p1 Z5 r6 g) t: S0 H3 E
  122.         {        
    + d0 @% y$ [4 r1 n# R
  123.                 printf("检测到华邦串行flash W25Q128 !\n");
    6 Q& A+ b8 h8 U" U4 Y6 S/ T
  124.                 $ c; o6 G6 N6 \+ I) [5 l
  125.                 /* 擦除SPI的扇区以写入 */
    / ?2 u1 l1 D/ B# f
  126.                 SPI_FLASH_SectorErase(FLASH_SectorToErase);                  3 P# l) Z# y6 c2 n4 O: V
  127.                 9 }- D6 }" A# @3 N
  128.                 /* 将发送缓冲区的数据写到flash中 */         ! M) r1 S) q1 }  R9 W
  129.                 SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);* Y7 s9 H  N: K- h; S
  130.                 SPI_FLASH_BufferWrite(Tx_Buffer, 252, BufferSize);
      y+ R, @8 c* _, o
  131.                 printf("写入的数据为:\n%s \n", Tx_Buffer);  k* @3 b$ F& {9 \) P( C" o
  132.                 ) ~; c6 J9 m2 m( Q$ o$ t: {/ q
  133.                 /* 将刚刚写入的数据读出来放到接收缓冲区中 */$ Y! Q7 D# `% h# @. U; a3 l, ^
  134.                 SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);% R' J5 O5 F# z1 G2 i7 d  H
  135.                 printf("读出的数据为:\n %s\n", Rx_Buffer);9 W$ }6 R4 w$ p& v7 b4 U
  136.                
    . H. F% D1 g# V8 h/ `! ]9 N
  137.                 /* 检查写入的数据与读出的数据是否相等 */2 F: \% N1 t. y& M$ k
  138.                 TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);  b: P7 ?- C" _! [9 Z( v3 [
  139.                 3 F+ f: q5 h6 C: f
  140.                 if( PASSED == TransferStatus1 )
    0 Q) o) {( \/ ^3 Q8 r
  141.                 {   
    * z: X1 v- H: e6 _0 Y/ j
  142.                         printf("16M串行flash(W25Q128)测试成功!\r");5 h. o) z9 P% Z" i  }2 j9 [
  143.                         LED1_ON;' K: T& y" t* j: ~* t- |8 O
  144.                 }2 ^) U. j4 e, W7 q0 E$ v; q
  145.                 else3 U4 t4 d% l6 l% `) z# w
  146.                 {        ( x! Y4 t2 ]! O& A
  147.                         printf("16M串行flash(W25Q128)测试失败!\r");
    3 h* c: L" E& `  c
  148.                         LED2_ON;1 u( C7 V$ q& t0 g: f
  149.                 }9 Q  i! f; ]. W, E
  150.         }# ~, c7 f; r# G5 |' ?* g: g+ V
  151.         else
    6 j: W$ G: k/ L  |2 Q$ I
  152.         {   
    " k: v$ e) r9 L6 l' Z, O2 H
  153.                 printf("获取不到 W25Q128 ID!\n");
    ( H( S3 k# E; k: N$ @& z" {; W  G
  154.                 LED3_ON;
    : q) Z+ l; @: k$ ~! S1 \$ @+ B
  155.         }
    + @: a0 E* I6 a! U
  156.   
    2 X2 M/ O6 p4 V$ c  r! e# Y7 s
  157.   /* 无限循环 */3 d, Z% T* B; Y3 Y; k1 P
  158.   while (1)# [( g( b9 z, Q/ A
  159.   {0 z* V( T, h! h9 ]
  160.   }
    ' p, M- s3 f# E
  161. }
    1 V1 Y' |  r# K, a# _

  162. # {+ }- |$ R: w. R( U7 m7 c) k, t0 d
  163. /**
    # Y. {' N5 q# v1 o1 g; {2 v9 _4 W
  164.   * 函数功能: 比较两个缓冲区中的数据是否相等
    : Q) O! M! z" l, u5 {" k
  165.   * 输入参数: pBuffer1:要比较的缓冲区1的指针
    7 P! E& M: `! R; ?$ Z% J
  166.   *           pBuffer2:要比较的缓冲区2的指针6 A2 x+ v3 n' x1 t+ g3 X; `* @* d  l; o
  167.   *           BufferLength:缓冲区长度- ]! _, X8 F7 \$ Q" F$ Z
  168.   * 返 回 值: PASSED:相等& g3 P" y! t% e1 F2 H, \2 o
  169.   *           FAILED:不等
    ' R; Y  V. w4 o% |
  170.   * 说    明: 无  @) J# t/ }* A# e1 {3 N4 E
  171.   */) H; u; n6 U- W' x
  172. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
    % W8 [2 z6 J6 n* Y4 x' Q
  173. {( z, B- e1 ^" M9 K$ Z  t' H9 I
  174.   while(BufferLength--)
    % k: f% V- q  T
  175.   {
    - ?' |; V/ |: T. J1 {, c- |& O
  176.     if(*pBuffer1 != *pBuffer2)
    & X4 Z, l" X. R# R7 P+ j+ }* z
  177.     {
      t" ~! g: R. C3 t
  178.       return FAILED;
    ; r- B# X+ }8 D1 I8 O" E9 E
  179.     }# L( W9 }; W$ k& z8 ]

  180. / }0 c/ Z* }; c2 [: O
  181.     pBuffer1++;, Q( ?3 ^9 R3 X) B2 h$ @/ _
  182.     pBuffer2++;0 y' ?0 X' v( }; q( L7 t- ?9 Y
  183.   }
    : c- o6 B2 s" h# n- [
  184.   return PASSED;  }& D$ I! S) \6 W7 s7 P9 f
  185. }
    # x* J" u* m. T" ]9 J

  186. 7 }4 m+ R* s, g
  187. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/7 R. H  W6 h9 r4 X4 T
复制代码

# T3 |" v. k  [ 串口调试助手截图.jpg
) c& f. M  g( @  E' ^
: E- H( c! i3 f* t8 l
8 E% J( s2 ]3 j
收藏 2 评论9 发布时间:2016-6-20 08:57

举报

9个回答
haohao663 回答时间:2018-9-12 08:47:31
wuhuayu 发表于 2018-9-11 16:41: S9 u0 Z/ M/ B  M* n) V
你好下载地址失效了,可以重新发一份给我吗?谢谢0 p- _; `/ y0 |; a- P6 j: Q+ D
我的邮箱是:
( k  a- ?8 }2 ?; J" W3 w
硬石YS-F1Pro开发板资料! \. b' `$ a8 S& K7 ]; @
百度云盘:https://pan.baidu.com/s/1dWZ2xS 密码:g2us
烟花绽放 回答时间:2016-6-20 09:10:15
好东西哇,,收藏收藏
zero99 回答时间:2016-6-21 16:15:49
学习学习
原同学 回答时间:2017-9-10 10:33:04
楼主没把SPIFLASH.c文件放上来啊
haohao663 回答时间:2017-9-12 18:59:32
原同学 发表于 2017-9-10 10:33
9 I* K$ N( ?) n1 Y' _% \0 ]楼主没把SPIFLASH.c文件放上来啊

# \% L: o# u: z" u链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
6 t+ D% p) n5 k' G网盘下载例程看
jinshan2014 回答时间:2017-11-16 13:48:04
你好!下载地址失效了,能给我重新发一下吗?谢谢 707890493@qq.com
haohao663 回答时间:2017-11-16 19:30:28
jinshan2014 发表于 2017-11-16 13:48% V% Y/ ]5 f  h. ]
你好!下载地址失效了,能给我重新发一下吗?谢谢

; E2 P- B+ j6 \  G2 z4 j5 l, b链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
wuhuayu 回答时间:2018-9-11 16:41:16
你好下载地址失效了,可以重新发一份给我吗?谢谢
: w/ r% ?1 O. s+ K我的邮箱是:1070203527@qq.com
zqs333 回答时间:2019-9-18 12:32:59
下载失效,请发一份例程给我,谢谢。546634227@qq.com。谢谢

所属标签

相似分享

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