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

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

[复制链接]
haohao663 发布时间:2016-6-20 08:57
本帖最后由 haohao663 于 2016-6-20 15:20 编辑
  }& h' q% O! |  Q: L3 t& @8 ^8 ?7 i1 H  E1 v
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
' I$ O8 q$ l, J1 s: T% S我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
3 ?9 U, D& J6 E1 H该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。2 c; t* q, Q3 i: H7 |
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。  M3 M# Y; Z+ d( ~* e! d* h( a, Z
例程下载:3 v  D; ?2 k2 t0 r7 |* d! G
资料包括程序、相关说明资料以及软件使用截图
6 s9 C! \4 Y' M/ d9 t( f链接:https://pan.baidu.com/s/1i574oPv
0 k, L- A; d  C+ {2 Q5 Z! S密码:r3s3
' D/ N5 D" V# G# P# D+ n( s
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-046. SPI-串行Flash  J+ m5 s& c" p, z+ g% j9 m  L. Y

7 x+ q4 u. \( k7 Q8 e0 p6 d+ L/**
% l% n8 z$ a, b7 }" @4 E( P: u  ******************************************************************************
/ p3 G; A( |( ]: L8 [) h% c) r4 A5 d$ ^  *                           硬石YS-F1Pro开发板例程功能说明. W: S1 N( \/ {8 d
  *
. u4 d$ k* e; |5 P& Z7 J7 z  *  例程名称: 1. 串行Flash读写测试# F( @7 z8 C9 s; y$ O/ r
  *   7 K5 |7 i! \% ~& g+ J" ]+ H
  ******************************************************************************; D/ W8 M$ u0 }6 q2 j1 a6 X+ X
  * 说明:$ ~7 K) O: O$ x5 U  g, C
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
1 e8 [& ^. w5 T/ K: M  *
0 ]" j* p/ s7 l  N# e9 n% D0 C* E/ i  * 淘宝:! v1 _1 |( d9 L. I. G
  * 论坛:www ing10bbs com' H" D, T+ `7 [/ J- T
  * 版权归硬石嵌入式开发团队所有,请勿商用。6 s1 G- `" n/ H9 q: `: B' p- y
  ******************************************************************************
& B6 C7 [3 G2 F# X7 [1 ]  */& d+ P3 p8 Z- @* \1 |4 @9 t

; u' i) K& l$ p" h# G【1】例程简介* R( P" y7 U- ?8 I1 y) o2 ^6 x
  串行Flash用于存储数据。YS-F1Pro开发板集成了一个16M字节的W25Q128串行Flash芯片,可以+ T# e& n5 s/ C, A' a# O
用于存放数据。该芯片使用SPI1通信接口。
  Z3 E, `! @' v2 }( b( y+ l9 s  
$ A" a& `3 s/ B8 {3 B! T【2】跳线帽情况1 M2 W( p2 Y& ~
******* 为保证例程正常运行,必须插入以下跳线帽 **********5 i5 G  c% v/ v- q* k5 O$ m9 I  Z7 S6 X
丝印编号     IO端口      目标功能引脚        出厂默认设置
+ X; V* n* u4 J  JP1        PA10        TXD(CH340G)          已接入
. J+ m. ]! f& H  JP2        PA9         RXD(CH340G)          已接入0 t; K7 W0 i' i
  JP3        PB0           LED1               已接入
! M: c3 L4 o) n& B' }7 Z/ [  JP4        PG6           LED2               已接入
: A4 B5 F# R' b/ f3 ?  JP5        PG7           LED3               已接入
: C4 l" v4 M; ~" m  
5 K: |- M0 I5 H【3】操作及现象: j! i, Q+ a% ^/ V4 A$ ]( d2 M
使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱. p3 F# |5 x2 _) ^
动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试1 E. j* u5 d3 |  J% u- I
助手窗口可接收到信息。只有LED1灯亮说明串行Flash读写测试正常。
! y' Y/ J9 ~1 f, s# w6 N* s6 T3 v1 o( f; `# k4 S
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

$ h  I' Q& D& c3 r6 {+ \% v CubeMX_1.jpg . N4 q2 v: n8 q5 K0 O. @: {
CubeMX_2.jpg
7 j+ r) c/ I6 j8 @$ O) I CubeMX_3.jpg 7 a- v* i! w) A
CubeMX_4.jpg
; x7 R8 ?6 R4 b/ b) Z/ D1 z% m
9 N7 i& D5 w1 n" L9 }# L: e
/ H# o- h% _: R! E
  1. #ifndef __BSP_SPIFLASH_H__
    ! o; t' E0 {# B9 q& k
  2. #define __BSP_SPIFLASH_H__6 }6 Z: h9 d: v) }% x/ E

  3. / h1 C# R& b+ l; l3 X9 V) |
  4. /* 包含头文件 ----------------------------------------------------------------*/
    / A, ^5 V! o* j% C! l
  5. #include "stm32f1xx_hal.h"
    8 p; K! O& X! A
  6. ; h2 }6 D0 |: p1 D6 a( w3 T
  7. /* 类型定义 ------------------------------------------------------------------*/
    # E/ j# O+ ?% h3 k+ W
  8. /* 宏定义 --------------------------------------------------------------------*/+ L1 o$ J( a: f! w% ]- D
  9. //#define  SPI_FLASH_ID                       0xEF3015     //W25X16   2MB8 w" J  |, X0 ^4 v
  10. //#define  SPI_FLASH_ID                       0xEF4015           //W25Q16   4MB( e( K( x+ [1 g$ b; A
  11. //#define  SPI_FLASH_ID                       0XEF4017     //W25Q64   8MB$ S) }# f0 S+ h6 m" a0 J& k; G) Z/ v& a9 _
  12. #define  SPI_FLASH_ID                       0XEF4018     //W25Q128  16MB YS-F1Pro开发默认使用
    5 C  F4 u- d7 I) o+ S0 \* g+ E

  13. 2 `6 `! F& W% r7 k/ v# K7 ~
  14. #define FLASH_SPIx                                 SPI1
    ' Q- f- g5 L6 D9 t2 X
  15. #define FLASH_SPIx_RCC_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()( H; U5 r; ^( @( U9 C
  16. #define FLASH_SPIx_RCC_CLK_DISABLE()               __HAL_RCC_SPI1_CLK_DISABLE()
      p  g$ S7 ?, z

  17. ; ]* |6 y# t* z! J% p
  18. #define FLASH_SPI_GPIO_ClK_ENABLE()                __HAL_RCC_GPIOA_CLK_ENABLE()
    7 q- A/ o- c5 q0 i8 N* z9 A1 R2 F
  19. #define FLASH_SPI_GPIO_PORT                        GPIOA
    ) y4 O5 X$ R. p) T9 O
  20. #define FLASH_SPI_SCK_PIN                          GPIO_PIN_5. ?! e' n6 ]! n% M; S
  21. #define FLASH_SPI_MISO_PIN                         GPIO_PIN_6" [) z4 H; H9 }+ i
  22. #define FLASH_SPI_MOSI_PIN                         GPIO_PIN_7' K5 }3 k6 ]2 V6 J( ^6 b! U; N/ M

  23. & [: ?4 L. E( R% \& g' M
  24. #define FLASH_SPI_CS_CLK_ENABLE()                  __HAL_RCC_GPIOA_CLK_ENABLE()   
    . p) g, u7 f- \  |5 t
  25. #define FLASH_SPI_CS_PORT                          GPIOA9 f# z3 `' i+ F7 |! I
  26. #define FLASH_SPI_CS_PIN                           GPIO_PIN_4$ s4 H) I+ C( M
  27. & L* h1 l1 Z6 E. s$ A& K
  28. #define FLASH_SPI_CS_ENABLE()                      HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_RESET)2 _& Z9 k- [3 M: r
  29. #define FLASH_SPI_CS_DISABLE()                     HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_SET)
    , `4 Z/ Z+ t, P. e5 u/ d# Y  G
  30. & h. M  p. z* ^; B
  31. /* 扩展变量 ------------------------------------------------------------------*/
    : u7 }7 }+ q- d; M/ M( G' ]) E
  32. extern SPI_HandleTypeDef hspiflash;
    / ~& l7 G; X. R- x( G9 k. W$ p
  33. % M% ]( K" \: G, B2 f
  34. /* 函数声明 ------------------------------------------------------------------*/* i4 x* U" g; ~: D  _

  35. " ?3 R# e" _- ^1 S1 \2 A
  36. void MX_SPIFlash_Init(void);
    , ~+ g7 Z- r9 ?  R2 O( d) I
  37. void SPI_FLASH_SectorErase(uint32_t SectorAddr);
    " }" _  ~  |( Q& E" C" M6 A0 h; U
  38. void SPI_FLASH_BulkErase(void);
    " P* [( a9 o( w: l! l. @2 |7 O
  39. void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
    2 _- a- q8 |: L5 r: C3 J
  40. void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);3 M* Y8 ~1 V9 x+ o
  41. void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
    2 c  l2 @& f7 |! P9 m1 n
  42. uint32_t SPI_FLASH_ReadID(void);
    % w) A: A1 M  ^2 ?
  43. uint32_t SPI_FLASH_ReadDeviceID(void);
    3 B0 ]' k# r  d
  44. void SPI_FLASH_StartReadSequence(uint32_t ReadAddr);$ e$ f! S. @* f: L
  45. void SPI_Flash_PowerDown(void);  ^# Q% r9 E# a, E; k# [/ l* q) ~
  46. void SPI_Flash_WAKEUP(void);2 D4 a9 T1 K4 x8 j8 |2 F! M3 v
  47. ' A* s* j/ C8 Q+ `2 \' w/ l! I3 T
  48. uint8_t SPI_FLASH_ReadByte(void);
    ! r$ c+ {/ [3 q8 g) w' L3 @6 H) B
  49. uint8_t SPI_FLASH_SendByte(uint8_t byte);* ]7 P8 q% D- O. h
  50. void SPI_FLASH_WriteEnable(void);% g1 z$ o1 B& J, }$ q! X
  51. void SPI_FLASH_WaitForWriteEnd(void);! t1 [0 e1 |$ i- X! K0 U

  52. 2 N; W- Z" M& Z! [" ?
  53. #endif  /* __BSP_SPIFLASH_H__ */
    % b" _, K0 E. a5 N( ~
  54. + G3 t& X7 p# d# }" x# g  k2 S# a
  55. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
      e! m7 x) v, p. G7 |: _* b
