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

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

[复制链接]
haohao663 发布时间:2016-6-20 08:57
本帖最后由 haohao663 于 2016-6-20 15:20 编辑
* t- s; t) H7 h8 }: _( v/ b! ~3 y+ t2 i
【HAL库每天一例】系列例程从今天开始持续更新。。。。。$ B% `* R. C" A# ~. r: i: B
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
& O- s. v% Z6 Z' G( I8 A该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。& l. }" e" J; ?' ?4 O/ w$ l+ G
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。% v9 n( m+ O4 {$ `* f7 y
例程下载:
1 j- I8 F. [( r1 B& _- t: z- z( c资料包括程序、相关说明资料以及软件使用截图
2 l# C0 l) d( f) O5 e链接:https://pan.baidu.com/s/1i574oPv 7 ~: V) V4 p/ |  f  Z. Z
密码:r3s3. w/ m2 f3 u/ a
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-046. SPI-串行Flash  N' ]  t. V: V+ e9 v4 u

! d9 a2 N1 n: I* p# L  T  u/**2 C* r* i# h- F* R6 R6 J6 a
  ******************************************************************************$ a$ O3 z; h/ e. k
  *                           硬石YS-F1Pro开发板例程功能说明
' o  v9 H/ t( m0 x4 E  *9 x  B2 \. A  Y2 c+ r8 W9 b
  *  例程名称: 1. 串行Flash读写测试
- h- D) k' R1 w6 d7 [# E6 x8 \5 `+ ^0 N  *   % C. {; m( {) K6 V$ w
  ******************************************************************************
8 y  U2 @0 ~4 m) ~: ]  * 说明:, `* Y, L) P( B
  * 本例程配套硬石stm32开发板YS-F1Pro使用。1 q5 R- W. _& p3 E) {$ O$ D
  *
/ }" O: J& V5 L  * 淘宝:
) A1 f# G+ m" X4 q" _4 `/ Q) N  * 论坛:www ing10bbs com
& h) d4 d0 A8 A4 l. T- T( E: G" W  * 版权归硬石嵌入式开发团队所有,请勿商用。
% C; d' T7 ~2 q5 L2 [) C  ******************************************************************************
9 s6 c7 i& l, t" \  */7 I: X3 e  y# x7 d* u/ N0 z

) k8 l' r7 s7 N: r8 K  G【1】例程简介
' N! ?% I' G- b( Q2 D& b  [  串行Flash用于存储数据。YS-F1Pro开发板集成了一个16M字节的W25Q128串行Flash芯片,可以8 t, e1 u: }% w) I& \& M! R
用于存放数据。该芯片使用SPI1通信接口。
# \, a; N& Z3 A1 ~  
  @! B" M+ _4 C$ S1 O  c【2】跳线帽情况9 O) O) D8 W$ ]' h  T, [) A5 {( E
