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

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

[复制链接]
haohao663 发布时间:2016-6-20 08:57
本帖最后由 haohao663 于 2016-6-20 15:20 编辑
* x8 U9 A& p# W/ Z
" D- c& \  ^8 e0 O9 s【HAL库每天一例】系列例程从今天开始持续更新。。。。。
% A! f" u6 H7 d: x+ b5 I5 ^* O  i我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,) Z1 E) ?6 R' S& c" x; I& k$ n- g
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
4 O0 M  I- U6 I! |, g同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。4 L9 h4 ^' g0 `/ Q; }! u
例程下载:3 u, K, `! a! z3 u8 ^
资料包括程序、相关说明资料以及软件使用截图
/ Q% D: N) _3 Z链接:https://pan.baidu.com/s/1i574oPv ! T  z- h4 E; u" C7 n/ [% B7 S/ k
密码:r3s3; v& \& Z4 M5 c' x8 `6 q
(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-046. SPI-串行Flash)9 z/ Q& o% x9 ^. g" n, _

) m2 e' l' s7 i" @6 Z8 l  I/**
- f" G# Y: F$ @  ******************************************************************************/ W( J  n3 p( ]9 s, O+ J
  *                           硬石YS-F1Pro开发板例程功能说明
: L3 g+ u  f5 G1 E  *
7 E+ r8 o. D3 b. J$ K5 h; y  *  例程名称: 1. 串行Flash读写测试
9 H& m$ I) Z- v  *   
5 B$ z1 d4 w3 Y5 c2 ]  ******************************************************************************
. A: g, y9 g( S$ X) x& p! @8 H  * 说明:
2 x' }# c/ d/ D( S+ h  * 本例程配套硬石stm32开发板YS-F1Pro使用。6 ~2 {8 O- x+ y0 R! c- D
  *
: K$ e6 {6 [5 D2 z) `  * 淘宝:/ Q2 D- z$ t. @2 b) z6 X
  * 论坛:www ing10bbs com& v* ^2 E! Z' C( W7 P( d
  * 版权归硬石嵌入式开发团队所有,请勿商用。" z6 S# @/ N2 g
  ******************************************************************************+ e0 y7 j" Z. U! G+ E
  */
1 z, I2 s$ {7 p/ r% N8 p/ C. u8 E. W. _2 N
【1】例程简介
" t+ R8 ^* M* T# P- S, r  串行Flash用于存储数据。YS-F1Pro开发板集成了一个16M字节的W25Q128串行Flash芯片,可以
, X6 v. ~! Y/ R% \+ v用于存放数据。该芯片使用SPI1通信接口。
! ~- R  {7 e' `; Q+ X  
: \  u6 m4 Z& ]+ r【2】跳线帽情况+ ~5 Z8 `( Q4 k, r1 l! u
******* 为保证例程正常运行,必须插入以下跳线帽 **********2 N# A+ A1 Y0 b( j4 e; ^  ?
丝印编号     IO端口      目标功能引脚        出厂默认设置. |. \, i6 K2 T0 z8 T) W4 P" Z+ n
  JP1        PA10        TXD(CH340G)          已接入
: l5 u# x2 Y; `  Z  JP2        PA9         RXD(CH340G)          已接入# [" R0 f) S( q5 Q. a4 E" E
  JP3        PB0           LED1               已接入* o7 u2 k/ x9 D+ V% Y& r$ H: _4 D
  JP4        PG6           LED2               已接入' ~6 m$ B4 a; S; Y, @
  JP5        PG7           LED3               已接入- G; C" S/ T6 L
  
% I9 m2 l( H5 m- o1 Z' q4 F: K0 O【3】操作及现象* k4 b" a4 j/ |$ h
使用开发板配套的MINI USB线连接到开发板标示“调试串口”字样的MIMI USB接口(需要安装驱
5 {4 e0 d0 g& q$ b. o  Y动),在电脑端打开串口调试助手工具,设置参数为115200 8-N-1。下载完程序之后,在串口调试
, S/ V. ^' h- M+ p助手窗口可接收到信息。只有LED1灯亮说明串行Flash读写测试正常。
% C5 D* M3 S% }' @, S6 A" t/ {
9 a" I3 F) {3 G1 U  {$ u/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

1 ~$ V7 i* A) w4 D6 j CubeMX_1.jpg * i8 y! ?$ e% E" x3 b, b
CubeMX_2.jpg 6 n* N3 e$ K2 v* C' p
CubeMX_3.jpg - o2 W# j) B$ _9 C# Q
CubeMX_4.jpg   R" J" ?1 I, z4 b, o  b  h
; ?6 N' }) w: w