复制代码

+ V8 l% Q7 \! d) M8 N! A, [$ O9 U% q$ G: ~
  1. /**
    ( W; \% b, u& g
  2.   ******************************************************************************( f" {$ z$ i% Z7 ~& H
  3.   * 文件名程: main.c
    6 J: |& Z- }/ f" s) p3 t8 v% p) d
  4.   * 作    者: 硬石嵌入式开发团队
    / G. i; @& F$ Y/ C0 |+ f
  5.   * 版    本: V1.0
    ) H' t! ~# H/ V! A* r- n% ~
  6.   * 编写日期: 2015-10-04. c  z1 r2 ?- U
  7.   * 功    能: 串行Flash驱动实现、读写测试
    ' X: D* G& h7 r" B6 p- j
  8.   ******************************************************************************
    ! U# p# D- r, f7 {$ E6 g
  9.   * 说明:! `7 E9 J3 k; }
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。
    3 `, c1 @& s* ?* _" B( Y3 q3 r' j, V8 N
  11.   * & ~6 r& @0 i' ]$ ]  j" W
  12.   * 淘宝:
    4 U% c  G% u  r/ \- ~. l
  13.   * 论坛:http://www.ing10bbs.com9 q" @7 E# a% X
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。! j, k3 [% x; Q+ p8 D9 W
  15.   ******************************************************************************
    1 k9 R1 x- N$ b& v; m% |
  16.   */* m* n2 w$ z* u  U; E0 u# Q
  17. /* 包含头文件 ----------------------------------------------------------------*/
    ; W/ `7 Q; j4 e& M
  18. #include "stm32f1xx_hal.h"( i) b2 j7 t: \' C2 E
  19. #include "usart/bsp_debug_usart.h"; y& G: A8 J' x) S, k, W: X2 K6 Y/ G
  20. #include "spiflash/bsp_spiflash.h"+ G0 D  c0 _+ W7 g: L& \0 Z
  21. #include "led/bsp_led.h"& }5 e( G0 L$ [5 g2 r" T! @
  22. ) r3 @( F- b. _  p7 M% Q
  23. /* 私有类型定义 --------------------------------------------------------------*/. ]/ G) d. B* [) U( V- G* j
  24. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;  D5 @/ I5 ], k4 T

  25. ' l( f% a/ i) k8 q
  26. /* 私有宏定义 ----------------------------------------------------------------*/
    # U+ y% w4 S' b9 e, ?5 A) O
  27. /* 获取缓冲区的长度 */
    ' C- ?; |/ m# H) z6 D# n# \, o* Z
  28. #define countof(a)      (sizeof(a) / sizeof(*(a)))5 S2 l' h- T& I
  29. #define TxBufferSize1   (countof(TxBuffer1) - 1)
    2 E, N# y/ m0 @# ^1 F5 G! v
  30. #define RxBufferSize1   (countof(TxBuffer1) - 1)4 N8 _" l! A+ B! n- }, a( @+ w) A
  31. #define BufferSize      (countof(Tx_Buffer)-1)- q$ |8 u& k& Y# j8 s( s

  32. ( G* |) g  ?. J  i6 v
  33. #define  FLASH_WriteAddress     0x00000
    8 k2 J5 G1 y% H4 g/ Z
  34. #define  FLASH_ReadAddress      FLASH_WriteAddress' }. x  u; b8 F, ]* x' l
  35. #define  FLASH_SectorToErase    FLASH_WriteAddress8 g# S" G  [% x
  36. 3 |* [+ S0 y) \
  37. /* 私有变量 ------------------------------------------------------------------*/
    6 C) l1 a# k. ~0 `
  38. uint8_t Tx_Buffer[] = " 感谢您选用硬石stm32开发板\n今天是个好日子";
    % h1 `* y1 z' a# K! B
  39. uint8_t Rx_Buffer[BufferSize];
    ' o& o8 y+ R6 |: ^- N3 t

  40. 2 z& [+ e& ^# e6 M" e
  41. __IO uint32_t DeviceID = 0;, s8 s  ^; D/ T6 b9 i- ?
  42. __IO uint32_t FlashID = 0;4 _! A* n! o; ]/ }9 c. Z1 d
  43. __IO TestStatus TransferStatus1 = FAILED;
    4 V8 f" L/ q7 U0 P1 R# y) [9 @+ T1 P
  44. 0 [5 o% I- L) j: }1 Y: }1 y
  45. /* 扩展变量 ------------------------------------------------------------------*/
    + F& u1 V* i+ I5 N" ]
  46. /* 私有函数原形 --------------------------------------------------------------*/
    , p; v2 f& y, a
  47. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);* ?' L; ]7 P% L7 d" g

  48. / O, B! ?+ p0 r
  49. /* 函数体 --------------------------------------------------------------------*/
    + `! Q  Z+ ?9 z4 S- o
  50. /**6 Y: l' F6 B' _7 e: j/ Y- x8 }
  51.   * 函数功能: 系统时钟配置
    + \/ C+ _8 p1 c0 C6 J8 m
  52.   * 输入参数: 无
    " ]. I% P7 o4 H% d- G7 z+ [8 s6 E' ^
  53.   * 返 回 值: 无
      g- i+ n' k2 W" h2 M; I, f
  54.   * 说    明: 无8 B9 m. w; {1 w+ y
  55.   */" |  }# I3 _3 P$ a  |
  56. void SystemClock_Config(void)
    % ]9 o: z0 I9 {. z! E
  57. {
    ' D- _3 T* Q  u2 m, `
  58.   RCC_OscInitTypeDef RCC_OscInitStruct;5 c4 ]6 \! ]* W0 z; Y. w
  59.   RCC_ClkInitTypeDef RCC_ClkInitStruct;1 e& L; i% I8 R) H

  60. ; J- \8 U+ s/ K2 x1 r/ l
  61.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
    5 F: [( v/ _8 x  t5 _( a1 ^& [. p
  62.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
    : k/ w; g- s7 \9 H0 S
  63.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    ! C& D" |1 R5 B1 C1 W
  64.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    4 |3 R' X% {4 o, Q/ z- C( x
  65.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    6 Z" I7 V0 h" B3 d* d# k9 z
  66.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟' n8 U1 |# G, {$ s6 e1 s) B" G
  67.   HAL_RCC_OscConfig(&RCC_OscInitStruct);/ o- D8 B! r  l
  68. ! D# `" Y  k) \2 j9 t% \! {2 j
  69.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    ) K( H; |( j$ r. i; B/ I  p7 H) x) F
  70.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;4 N6 U$ S8 Y+ v1 y0 K' t
  71.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz
    / R" e# y7 j4 h  ]3 n  C; D1 B9 F% |
  72.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz+ @8 x: K  {5 P" V2 l- |! k
  73.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz& q  d6 ?3 O3 U7 m6 w. G
  74.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
    $ T: t9 I- R6 R2 j
  75.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
    % [  d5 G8 o4 u  l4 N3 c) @4 I/ I
  76. 2 b" l" P' s7 X( P+ P
  77.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
    # ?, k3 K! _8 r# @
  78.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次% ~0 D7 W% Z& M5 d& k5 r' ]
  79.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次2 n1 z4 p/ D/ K. v0 W
  80.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器
    * {: V9 s) X9 M# o3 j4 |, O
  81.   /* 系统滴答定时器时钟源 */
    0 u( I' ~; s% t3 i! U) d; l% s" ^0 ~
  82.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);3 d' q% P& B7 z7 D; |
  83.   /* 系统滴答定时器中断优先级配置 */# W- G, Y0 S) z7 f% a! G" r' Z
  84.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);/ w) S6 u1 m; t! `4 n0 _
  85. }
    ! m0 h! q$ a% h! O5 O3 ?
  86. * r' |! ^) \% ^. ~* T
  87. /**$ H$ y! S  I4 o. [; S6 ]7 B: n4 f
  88.   * 函数功能: 主函数.8 p  i5 J$ [: {& B0 S6 Q
  89.   * 输入参数: 无
    5 r- R4 x# r- E
  90.   * 返 回 值: 无
    ( E$ ^: G( x, q, A! V' y- `% c% K/ ?
  91.   * 说    明: 无
    9 W+ k0 K5 V3 ]! J. J0 Y
  92.   */( b3 j& m# s! E' j
  93. int main(void): X2 l0 T5 w$ l- G# H9 \$ {
  94. {  0 C! Y0 ~$ P  o- F3 g
  95.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */5 B9 N( \5 c7 L* {$ G7 i6 |6 F
  96.   HAL_Init();
    $ V( R; O" a% t1 |
  97.   /* 配置系统时钟 */
    0 |5 P& _2 p* E1 x; \' G
  98.   SystemClock_Config();
    ; D! @8 q7 U2 Y, K/ U, }3 _& x
  99. ! p/ g' t0 x. J1 a1 X5 Z: l% x1 l+ A" R
  100.   /* LED灯初始化 */& B4 G" F! z/ g; h% ^8 S/ B
  101.   LED_GPIO_Init();/ W3 S# t1 c- E! p- u$ Z8 _
  102.   
    ! J7 r& j7 l; s5 }9 c
  103.   /* 初始化串口并配置串口中断优先级 */
    ) ^; y4 m7 `6 E! h2 T
  104.   MX_DEBUG_USART_Init();7 Y+ v7 w- n% e1 x( Z# s
  105.   /* 调用格式化输出函数打印输出数据 */' @" |/ \# l8 d2 t8 |
  106.   printf("这是一个16M byte串行flash(W25Q128)读写测试实验\n");
    : W1 Q# O6 V. G% L' g7 p1 G
  107.   ' O  e+ g$ v3 r: |4 {2 ~/ C
  108.   MX_SPIFlash_Init();6 R7 p+ _' M0 H+ r
  109.   
    5 [# {9 l: X. N' V
  110.   /* Get SPI Flash Device ID */; e8 n- W) ^$ T
  111.         DeviceID = SPI_FLASH_ReadDeviceID();  s8 |6 t. x8 J$ |0 f7 U
  112.   & Z$ @. j8 t# |) o% U- P( Z( ]
  113.   HAL_Delay(100);  N' _8 p" o4 d% R" I, ~. ^. z
  114.   ( |" R9 F4 q+ i- m/ \+ Q# t
  115.   /* Get SPI Flash ID */! w% P6 p! o: m9 ^
  116.         FlashID = SPI_FLASH_ReadID();
    ! t1 p" W) F; x) X" s
  117.   : ]; Z2 K) i) N
  118.   printf("FlashID is 0x%X,  Manufacturer Device ID is 0x%X\n", FlashID, DeviceID);1 a  I0 u4 M8 A% b4 z
  119.         
    6 ^2 q% |$ y% T! P$ H1 n4 K
  120.         /* Check the SPI Flash ID */0 w  m. n, o# S3 S
  121.         if (FlashID == SPI_FLASH_ID)  /* #define  sFLASH_ID  0XEF4018 */2 T( ?5 X7 ~8 m3 B! q! @" g
  122.         {        / R$ |+ J( D7 Q& v
  123.                 printf("检测到华邦串行flash W25Q128 !\n");, B" |, B; o! }% q$ Q( X
  124.                 - g$ b! p- \. \8 U6 S( U
  125.                 /* 擦除SPI的扇区以写入 */: ]  ?/ d; ?' F. `! X1 p! L
  126.                 SPI_FLASH_SectorErase(FLASH_SectorToErase);                  6 D0 a! @$ Q5 w, T
  127.                 $ P& j# I4 y& Z4 T5 L; W
  128.                 /* 将发送缓冲区的数据写到flash中 */         
    / I$ _1 e2 {* T9 N% Y
  129.                 SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);
    0 p4 p- ~, V  g+ f1 ]2 Y; U+ H
  130.                 SPI_FLASH_BufferWrite(Tx_Buffer, 252, BufferSize);
    6 |4 C! I0 W4 P) G5 K3 C2 \% x: `
  131.                 printf("写入的数据为:\n%s \n", Tx_Buffer);( Z8 O; d+ |1 q- f
  132.                
    ' R. e& u% B  s! D* o/ Y9 Q6 o) v
  133.                 /* 将刚刚写入的数据读出来放到接收缓冲区中 */. D9 S2 L5 U+ ?
  134.                 SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);/ d* l" H+ ~3 f" m3 j
  135.                 printf("读出的数据为:\n %s\n", Rx_Buffer);
    # Z, \  R! m# W( @, ?
  136.                 1 p" p# B# b9 \5 [' D
  137.                 /* 检查写入的数据与读出的数据是否相等 */
    " P, j" C  g9 W) {% @$ J/ _1 q
  138.                 TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
    7 J' i2 E! j  ]( J6 j$ C
  139.                
    0 `& P1 ]- o$ s: `  B  S! r1 f
  140.                 if( PASSED == TransferStatus1 )
    6 I$ m  G) I( N3 _! a& u
  141.                 {    ! ^# ^3 |# d! m) |
  142.                         printf("16M串行flash(W25Q128)测试成功!\r");2 _4 B8 H1 Q+ O
  143.                         LED1_ON;3 B/ C! q5 f0 h3 ?/ m0 q
  144.                 }
    2 s% y, g0 F/ V8 e
  145.                 else
    * b2 b4 G3 O. d
  146.                 {        
    & ~" |& x+ w/ z% l; ^
  147.                         printf("16M串行flash(W25Q128)测试失败!\r");
    3 U' i4 q' T' b6 B- s) L
  148.                         LED2_ON;
    4 q' Z1 b' K, k+ p6 G  q% `
  149.                 }
    ; _( U& l- V: o$ N: P2 r0 ~
  150.         }7 [$ b( G+ Z9 V# A2 ~6 M: w
  151.         else
    : D/ w  v- z6 w+ P/ S
  152.         {   
    - G" a! ]6 X, F3 k; \# }& L9 t
  153.                 printf("获取不到 W25Q128 ID!\n");% t1 r# i5 ^6 i; x
  154.                 LED3_ON;! `: y7 p$ z' v+ N; z; N# r% q, X
  155.         }
    " b" J1 C- O* a2 l2 O! {# W
  156.   6 f' X% r; x) b$ v$ j. i) I
  157.   /* 无限循环 *// @) e2 F8 C0 X' n
  158.   while (1)
    & z- T; O9 J3 T9 n1 Q5 t8 O
  159.   {
    7 Z' t. d/ ^  `
  160.   }" m; [1 I% t" b' `3 B7 @/ @( Z
  161. }4 i# }: C, v! v( d

  162. ; T$ }) D" q! q1 K3 z% @- q2 a7 R5 D
  163. /**
    6 Z! C8 d! w7 Y2 b% [
  164.   * 函数功能: 比较两个缓冲区中的数据是否相等
    ; r4 B+ _" f* \" q" K* d
  165.   * 输入参数: pBuffer1:要比较的缓冲区1的指针! s: ~6 s" _4 g
  166.   *           pBuffer2:要比较的缓冲区2的指针: S# n# ?$ m+ `7 M* {! m& y2 E
  167.   *           BufferLength:缓冲区长度
    9 U) W# ]' D7 k4 |1 ~7 _2 }( d9 p
  168.   * 返 回 值: PASSED:相等) o8 h& O' \! D0 S+ V$ C
  169.   *           FAILED:不等# y( d, V( W* `; O: [: j9 q
  170.   * 说    明: 无
    % a& W( n  @; o6 j- M, C
  171.   */
    1 @8 r4 H) O% d8 I
  172. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
    9 U9 D. R) v5 ?2 U
  173. {+ A- O. q: Y" U: X* ]3 C
  174.   while(BufferLength--)" R; `- d' u$ Q8 A$ \  l
  175.   {& R0 K! @9 |6 ]& k3 J  Q9 U
  176.     if(*pBuffer1 != *pBuffer2)  P- x/ ~3 a9 X! e
  177.     {
    ; Q3 b% I0 a1 |' j
  178.       return FAILED;
    9 _2 _0 d% @, ~1 d
  179.     }% O9 K( u; T9 e0 G
  180. : z6 u5 N" [2 b3 e) u# a; P
  181.     pBuffer1++;/ R9 u0 s( w" Y7 p$ {0 Y4 C. g
  182.     pBuffer2++;
    6 P2 ]( v  z7 q+ N
  183.   }4 l" X. X# l/ D
  184.   return PASSED;
    7 h" S$ S$ x. l1 k. }' R$ j
  185. }/ V; s4 j* F+ h' \4 g: b" K7 y
  186. 9 M  T& P8 r: ]
  187. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
    0 i) q0 x7 d7 ]) Q# Z' t