******* 为保证例程正常运行,必须插入以下跳线帽 **********& |1 G9 H( }" s* H! v( Z
丝印编号     IO端口      目标功能引脚        出厂默认设置
0 @5 `! j  W' P" a/ t! z  JP1        PA10        TXD(CH340G)          已接入
0 A) _2 v. ]* Y3 E& V" r  JP2        PA9         RXD(CH340G)          已接入
+ I5 i$ s+ S  B  JP3        PB0           LED1               已接入. I6 l+ k) b5 p: `- p
  JP4        PG6           LED2               已接入4 o/ o! F1 M. e+ h( T4 U5 v
  JP5        PG7           LED3               已接入
( [5 G; t  M/ G3 i0 h  + p& M4 ~$ q: q1 N( g  O
【3】操作及现象
: {3 ?# ^& a4 r6 e3 Y 使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱, i, ^7 H1 e3 E* b' h
动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试- Y7 r/ w$ [8 T" S, I/ g
助手窗口可接收到信息。只有LED1灯亮说明串行Flash读写测试正常。
3 i4 q5 S7 l$ @$ l7 U
7 o. p% {6 g, R$ [' W/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
* C* n. b# j6 _1 L' [7 T
CubeMX_1.jpg 5 Y. E8 a; Z" |0 W. Y# {# K% _" E
CubeMX_2.jpg
6 n" K( f+ N5 ~) z) _* x CubeMX_3.jpg
  i4 l$ a  p2 T$ S4 g5 W CubeMX_4.jpg
; K" k/ t4 |& }7 E  r: T1 I$ B" I* A! U
  L$ \8 `* m8 C
  1. #ifndef __BSP_SPIFLASH_H__8 C: I5 d9 r3 J: i2 {' M
  2. #define __BSP_SPIFLASH_H__/ v# v8 h4 O. ~  @

  3. ) p2 q/ N. |, ^- o& R- s0 J
  4. /* 包含头文件 ----------------------------------------------------------------*/; P& a, C  l. F1 T
  5. #include "stm32f1xx_hal.h"9 g7 S6 X0 V& o3 i& }
  6. / D+ U8 l$ P" W5 f1 X: ^& j
  7. /* 类型定义 ------------------------------------------------------------------*/, i' a+ ^, \8 Q9 I; x
  8. /* 宏定义 --------------------------------------------------------------------*/% }$ }3 z: u% R7 D5 B+ L9 Q
  9. //#define  SPI_FLASH_ID                       0xEF3015     //W25X16   2MB
    + K- g1 N. s" P- _' I  F6 R
  10. //#define  SPI_FLASH_ID                       0xEF4015           //W25Q16   4MB& f3 C$ ]# v3 o6 k# B# C* Q
  11. //#define  SPI_FLASH_ID                       0XEF4017     //W25Q64   8MB+ e) A8 O0 f$ B
  12. #define  SPI_FLASH_ID                       0XEF4018     //W25Q128  16MB YS-F1Pro开发默认使用
    2 `- p1 R# e: l( w6 g$ ]' z

  13. 5 w# e' I' g; N
  14. #define FLASH_SPIx                                 SPI1
    " u7 u# s! r4 s5 H$ Q" G2 G, o
  15. #define FLASH_SPIx_RCC_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()6 L$ B  A; o( N4 a* \: ^
  16. #define FLASH_SPIx_RCC_CLK_DISABLE()               __HAL_RCC_SPI1_CLK_DISABLE()
    ( }" }2 E7 Y8 w2 E! ]  E) @

  17. 5 _* G  k% s8 A
  18. #define FLASH_SPI_GPIO_ClK_ENABLE()                __HAL_RCC_GPIOA_CLK_ENABLE()
    , G8 y2 Z% n& I, v* n5 ]
  19. #define FLASH_SPI_GPIO_PORT                        GPIOA# I3 b7 l' s. P. ]$ B: e
  20. #define FLASH_SPI_SCK_PIN                          GPIO_PIN_5
    ; H+ k! W3 E& q# i) ]- N6 I
  21. #define FLASH_SPI_MISO_PIN                         GPIO_PIN_6$ T  r. M8 a8 T4 D
  22. #define FLASH_SPI_MOSI_PIN                         GPIO_PIN_74 W2 @: P! x- O
  23. 4 j% i6 ]; L8 r0 R! N( C4 F# c
  24. #define FLASH_SPI_CS_CLK_ENABLE()                  __HAL_RCC_GPIOA_CLK_ENABLE()    & c+ I8 T4 |2 g- k/ D( L7 G4 Z
  25. #define FLASH_SPI_CS_PORT                          GPIOA$ V0 L/ v: t' s  P* t
  26. #define FLASH_SPI_CS_PIN                           GPIO_PIN_44 i$ h( Y( C; D8 F- K
  27. ( k& g' g1 H2 M9 ~0 L
  28. #define FLASH_SPI_CS_ENABLE()                      HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_RESET)4 S: ?$ v2 y3 K- A, g+ Q, A" n
  29. #define FLASH_SPI_CS_DISABLE()                     HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_SET). Z6 H) L, K) q
  30. / k* ^" p3 ?6 m- b8 s' D
  31. /* 扩展变量 ------------------------------------------------------------------*/2 Y1 I& x/ S- @3 G" z3 c1 O7 a
  32. extern SPI_HandleTypeDef hspiflash;
    ! Z. e% N  a3 H* F

  33.   w9 D1 d4 H# k0 A
  34. /* 函数声明 ------------------------------------------------------------------*/7 @" l/ C) U" u; q; [& U2 L

  35. 4 u6 ~0 f# ?/ Z, }6 W
  36. void MX_SPIFlash_Init(void);
    ' U* }" \& i& Q
  37. void SPI_FLASH_SectorErase(uint32_t SectorAddr);9 [6 B2 S9 M' F
  38. void SPI_FLASH_BulkErase(void);5 M* j* k& {# T6 }
  39. void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);2 W  |0 c! A/ e$ ^  H
  40. void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
    7 H" l* ]0 ~, Z" {! b- @
  41. void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);* t! `8 M: M' R) t
  42. uint32_t SPI_FLASH_ReadID(void);
    , K5 O. |* j& w+ l% K" q" P( g2 X
  43. uint32_t SPI_FLASH_ReadDeviceID(void);) l" i' e" R* U& q: R/ _4 g
  44. void SPI_FLASH_StartReadSequence(uint32_t ReadAddr);
    8 ~% H) [' C, J! ^# n( ?! ]  x: w
  45. void SPI_Flash_PowerDown(void);
    8 N) F. t2 S  r2 y% ~! T9 U
  46. void SPI_Flash_WAKEUP(void);  i! k3 F3 Q3 g% p
  47. 9 v! J  u) C* M+ Z* v4 k
  48. uint8_t SPI_FLASH_ReadByte(void);- y5 X. [6 s0 t
  49. uint8_t SPI_FLASH_SendByte(uint8_t byte);* x' b' {# s+ n4 J
  50. void SPI_FLASH_WriteEnable(void);3 b( }$ A' F& [8 r  t0 \7 G
  51. void SPI_FLASH_WaitForWriteEnd(void);; D- R& V/ N1 F6 f) d; z6 c7 F
  52. : j( V; E/ |& j/ I/ [3 e2 W$ {6 P
  53. #endif  /* __BSP_SPIFLASH_H__ */
    : [4 b9 Z- T* _- [4 J
  54.   }* T: o/ W: E5 J+ J
  55. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/0 |( B9 a3 ]9 c5 {1 A* k6 b7 v
复制代码
. ?6 o, z% |: p# ?2 X4 j8 g5 \" E

( X/ W1 e! |3 f) v% W, ?. |
  1. /**
    8 \4 G9 t5 p( A8 A9 a9 Q; n& M
  2.   ******************************************************************************
    6 Y1 D9 A% g/ E8 p0 j$ S8 z$ {& W
  3.   * 文件名程: main.c
    : q6 L; z; k+ s
  4.   * 作    者: 硬石嵌入式开发团队
    7 m+ v& C$ I: |8 u
  5.   * 版    本: V1.07 ~3 }- R1 q* t
  6.   * 编写日期: 2015-10-04% u* d* X0 y; p, C
  7.   * 功    能: 串行Flash驱动实现、读写测试
    % t! Q; _1 i0 i% Y  B/ Z0 j
  8.   ******************************************************************************
    1 A) P6 R& a9 X" \* g
  9.   * 说明:6 k- K' x+ F+ w8 S& P3 B3 m$ G! C
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
    , `( L! W, ]) \7 y  s# m: q
  11.   *
    0 G  U) K& ^9 p( Q+ K: {
  12.   * 淘宝:4 R' ^  P8 i" |+ ], A1 T  m% u
  13.   * 论坛:http://www.ing10bbs.com
    ( ]/ Z3 m0 p! X3 W& B# |  Z
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
    3 O) ?4 V6 _% C, u; ^, V
  15.   ******************************************************************************1 P  W. w, r( N% X6 S" g
  16.   */
    1 k; O' R( \; t( e9 e7 b
  17. /* 包含头文件 ----------------------------------------------------------------*/
      g1 E# |, Z; a& J# B6 {4 w% O+ t& Z
  18. #include "stm32f1xx_hal.h"# T" i3 B) y& r0 N4 l' D5 s
  19. #include "usart/bsp_debug_usart.h"+ w4 }% @0 P" B' f5 B
  20. #include "spiflash/bsp_spiflash.h"0 S5 v/ |+ F/ S) l( `7 ~7 `
  21. #include "led/bsp_led.h"
    - @6 {+ t4 S& E4 i) f) n' ~) ^8 k
  22. 4 E% s$ _; s' t% ?3 {
  23. /* 私有类型定义 --------------------------------------------------------------*/
    ( y% ~1 i2 D0 i2 C! _* s8 l9 r
  24. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
    7 J* x$ q8 Q! u" P6 i
  25. 1 E; c3 e0 @2 l: y3 `- b; T6 D
  26. /* 私有宏定义 ----------------------------------------------------------------*/5 I- r# ]/ a$ K% d
  27. /* 获取缓冲区的长度 */
    # Y% E, w9 X; @6 K  j( n" h
  28. #define countof(a)      (sizeof(a) / sizeof(*(a)))
    1 i6 T' T5 @2 q4 ]0 ?
  29. #define TxBufferSize1   (countof(TxBuffer1) - 1)5 ^$ y& h. I5 ]- z
  30. #define RxBufferSize1   (countof(TxBuffer1) - 1)
    & f  g6 Z' c6 J$ ?  {% Z
  31. #define BufferSize      (countof(Tx_Buffer)-1), _( l" |, z. O

  32. 9 S# }/ c3 e2 G' S. q' O! z
  33. #define  FLASH_WriteAddress     0x00000
    - c  x: d  U8 u
  34. #define  FLASH_ReadAddress      FLASH_WriteAddress. s! \" e4 [. e3 r
  35. #define  FLASH_SectorToErase    FLASH_WriteAddress
    * e1 ]4 A8 X3 j- C

  36. , \9 s' y- }! \5 i/ Z
  37. /* 私有变量 ------------------------------------------------------------------*/
    . _/ X7 L7 k" K9 Z( c4 t* f
  38. uint8_t Tx_Buffer[] = " 感谢您选用硬石stm32开发板\n今天是个好日子";. W5 [0 m  [1 S9 r' D# P* r
  39. uint8_t Rx_Buffer[BufferSize];1 ]0 D& L- w! w! r5 p; Q; K

  40. ) ?/ ^0 E5 k/ T8 }7 T9 ^2 `6 M2 W2 ]2 K
  41. __IO uint32_t DeviceID = 0;5 z4 {, w3 N' I( N3 I7 _
  42. __IO uint32_t FlashID = 0;7 c0 j  ?/ d6 c$ a" Q
  43. __IO TestStatus TransferStatus1 = FAILED;
    4 A( E) o, E: A
  44. ! S* p9 i4 g$ d
  45. /* 扩展变量 ------------------------------------------------------------------*/
    , H& i. E1 \- w' v5 A" M* _' B
  46. /* 私有函数原形 --------------------------------------------------------------*/
    - b5 d2 Y( I5 ]7 U% D& X
  47. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);1 [6 T, ^/ C  L. E+ F! [

  48. % y: P* V9 O4 @' k/ ]' y
  49. /* 函数体 --------------------------------------------------------------------*/
    . g# j0 R9 Q; e7 G3 R. ]
  50. /**
    ! g- R# G9 [/ y# C8 y
  51.   * 函数功能: 系统时钟配置
    7 G# n6 `' A  {0 r% F
  52.   * 输入参数: 无9 {  |6 w! z9 ^: K3 K' j
  53.   * 返 回 值: 无
    ! \* F+ Q9 y9 ?7 O
  54.   * 说    明: 无
    $ k, |$ Q; u- |6 g2 J; E# b' F
  55.   */
    ! B0 a0 R' Y9 K; y
  56. void SystemClock_Config(void)
    & _3 P) B" S2 c, I% ~
  57. {1 q$ h9 f# g8 g. h8 M4 s
  58.   RCC_OscInitTypeDef RCC_OscInitStruct;. y- \6 n0 J( r; v
  59.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    / `: j5 l: p7 ?) Z

  60. & J' }1 H8 P$ A) R3 V. w' v
  61.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
    3 d7 H* a5 M+ D8 y1 |9 e4 i
  62.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;( T& q" `$ g; l
  63.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    ' a! ]. x+ \' K* f% ]* ]( k. G
  64.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    6 x8 Y$ b" L: Y, E: ~
  65.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    $ ?2 P7 O7 v% D' L  q; Y$ ]6 t3 l
  66.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
    8 i" i6 p7 Q. v
  67.   HAL_RCC_OscConfig(&RCC_OscInitStruct);2 F2 w+ B- _) ?2 {" s# a% e

  68. 2 A. m6 G/ H5 L6 o% l- \
  69.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK1 R3 ~3 i9 B. G& _6 f2 {8 T( k
  70.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    4 \2 B7 N. \' e0 [0 }2 ^
  71.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
    ! g' q- N" p% x& e. b( j& _; t
  72.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
    ; q+ ~" r; e' k: j. o  ~
  73.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz% ]: n# x- M3 d% @
  74.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
    0 N6 L) k& t0 s' U" i# }
  75.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);/ e1 e+ f5 X- j
  76. " J: C( P) X' q9 J* ]. T
  77.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
    6 K- t1 s* a* V2 p
  78.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次2 N, u0 |* ~; t: Q
  79.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次6 S) J* d. N/ [" g
  80.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器  A: t5 u  z) J" h
  81.   /* 系统滴答定时器时钟源 */
    / c& C. b( N5 |7 S5 _: {* \: Y# a
  82.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);8 b4 X3 F) A0 ]* P! n* B
  83.   /* 系统滴答定时器中断优先级配置 */
    & L/ J# ^, }! Q6 k( p. y0 J
  84.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);. ^/ T1 w/ o7 N/ q4 F! X5 w* {
  85. }
      z9 v2 H# `: [

  86. 4 l* |  l! o. c
  87. /**
    % v& V& b5 ^1 X* x
  88.   * 函数功能: 主函数.
    8 n" b5 Q& e8 _9 S$ h  K2 u2 c8 v
  89.   * 输入参数: 无, W6 s$ S9 ^5 w( y8 d6 g
  90.   * 返 回 值: 无  o4 G) l1 ]/ F2 |' c2 A
  91.   * 说    明: 无6 z+ o. ^$ ]$ `0 W- \8 x
  92.   */( Z8 p4 M+ ?' q
  93. int main(void)
    ( z8 Z, \3 a' O0 h# j5 m8 j6 h
  94. {  
    * K$ X" I$ @! O  J/ g) O, D2 A& B9 ~
  95.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
    8 ?) o$ v2 ~5 s! _
  96.   HAL_Init();$ {/ u( B1 C1 `* K7 t' k9 R3 F
  97.   /* 配置系统时钟 */
    ( N. t. K7 ~8 z
  98.   SystemClock_Config();
    - ]; a4 p$ T# W. a9 x" r

  99. / Z0 Z+ f) J, C! P2 o. V9 ]
  100.   /* LED灯初始化 */
    ; ]  w6 o0 S  s  J1 f
  101.   LED_GPIO_Init();! v2 Y/ k/ g! I2 s5 k
  102.   
    # Y7 ^4 |  S) G
  103.   /* 初始化串口并配置串口中断优先级 */
    9 @, E4 N' ?5 _
  104.   MX_DEBUG_USART_Init();9 Z  n+ H1 f, J
  105.   /* 调用格式化输出函数打印输出数据 */
    & s' k* |' e& F* }! b" n/ u
  106.   printf("这是一个16M byte串行flash(W25Q128)读写测试实验\n"); " |3 |; v8 x. E
  107.   
    : Y" J7 v/ B5 g7 V' ]
  108.   MX_SPIFlash_Init();
    9 H- o1 \  C! F* O, m5 R
  109.   $ D! q& R; b2 {6 a  D
  110.   /* Get SPI Flash Device ID */# A; ~5 G3 z" t, H$ z; `
  111.         DeviceID = SPI_FLASH_ReadDeviceID();. }. I/ b! z2 U$ Y2 L+ _
  112.   
    - ~7 P+ n) ]1 y
  113.   HAL_Delay(100);
    $ T/ b" J7 v% l6 ~
  114.   $ I# b1 o* r  v# B3 o/ [( c
  115.   /* Get SPI Flash ID */" t8 w; @1 Y$ ^4 [/ s
  116.         FlashID = SPI_FLASH_ReadID();2 r5 l- g, ^% N2 W
  117.   
    : K; M: \3 C( |' V$ t8 Z& O# L
  118.   printf("FlashID is 0x%X,  Manufacturer Device ID is 0x%X\n", FlashID, DeviceID);
    7 {1 L8 w4 ~& B9 p, g2 b! L
  119.         / v* y6 z- B( \
  120.         /* Check the SPI Flash ID */
    3 H, ^5 d4 L- N. P% D9 @
  121.         if (FlashID == SPI_FLASH_ID)  /* #define  sFLASH_ID  0XEF4018 */% y. k* ?- H* |; g) H6 Z& [
  122.         {        / r. `! b  t1 p" w% T! e
  123.                 printf("检测到华邦串行flash W25Q128 !\n");' l( P* q* U' ^8 W
  124.                
    $ d7 E/ \; r( N/ q: w1 P* B
  125.                 /* 擦除SPI的扇区以写入 */
    6 X3 v% I( u: }) t: Q& R- ~
  126.                 SPI_FLASH_SectorErase(FLASH_SectorToErase);                  
    * D( U* l' R2 @
  127.                
    , e- J) ]) |+ w% ^0 A
  128.                 /* 将发送缓冲区的数据写到flash中 */         
    4 X# B6 e6 |5 u3 t! L
  129.                 SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);0 K% O- m+ O5 @' S' W
  130.                 SPI_FLASH_BufferWrite(Tx_Buffer, 252, BufferSize);
    , h7 j/ ~+ ?; s0 K8 x" s
  131.                 printf("写入的数据为:\n%s \n", Tx_Buffer);
    & w( |$ k* k' l( I1 B
  132.                
    ! y1 @" L8 T; |) a! U7 G+ r
  133.                 /* 将刚刚写入的数据读出来放到接收缓冲区中 */2 D) N4 @& F* B8 t; w
  134.                 SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);' {3 T9 I$ _9 W. |
  135.                 printf("读出的数据为:\n %s\n", Rx_Buffer);. U# y; m* T6 E9 g4 V( e
  136.                 0 {' d, T4 F# B# {/ z
  137.                 /* 检查写入的数据与读出的数据是否相等 */
    2 T( Z3 V2 x* `7 _1 p
  138.                 TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);' l) _7 v; c# V7 ]4 G4 V5 `
  139.                
    4 I* W- _# ~7 `' u, x7 ?) y
  140.                 if( PASSED == TransferStatus1 )
    5 |! a9 a0 m" ]' {0 f4 d/ J
  141.                 {   
    2 a* z! P# n  c7 H" d
  142.                         printf("16M串行flash(W25Q128)测试成功!\r");
    6 K( S( r" Q- b$ N
  143.                         LED1_ON;
    # C/ i% O7 X$ Q) E
  144.                 }
    ! J+ E* ^3 G. g0 k# v. M
  145.                 else
    + u- `  T; R, \& `9 {
  146.                 {        " g. m% e0 s( M. E1 s
  147.                         printf("16M串行flash(W25Q128)测试失败!\r");
    8 i% b2 n3 M5 t
  148.                         LED2_ON;
    0 n. u4 o6 _/ R9 H8 M) K
  149.                 }
    / h, _3 X4 v: \5 ]  r7 ]$ ]
  150.         }
    4 m$ P5 g: `6 L) x4 j
  151.         else) \7 p: r" R, Z, f. G' K
  152.         {    * K( \, h" m6 H8 U  e+ j) \" Q
  153.                 printf("获取不到 W25Q128 ID!\n");) m5 S2 m% e( v* M& y. D
  154.                 LED3_ON;
    / Z# K+ _9 S0 G3 V) b9 J+ U  Z
  155.         }, K4 S9 j: m/ m
  156.   1 ?( D6 i8 [  v3 `$ `8 \0 ]
  157.   /* 无限循环 */( e; U; Z- w* H7 @! c
  158.   while (1)
    6 [6 v2 ], I; [* e
  159.   {' {/ i  X2 E: T' Y4 e6 v
  160.   }1 W; g. i. t) `7 x7 j
  161. }
    % t1 ?( J6 I9 [3 j4 Y

  162. ! v; _& F6 C8 [9 D2 ~4 }# ]
  163. /**4 {( j" |: L5 D/ q4 x8 A
  164.   * 函数功能: 比较两个缓冲区中的数据是否相等
    % J" ]. S. \1 `0 R+ w8 R3 ]# A& Z" [; E
  165.   * 输入参数: pBuffer1:要比较的缓冲区1的指针
    9 s) q4 _/ _. T$ _2 `
  166.   *           pBuffer2:要比较的缓冲区2的指针
    / s& g4 }/ J, b$ k8 H+ K
  167.   *           BufferLength:缓冲区长度4 D3 `7 L. n# f; G0 R
  168.   * 返 回 值: PASSED:相等* o$ Q8 d1 i. s3 Z4 D
  169.   *           FAILED:不等
    2 j# b* _7 C) ]8 }  F% ]
  170.   * 说    明: 无
    5 Y% {! F( o& d8 Q1 A4 p
  171.   */" W7 ]! T/ P( W5 Z
  172. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)6 g, S  C# i2 x" S
  173. {) u9 K9 q$ o, j3 h
  174.   while(BufferLength--)
    6 T5 z2 K8 f9 D' {0 R
  175.   {' m, M. r1 Y+ _) v! w
  176.     if(*pBuffer1 != *pBuffer2)& P' @" x5 g/ b$ O/ d( D+ R& I1 V
  177.     {3 r$ p! |$ \3 H* H
  178.       return FAILED;( [# I$ H) G; ]
  179.     }, K' k: N* [+ h+ q' _& D. j
  180. 6 ]! T/ ?) i( o1 W( ~
  181.     pBuffer1++;& k& ~% q: ?! |3 _% V# f
  182.     pBuffer2++;) E" {/ Y# ^7 s: M- Q: c
  183.   }" C& w  f4 q- l/ E: C! G0 s
  184.   return PASSED;, J" ~5 b4 a7 w7 C+ A/ h/ d
  185. }
    4 @/ E4 S' ]: u
  186. 3 {" j# C: ^. p, ~
  187. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/$ F$ Z& W8 }2 a6 N7 U2 r
复制代码
! V0 n  t  U. Z: ^
串口调试助手截图.jpg
# B- ?. f) j) ?$ a% ^* @! {
$ F, }4 A8 g1 x  C) I. A; b
; e$ N. @$ N% T- l2 [
收藏 2 评论9 发布时间:2016-6-20 08:57

举报

9个回答
haohao663 回答时间:2018-9-12 08:47:31
wuhuayu 发表于 2018-9-11 16:41/ s) z5 [) G; }, m2 @. R8 B( G
你好下载地址失效了,可以重新发一份给我吗?谢谢+ S  Q5 h5 f" {% s* e7 x6 U( G# W
我的邮箱是:
8 d$ d4 W( f) q( u+ B% V
硬石YS-F1Pro开发板资料
0 I; F! X/ o7 p, X% `百度云盘: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 i3 S4 }9 w& `+ f; j楼主没把SPIFLASH.c文件放上来啊
4 J4 q5 v' o' b+ R) u  Q" K) X! N$ Q6 E
链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v, s+ {( ^1 P& v' k9 s
网盘下载例程看
jinshan2014 回答时间:2017-11-16 13:48:04
你好!下载地址失效了,能给我重新发一下吗?谢谢 707890493@qq.com
haohao663 回答时间:2017-11-16 19:30:28
jinshan2014 发表于 2017-11-16 13:48) g! ^, b/ O& W  h/ q2 K
你好!下载地址失效了,能给我重新发一下吗?谢谢
4 [5 e$ G5 `2 A; ?! r
链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
wuhuayu 回答时间:2018-9-11 16:41:16
你好下载地址失效了,可以重新发一份给我吗?谢谢
& j; {9 A3 j' e  ^- s我的邮箱是:1070203527@qq.com
zqs333 回答时间:2019-9-18 12:32:59
下载失效,请发一份例程给我,谢谢。546634227@qq.com。谢谢

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版