, X+ {' j  r) V0 P3 O; _, `
  1. #ifndef __BSP_SPIFLASH_H__
    * r, n* K. Z4 M
  2. #define __BSP_SPIFLASH_H__
    ) ~( B3 E3 N  A$ J

  3. + K8 b+ ~0 [$ ~
  4. /* 包含头文件 ----------------------------------------------------------------*/
    : K# x" g, n4 I. s' }  B
  5. #include "stm32f1xx_hal.h"7 l4 L# {3 \/ i$ c) l- e% `8 f0 U: b

  6. 2 H; m, Z& v) W; t
  7. /* 类型定义 ------------------------------------------------------------------*/
    - i5 N. u  |# J* j  G3 R
  8. /* 宏定义 --------------------------------------------------------------------*/
    * |$ K7 z/ O$ {+ v
  9. //#define  SPI_FLASH_ID                       0xEF3015     //W25X16   2MB
    & L0 R) p' l2 P" I
  10. //#define  SPI_FLASH_ID                       0xEF4015           //W25Q16   4MB
    7 u% Q2 S. {" j; l
  11. //#define  SPI_FLASH_ID                       0XEF4017     //W25Q64   8MB
    + W2 z) c) c" g8 h  i- H. ~
  12. #define  SPI_FLASH_ID                       0XEF4018     //W25Q128  16MB YS-F1Pro开发默认使用
    ) i& @' q" f% e6 @0 b

  13. 4 C1 O; Z2 c& D  {9 g
  14. #define FLASH_SPIx                                 SPI19 g& x- D' F+ O+ n
  15. #define FLASH_SPIx_RCC_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()
    2 J# {7 A; ~. D$ t3 e; ^
  16. #define FLASH_SPIx_RCC_CLK_DISABLE()               __HAL_RCC_SPI1_CLK_DISABLE()
    # P5 z* s1 m( L; |* [

  17. * u6 \1 ^- u  N, U, l; }" n+ D
  18. #define FLASH_SPI_GPIO_ClK_ENABLE()                __HAL_RCC_GPIOA_CLK_ENABLE() ' P) L3 M3 U6 ?( |4 v6 _6 i
  19. #define FLASH_SPI_GPIO_PORT                        GPIOA
    ! z: F, p: ]! g# F1 H
  20. #define FLASH_SPI_SCK_PIN                          GPIO_PIN_5+ n4 z7 g1 p6 U! I5 P
  21. #define FLASH_SPI_MISO_PIN                         GPIO_PIN_6
    2 P% N, [1 \( \1 U
  22. #define FLASH_SPI_MOSI_PIN                         GPIO_PIN_7% e0 ?. T% l2 t0 Q4 c- D6 X

  23. / t5 P) u# Q+ B% z* P
  24. #define FLASH_SPI_CS_CLK_ENABLE()                  __HAL_RCC_GPIOA_CLK_ENABLE()    + M, A1 L" E4 B
  25. #define FLASH_SPI_CS_PORT                          GPIOA
    : {' s" p4 n) U; o$ h2 F
  26. #define FLASH_SPI_CS_PIN                           GPIO_PIN_4
    / V7 b8 g) `+ G# s0 v5 D

  27. ) Y" `( n% [; c1 D; k4 o5 l
  28. #define FLASH_SPI_CS_ENABLE()                      HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_RESET)1 V# ~& f& i% i& N: Y  M
  29. #define FLASH_SPI_CS_DISABLE()                     HAL_GPIO_WritePin(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN, GPIO_PIN_SET)
    / _$ a0 K8 S8 Z
  30. $ B* s2 B( G3 f& y+ z$ L5 o
  31. /* 扩展变量 ------------------------------------------------------------------*/
    * \: H9 b: _! [( g
  32. extern SPI_HandleTypeDef hspiflash;
    8 `3 o7 K. A* Z# u

  33. ! \+ s' E4 b+ h* D
  34. /* 函数声明 ------------------------------------------------------------------*/
    2 }+ }4 J, a+ H/ C9 q, o2 K

  35. 3 _3 {+ r* ~( E" g( v
  36. void MX_SPIFlash_Init(void);
    ( I8 P: F! ^+ h& ~5 e
  37. void SPI_FLASH_SectorErase(uint32_t SectorAddr);9 w7 a" a, c' t1 o( k, `% O) p4 [; n- s
  38. void SPI_FLASH_BulkErase(void);$ Z5 w6 o; ^' _7 |) G* M
  39. void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);  |1 m9 b9 G/ b2 y6 }6 E1 l
  40. void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
    4 A/ [3 t' W; b7 d" e& q
  41. void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);7 O# A9 z2 K, h# ^
  42. uint32_t SPI_FLASH_ReadID(void);# o# V7 a  R. M& g" m! q8 T
  43. uint32_t SPI_FLASH_ReadDeviceID(void);; _/ o- G9 Y4 z8 h* ]' j7 p9 \
  44. void SPI_FLASH_StartReadSequence(uint32_t ReadAddr);
    1 s  C9 E5 r' `% W* x
  45. void SPI_Flash_PowerDown(void);9 p- e1 {7 N) J( H0 v
  46. void SPI_Flash_WAKEUP(void);0 C5 a1 ~0 C! M: ]  Q/ |- j( w

  47. ) h9 Q& R1 G+ N! w; C
  48. uint8_t SPI_FLASH_ReadByte(void);
      u; O, V" z* M
  49. uint8_t SPI_FLASH_SendByte(uint8_t byte);; k2 x7 J0 m$ [, a1 W' H( v$ X; {
  50. void SPI_FLASH_WriteEnable(void);
    " ]1 j- f& ]; j) Y1 I& |, H, m- t7 k
  51. void SPI_FLASH_WaitForWriteEnd(void);% M7 @+ b7 X9 a1 _% e/ z9 z% G

  52. % g/ L: ?# @% Z% O/ r$ _! |3 D
  53. #endif  /* __BSP_SPIFLASH_H__ */
    * d# n5 ^4 {" c4 r
  54. 9 }, ~) q  E8 `+ g* @3 d/ i
  55. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/4 G% Y1 k; b' g
复制代码
, b/ G' E9 ]/ q  \
: P6 X4 q% w' U; E' ]* \- W
  1. /**4 `( p# f4 \: |% ?& E& o
  2.   ******************************************************************************4 J7 x( X8 ~1 [) r+ L
  3.   * 文件名程: main.c ; z" R4 R8 f( [
  4.   * 作    者: 硬石嵌入式开发团队6 l) [" R/ z% B* a
  5.   * 版    本: V1.0/ t( s  L: O( p& e
  6.   * 编写日期: 2015-10-048 K- z) V" L4 z
  7.   * 功    能: 串行Flash驱动实现、读写测试
    * ~* Q- o" U  O+ }$ m
  8.   ******************************************************************************5 o, C5 f. F  p& M- T& ?
  9.   * 说明:4 g5 U) `8 b, x
  10.   * 本例程配套硬石stm32开发板YS-F1Pro使用。  [9 q0 a1 B$ S
  11.   *
    # e$ ]# S0 E6 e- J
  12.   * 淘宝:6 j# F! J4 |7 i, \, B
  13.   * 论坛:http://www.ing10bbs.com2 A1 X5 m* d7 }& y7 b
  14.   * 版权归硬石嵌入式开发团队所有,请勿商用。
      v# A" T/ L7 a+ u6 z( y0 {7 i4 I( j, T
  15.   ******************************************************************************
    6 \( X. ~' q; M# y- _- @
  16.   */( f! S! v: i% h7 x
  17. /* 包含头文件 ----------------------------------------------------------------*/* z+ Y# u& O" u" U; y* _. i' }$ W% K
  18. #include "stm32f1xx_hal.h"& q* D) [+ ?4 a3 L2 g# g: u
  19. #include "usart/bsp_debug_usart.h"
    9 X3 j( D: Z. a2 i  n0 _/ G7 I
  20. #include "spiflash/bsp_spiflash.h"3 Q4 x) D+ \. m2 l. E& [6 u
  21. #include "led/bsp_led.h"3 q# [: J# f( A; m

  22. 3 t( |' ?% f9 z1 |" j! x6 I
  23. /* 私有类型定义 --------------------------------------------------------------*/
    / Z  k* T/ A' Y4 g
  24. typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;( t. z2 i  t, S) r; ?. a- s

  25. 0 u' i! g( o; U% `4 w8 B9 L, i
  26. /* 私有宏定义 ----------------------------------------------------------------*/5 M2 K7 X& t) q7 w* _" u  H
  27. /* 获取缓冲区的长度 */- W1 \' c1 I$ b$ U; P, B
  28. #define countof(a)      (sizeof(a) / sizeof(*(a)))6 p9 j, o) n; i8 W: P4 X& p3 m
  29. #define TxBufferSize1   (countof(TxBuffer1) - 1)( g1 C( M/ I5 q# Y' R( t
  30. #define RxBufferSize1   (countof(TxBuffer1) - 1), [, _( f. l% m) o
  31. #define BufferSize      (countof(Tx_Buffer)-1)
    ( Z4 S* ?1 n$ M

  32.   w. X4 B# ~0 m+ s
  33. #define  FLASH_WriteAddress     0x00000% O: \! K: z/ z2 A! {0 A2 R
  34. #define  FLASH_ReadAddress      FLASH_WriteAddress% ?+ U  q( D$ ~: G3 [. E' o
  35. #define  FLASH_SectorToErase    FLASH_WriteAddress
    , F* [% u5 W9 {% P& L" _0 J

  36. ! `3 N( x; m7 ]" Q
  37. /* 私有变量 ------------------------------------------------------------------*/: E8 g! A' |" [# R2 a8 m4 c
  38. uint8_t Tx_Buffer[] = " 感谢您选用硬石stm32开发板\n今天是个好日子";6 x' _/ p7 x8 ~; k: J4 ?
  39. uint8_t Rx_Buffer[BufferSize];1 Y& G2 F/ P3 ?) k8 _
  40. + I. s  |. X2 _7 E# E
  41. __IO uint32_t DeviceID = 0;8 l9 \) w3 U1 }* g
  42. __IO uint32_t FlashID = 0;
    ' X8 h; j, e1 [6 R) \& i8 Q
  43. __IO TestStatus TransferStatus1 = FAILED;
    $ H* n6 L2 F! ]4 I

  44. 2 Y1 F+ J' l7 I* Q3 L
  45. /* 扩展变量 ------------------------------------------------------------------*/
    8 ]8 P9 m" E2 q' j
  46. /* 私有函数原形 --------------------------------------------------------------*/% F  v+ ?4 U# s5 ]" u: p
  47. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);1 Z2 ]( j7 ]5 D) p

  48. 5 P9 Q! j1 C" c. o9 v5 Q5 F) G* m* t
  49. /* 函数体 --------------------------------------------------------------------*/: @9 d2 F- g4 g( v0 m! m
  50. /**6 k0 d6 j/ ~$ p" R% o
  51.   * 函数功能: 系统时钟配置
    $ R8 v  d! w1 g! g! k
  52.   * 输入参数: 无
    & J. E9 k6 x  v) J) ~
  53.   * 返 回 值: 无* A* |7 a& p* I# N8 z7 {
  54.   * 说    明: 无
    & u+ w0 {2 P/ n6 U! G$ x; L
  55.   */
    5 r; z- F  ^0 t/ d
  56. void SystemClock_Config(void)
      b# ]! S& V8 f$ ^( |" Z" }
  57. {
    6 ]& Q0 \$ j* v" G" Q- ?* J: K
  58.   RCC_OscInitTypeDef RCC_OscInitStruct;2 J4 j) N0 I4 N8 P' J  w; \
  59.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    ; E( o9 D1 J  a. B' D

  60. ; _# h7 V- p9 p# e1 D  j" K
  61.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  // 外部晶振,8MHz
    # w! P& j, b1 A6 t8 Y9 a
  62.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;+ B  o/ T. K! p
  63.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
    0 v" d# [* N  C, Y$ b% i/ i
  64.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    " Z" H. c1 l8 d. x, G' [7 P
  65.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    6 ^) D. |/ g! |$ ^+ l
  66.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 9倍频,得到72MHz主时钟
    - x, x0 p( J' ]5 F
  67.   HAL_RCC_OscConfig(&RCC_OscInitStruct);; n9 S3 N9 K5 X( ?
  68. % o4 N' J' C' H% `: J% U  {
  69.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
    2 Z* f1 ]' @& V' ]6 r( g! T
  70.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    , J+ `9 Y. l& ~$ i8 L- O+ R
  71.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;       // 系统时钟:72MHz6 E* e! v3 |! h3 u) |: v& t
  72.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;              // AHB时钟:72MHz
    ! |7 A- Q' i& j$ k* }
  73.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;               // APB1时钟:36MHz4 z* b0 H3 {4 e7 c! i3 J% e0 p. k
  74.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;               // APB2时钟:72MHz
      V0 Z4 P5 X$ H: b
  75.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);( N' b( M1 P7 k. H( |# a
  76. - t3 D/ l, P, f) J, i  h
  77.          // HAL_RCC_GetHCLKFreq()/1000    1ms中断一次
    * q" j: K/ L0 n% g
  78.         // HAL_RCC_GetHCLKFreq()/100000         10us中断一次( @9 Y, Q2 Y5 i0 F* {* ?
  79.         // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次* N5 X% a* x1 r( Q, S# M
  80.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  // 配置并启动系统滴答定时器9 z) ~8 l1 {# m9 N! L* m' E* x* |
  81.   /* 系统滴答定时器时钟源 */( D% L' S) J; }0 R
  82.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    ( V& L1 y$ D; }. T9 w% ]
  83.   /* 系统滴答定时器中断优先级配置 */6 J  \+ q' v, r  l# \/ u
  84.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    0 n' f4 G$ S4 s8 n. P' [" {9 O% {
  85. }
    5 L4 e$ R* U/ {' i

  86. 5 b% _, U* V0 ^7 i* y
  87. /**
    6 u, \. o, W' b- F# n
  88.   * 函数功能: 主函数.8 @$ `( G- T, l' e: x( @
  89.   * 输入参数: 无0 a" t! m) E$ y/ X7 D' V1 _1 c
  90.   * 返 回 值: 无7 o" `' g: b  W3 U
  91.   * 说    明: 无
    ; ^3 f+ n0 M) z$ t/ C: a
  92.   *// W7 h) R7 b+ E$ j, n  H
  93. int main(void)
    : J, u' ?4 x" Z! ]( M1 {) d
  94. {  # B9 t4 q- l+ f# U5 |7 b) y$ [" G% ~
  95.   /* 复位所有外设,初始化Flash接口和系统滴答定时器 */& f# X+ i  e- ~. c; t
  96.   HAL_Init();
    ) y" x; ^7 C9 Q  e2 o6 N* X
  97.   /* 配置系统时钟 */
    / {; N+ e4 I7 u" L; P+ V
  98.   SystemClock_Config();
    5 y' H4 D' _, [6 u( F/ A& S8 T
  99. ! Y! e( V6 q$ ~# `7 t
  100.   /* LED灯初始化 */$ p8 @9 P. M4 A: U. e
  101.   LED_GPIO_Init();
    ) q$ t2 P9 P  l4 t+ v3 W$ M
  102.   
    8 ?  n3 W. J, C1 M
  103.   /* 初始化串口并配置串口中断优先级 */
    & D6 u% i! n( k: `* M/ F, ?$ N8 c4 s
  104.   MX_DEBUG_USART_Init();: h: T+ j  x9 |
  105.   /* 调用格式化输出函数打印输出数据 */
    2 }2 K* q2 R! b4 J+ K6 L6 J+ r% `0 q
  106.   printf("这是一个16M byte串行flash(W25Q128)读写测试实验\n");
    / [" I! M/ {! `# Q- J2 x0 G
  107.   0 _* \! _4 O0 _) {$ A1 C# G
  108.   MX_SPIFlash_Init();1 c' h! ?( K# n: X5 @' j4 f
  109.   
    ) o+ V7 @* U9 U/ Z, C
  110.   /* Get SPI Flash Device ID */$ J% w. N) [; Z6 }2 K
  111.         DeviceID = SPI_FLASH_ReadDeviceID();0 b# z2 z1 H/ i  x  U, _
  112.   
    ( U# h9 f9 |+ y9 d. i
  113.   HAL_Delay(100);5 Z4 z. g  W& W
  114.   
    2 `7 z# @+ D3 I+ u4 D
  115.   /* Get SPI Flash ID */
    7 m3 h8 C1 S5 o
  116.         FlashID = SPI_FLASH_ReadID();# Q+ z& s2 f' T* m
  117.   
    4 C: w4 t  @2 k+ K! K
  118.   printf("FlashID is 0x%X,  Manufacturer Device ID is 0x%X\n", FlashID, DeviceID);3 V0 M4 l( x% A5 z7 @
  119.         
    # z. I9 Y% y" c: P( _  u& l3 ~
  120.         /* Check the SPI Flash ID */
    . W. F* H# S' x6 {( [. @4 X
  121.         if (FlashID == SPI_FLASH_ID)  /* #define  sFLASH_ID  0XEF4018 */4 l* A# \( a* p- o5 c, L6 Y* z3 l+ q
  122.         {        
    ) |! s) }* b7 p* [9 o6 z9 `
  123.                 printf("检测到华邦串行flash W25Q128 !\n");& {* O/ ]( d& s/ X. H
  124.                
    2 g) ^2 J8 L9 d* X
  125.                 /* 擦除SPI的扇区以写入 */2 C9 S1 e  r7 }6 V$ L* ?
  126.                 SPI_FLASH_SectorErase(FLASH_SectorToErase);                  
    6 ~& h) r; I; t2 H6 z
  127.                 . f, h/ K# f7 L$ x3 F% d( a
  128.                 /* 将发送缓冲区的数据写到flash中 */         4 }9 O) {. |- r1 j* R! |) v
  129.                 SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);! E& l3 Y5 ~" w
  130.                 SPI_FLASH_BufferWrite(Tx_Buffer, 252, BufferSize);6 |! V, f1 {& b9 S$ X/ e6 D
  131.                 printf("写入的数据为:\n%s \n", Tx_Buffer);' j$ }! o3 a; O  O
  132.                
    5 [  z' D- m5 z. M
  133.                 /* 将刚刚写入的数据读出来放到接收缓冲区中 */
    & J/ Q2 v$ n! s/ @
  134.                 SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
    # j2 [  j. H5 X( D0 N  ]
  135.                 printf("读出的数据为:\n %s\n", Rx_Buffer);
    0 r& U# I0 @3 O
  136.                
    * k( j; ^* N' F  j# S
  137.                 /* 检查写入的数据与读出的数据是否相等 */% b0 j/ k; u' c+ l% h
  138.                 TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);! ~( Y. i5 A1 U6 t- [
  139.                 2 s% [+ m6 B* p1 V/ u
  140.                 if( PASSED == TransferStatus1 )
    " b: T" o' R$ r; w6 A6 W5 n$ R
  141.                 {    9 g. ~* m" W, e8 N
  142.                         printf("16M串行flash(W25Q128)测试成功!\r");
    ! y' ?; Z7 M& _) l9 m6 ~
  143.                         LED1_ON;2 [  d! I+ B+ W9 w  _# C" T8 ^
  144.                 }
    3 `+ u3 c, r) y% Y, }7 p6 `# Z5 X; ^
  145.                 else
      c; W8 K0 @( s  h- e
  146.                 {        2 {& t' ]. U5 {  y
  147.                         printf("16M串行flash(W25Q128)测试失败!\r");5 n6 `: l; U% ~
  148.                         LED2_ON;
    6 t1 c1 M! l: K* n) d$ T1 i4 @
  149.                 }- k. q/ c' r" j6 k% O* A! ~
  150.         }: D" _% d: V+ r, [
  151.         else2 @" N0 X7 |8 V$ h2 `1 {$ A
  152.         {   
    ! R, y* T6 M; d+ }' t7 ?  e! a
  153.                 printf("获取不到 W25Q128 ID!\n");
    6 I$ o% ~' u, U9 c# e( Y: c1 o5 x
  154.                 LED3_ON;
    % ^) Q' Q9 B2 A# D3 g& P% f! ]
  155.         }
    / v) E6 l5 D9 D
  156.   " X$ P" ~9 x) a6 u& A+ q
  157.   /* 无限循环 *// p" z- z( O) u
  158.   while (1)
    $ B7 r. M+ j5 \+ o
  159.   {3 I7 i) R5 o! {# N# P
  160.   }- {4 O2 `' A, |: W' c
  161. }
    ' V, T  S, ]& S& Q' o" w
  162. . i! ?  N2 A) E1 w3 h
  163. /**8 v2 X$ i4 M( r
  164.   * 函数功能: 比较两个缓冲区中的数据是否相等
      C5 P5 p: C" j- h6 ?+ S3 t- z) q
  165.   * 输入参数: pBuffer1:要比较的缓冲区1的指针
    9 s* T* T( z7 e% N1 \! L' x. ~
  166.   *           pBuffer2:要比较的缓冲区2的指针
    5 r# H9 Q, V# V; h
  167.   *           BufferLength:缓冲区长度8 r3 q' g  j! S
  168.   * 返 回 值: PASSED:相等
    , ?6 Y; m- q; S  E; E2 `
  169.   *           FAILED:不等- @' F) Q! Q2 Z% E( e
  170.   * 说    明: 无; k9 z, d) V9 z% ~; [
  171.   */
    9 k' Q$ Z8 H0 K
  172. static TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
    / z( t3 ]; m- O
  173. {
    4 U/ ~9 b; P1 d7 q
  174.   while(BufferLength--). N6 P6 P2 H6 y9 K/ H% o
  175.   {" ^& F/ p' P3 ]% E! B
  176.     if(*pBuffer1 != *pBuffer2)1 P1 m/ V3 m/ n$ \
  177.     {' b- R8 r( n% V  J* O3 ]1 i& W
  178.       return FAILED;5 C, c; q/ A; d8 R+ n) G
  179.     }
    $ B$ V( Q9 a% L& }! C+ G3 k; I/ ~

  180. " b( x" _+ c9 ]; \+ _% y# j
  181.     pBuffer1++;
    % M# \" U1 y  [6 r8 b( N: |  B
  182.     pBuffer2++;% F) L/ |) h- W9 L# S6 U. [5 w/ w8 }
  183.   }
    . K. d- K, N7 j9 ]* y
  184.   return PASSED;/ N$ l, K: o  I
  185. }! m! |3 R1 |8 r1 g7 ~# D3 K/ {
  186.   R9 ~1 z  W* k) n6 k* y4 @
  187. /******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/# c, o; S0 x1 ^, j8 ^) S3 H
复制代码
- h" [* S5 j& p& X) P+ D# ~
串口调试助手截图.jpg # i* \' W. [; x: }

2 S4 \9 ]1 K  F7 Y+ K' {

' w8 _9 F# B9 e$ e' v% ~) F% o
赞 收藏 2 评论9 发布时间:2016-6-20 08:57

举报

9个回答
haohao663 回答时间:2018-9-12 08:47:31
wuhuayu 发表于 2018-9-11 16:41
. u: N" {- p/ t+ o) o# W2 {5 f5 S; Z- g你好下载地址失效了,可以重新发一份给我吗?谢谢; R5 M3 C* @5 v8 _
我的邮箱是:
  A- f- A, K. [7 g" B
硬石YS-F1Pro开发板资料$ I) |0 d% l6 V0 T/ u9 l
百度云盘: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# h7 \* W1 z7 t- E& @
楼主没把SPIFLASH.c文件放上来啊
8 O8 l6 L0 u2 W3 L& F. m
链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
( d6 n9 @! N0 e网盘下载例程看
jinshan2014 回答时间:2017-11-16 13:48:04
你好!下载地址失效了,能给我重新发一下吗?谢谢 707890493@qq.com
haohao663 回答时间:2017-11-16 19:30:28
jinshan2014 发表于 2017-11-16 13:48# i# _$ e8 y& w( r$ l- J
你好!下载地址失效了,能给我重新发一下吗?谢谢

7 P9 y! U2 _! n& J+ t9 t7 B链接:https://pan.baidu.com/s/1nvtZhVV 密码:416v
wuhuayu 回答时间:2018-9-11 16:41:16
你好下载地址失效了,可以重新发一份给我吗?谢谢7 t! R& V' E. B' }5 o
我的邮箱是:1070203527@qq.com
zqs333 回答时间:2019-9-18 12:32:59
下载失效,请发一份例程给我,谢谢。546634227@qq.com。谢谢

所属标签

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