复制代码
+ j( J: ~: H1 S# q6 G1 u
串口调试助手截图.jpg
: s* C7 [  `5 Z7 ^' \- d' q
' C. ]" p0 c1 Q3 S$ a' Y: g

9 L+ z0 M: B) L; g% F! `, |
收藏 2 评论9 发布时间:2016-6-20 08:57

举报

9个回答
haohao663 回答时间:2018-9-12 08:47:31
wuhuayu 发表于 2018-9-11 16:41
/ b: r/ V+ K/ D* l. p$ r  ]! N你好下载地址失效了,可以重新发一份给我吗?谢谢" i0 B2 o6 v9 f6 y# D2 O& Z; {$ O
我的邮箱是:

# @7 r$ \% A: i" N3 V- L硬石YS-F1Pro开发板资料
  P9 l6 m  M* F# @' e百度云盘: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/ X! l- B8 N* L4 o! P9 O8 y+ h
楼主没把SPIFLASH.c文件放上来啊
! v# l5 i1 Z( ?! Y- E- A5 O
链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v& a% [& f: p# Z; x8 t9 T, h2 N2 z
网盘下载例程看
jinshan2014 回答时间:2017-11-16 13:48:04
你好!下载地址失效了,能给我重新发一下吗?谢谢 707890493@qq.com
haohao663 回答时间:2017-11-16 19:30:28
jinshan2014 发表于 2017-11-16 13:48# ~) p' T& a, t
你好!下载地址失效了,能给我重新发一下吗?谢谢

! P& q. c" i6 P链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
wuhuayu 回答时间:2018-9-11 16:41:16
你好下载地址失效了,可以重新发一份给我吗?谢谢4 d/ Q0 A# T, |4 {  s
我的邮箱是:1070203527@qq.com
zqs333 回答时间:2019-9-18 12:32:59
下载失效,请发一份例程给我,谢谢。546634227@qq.com。谢谢

所属标签

相似分享

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