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

ARM CMSIS Driver 学习 之 SPI

[复制链接]
XinLiYF 发布时间:2018-4-14 18:00
ARM CMSIS Driver 学习 之 SPI; t: E6 I  N, h4 a: F* v% V: m8 x

( u  D: m) S7 w; K0 n! s% K) D& L       CMSIS Driver 都有着相似的 API 函数和相似的调用方法,它是在 ST HAL 库的基础上又进一步的封装,使用和配置起来都要比 ST HAL 库要方便和简单许多,并且还是跨平台的,非常有学习和使用的价值。今天学习 SPI API 的使用,详细介绍见 CMSIS Driver SPI API
# {( G3 D& z, w- L: ^7 D6 b& J0 Z  N
SPI 发送与接收% P  o+ _4 y1 O% K
  1. /**; H- r1 I5 j4 }1 p
  2.   ******************************************************************************- k3 ^2 t) Y; {
  3.   * @file    main.c
    # Q5 J" }4 H  x, [7 u( ^% G8 A
  4.   * @author  XinLi
    $ Z0 E* ]5 p) s0 n! o1 [
  5.   * @version v1.0
    " H' K" M1 A% X% n: r
  6.   * @date    20-March-2018& J2 `& z$ W1 {) ?
  7.   * @brief   Main program body.
    * U1 P) q2 |/ ]: H* B
  8.   ******************************************************************************. z% ]4 D1 v  a* d7 d9 @" ?$ ^
  9.   * @attention& l3 T2 D& I, t% i
  10.   *
    . d; v0 J4 x3 r9 T( v
  11.   * <h2><center>Copyright © 2018 XinLi</center></h2>
    $ X" }) c0 y  d5 M7 e( _' ^
  12.   *: ~! Y' M$ b' `  W' m
  13.   * This program is free software: you can redistribute it and/or modify6 o) b" U4 g1 f2 Y( k( t
  14.   * it under the terms of the GNU General Public License as published by
    ( A) L& A3 f2 |& ^$ [; e0 N
  15.   * the Free Software Foundation, either version 3 of the License, or- V& M3 L3 M1 H) Q2 I" }9 k) ~5 n) \, m
  16.   * (at your option) any later version.
    + W" n$ J! l1 A$ S
  17.   *: C) K- g4 r# B  L
  18.   * This program is distributed in the hope that it will be useful,+ U7 {+ K# \6 Z% U
  19.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1 @" |, y; r- ]
  20.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    , v6 K  F8 h: o! w
  21.   * GNU General Public License for more details.
      x- v* ]- N8 W% |! X1 [0 s% H8 \
  22.   *& c& |8 w8 f/ d: \- B! `
  23.   * You should have received a copy of the GNU General Public License, I9 [9 V$ E  }) R
  24.   * along with this program.  If not, see <http://www.gnu.org/licenses/>.( C, K  N- R  ~# h+ x' W! U* Y- H
  25.   *
    8 I9 b# _: ~7 Z/ R  w3 I
  26.   ******************************************************************************/ \: D- z8 U, i/ _' f1 S
  27.   */
    ; [9 Q: N9 I0 q" W- \0 g" f" U

  28. 6 `" {- X' R# ]# x2 O7 S' @" p* O
  29. /* Header includes -----------------------------------------------------------*/
    # W2 E- L6 U. V7 t/ v
  30. #include "stm32f4xx.h"
    5 s( `# V9 T5 R1 Q- t/ p8 B* b
  31. #include "Driver_SPI.h"; u/ n& [! w2 F* L' x: w" I
  32. #include <string.h>( N2 J/ K1 w, J' S  S6 C+ z

  33. % U2 _, L- l# ]: }5 s! m. N, b
  34. /* Macro definitions ---------------------------------------------------------*/
    5 X. w3 t0 P' O8 _% t8 J5 M
  35. /* Type definitions ----------------------------------------------------------*/3 _2 Q" c5 o0 p# f! [. d' e
  36. /* Variable declarations -----------------------------------------------------*/
    3 H' u- O" `7 g9 v$ }
  37. extern ARM_DRIVER_SPI Driver_SPI1;
    $ j9 K+ w; d% j; r$ ~

  38. 2 N* ~" j: M7 K) Q
  39. /* Variable definitions ------------------------------------------------------*/% |4 p* X' t9 O' ]& t) I  H. k3 X
  40. static uint8_t txBuffer[5]   = {0xAB};
    , z  ~' j$ e& m9 g# Z2 }9 g% I
  41. static uint8_t rxBuffer[5]   = {0};
    " p, b# Y5 o2 M# Z% g+ Q
  42. static uint8_t dataBuffer[5] = {0};8 u. x7 N- l6 B- b( h+ y

  43. 9 U* l) k" ~6 G. k' f5 p  [
  44. /* Function declarations -----------------------------------------------------*/
    * e3 }& z: H3 T( B1 h
  45. static void SPI1_Callback(uint32_t event);
    # O5 e1 W* t7 f% F
  46. static void SPI1_CS_Init(void);9 |9 {; [! P9 `7 t7 ?7 R
  47. static void SPI1_CS_Low(void);
    ) S3 \; ~" V, S: f
  48. static void SPI1_CS_High(void);
    9 G; V3 D: b  Z  ^$ M- Z3 K
  49. static void SystemClock_Config(void);
    ' Z; V; M' E# k

  50. ! w+ s. J9 l4 Y8 ?4 T
  51. /* Function definitions ------------------------------------------------------*/
    6 ~# J! O# [! d7 |

  52. ' T* i9 Y3 W! [1 ^$ c
  53. /**& [- W4 @+ [8 d9 c
  54.   * @brief  Main program.
    * u% a7 E$ Z6 l3 u; m, r
  55.   * @param  None.4 Y  K  p8 e8 c9 D; i9 i
  56.   * @return None.
    - |* k8 A) `- Q/ E: q. t
  57.   */
    ; Q5 \" {- U: W) A8 ?& ?' o$ `# K
  58. int main(void)
    6 R; E. U& p# B& h, s8 y5 M
  59. {
    " t# Z$ L+ v1 \0 d' `
  60.   /* STM32F4xx HAL library initialization:" V# r$ y: T; n9 [/ p5 D
  61.        - Configure the Flash prefetch, instruction and Data caches
    1 A5 S# Y( [. g8 N1 O" D) a
  62.        - Configure the Systick to generate an interrupt each 1 msec
    . W( b2 z- {. Y4 D/ x+ G
  63.        - Set NVIC Group Priority to 42 b& }  X$ j$ y  n2 l
  64.        - Global MSP (MCU Support Package) initialization
    % j1 ~- Y: e* G+ e4 j9 F4 g6 O( `
  65.      */
    / m- I$ S' p% P7 f$ s# d
  66.   HAL_Init();
    ' {' t5 `& o, f8 P1 e. M# b
  67.   3 j$ s$ m3 u& P- d+ C/ h
  68.   /* Configure the system clock to 168 MHz */
    . R/ e. v& U- @( U/ P4 H5 B' J
  69.   SystemClock_Config();
    9 M* ?  I( j; L6 ~2 [9 v( C
  70.   
    / `: ?0 n2 f; o$ f- P; z$ \& R
  71.   SPI1_CS_Init();
    ( _  t! w/ [! v" \
  72.   2 C7 O, S3 k+ F6 H: f" B7 c
  73.   Driver_SPI1.Initialize(SPI1_Callback);
    9 e5 J6 o8 N  b! o
  74.   Driver_SPI1.PowerControl(ARM_POWER_FULL);
    0 I" j2 u7 H" z% w3 W6 U
  75.   Driver_SPI1.Control(ARM_SPI_MODE_MASTER |
    # m! q; u) E! @' u
  76.                       ARM_SPI_CPOL0_CPHA0 |
    6 d/ Q4 r5 @% v  w! d7 K! A( L3 `
  77.                       ARM_SPI_MSB_LSB |6 ^# Z" p) m! I4 X
  78.                       ARM_SPI_SS_MASTER_UNUSED |
    ' Z; |8 I% L2 D. @: R  f) C
  79.                       ARM_SPI_DATA_BITS(8), 10000000);
    ! T- u9 ^  z$ Y+ i: I( |
  80.   5 W2 b- H0 l' [% {: z6 e& c) M
  81.   SPI1_CS_Low();$ J5 D7 e! N, X
  82.   Driver_SPI1.Transfer(txBuffer, rxBuffer, sizeof(txBuffer));0 ~" t1 t2 d. y. _! [
  83.   . N+ z; L5 v" [$ e6 q
  84.   for(;;)
    . R9 g- j2 M0 ^2 f0 I
  85.   {  p; c/ `9 C8 f+ P5 `4 A* \+ v, u
  86.     0 [2 R7 {6 i5 _0 }+ s; q
  87.   }
    ) u! e, d$ d( W: ^
  88. }
    7 V* d% i3 H# p

  89. 5 p1 d! [9 A3 u; ^5 l
  90. /**3 H, }5 X+ k# G" v& }6 Y. d6 H
  91.   * @brief  SPI1 callback function.; y$ {) J! g6 ]- M/ g
  92.   * @param  event: SPI events notification mask.2 s  V" U& Z5 Y) a0 w+ ?/ i
  93.   * @return None.
    5 D6 \' U9 B8 N9 D5 [
  94.   */
    0 o0 t# [, M7 ^+ Y
  95. static void SPI1_Callback(uint32_t event)
    & b' G. T$ e3 J4 U6 M* ?6 t, @
  96. {6 i% ^+ N# t; p$ \
  97.   if(event & ARM_SPI_EVENT_TRANSFER_COMPLETE)
    ' T0 f8 c0 F3 a$ j
  98.   {
    ' p: C: L+ |7 W. b* I6 M7 D
  99.     SPI1_CS_High();
    / z  ?8 F/ Y- a! K) B+ D: y
  100.     memcpy(dataBuffer, rxBuffer, sizeof(rxBuffer));$ W6 [* e6 c* [6 }
  101.   }% ~. h4 |# D7 i
  102. }% s6 M; H9 A, G: s) ^% r8 M' A/ m

  103. # }$ r0 n2 I7 q( g
  104. /**# m; p9 H& A* l3 j
  105.   * @brief  SPI1 CS pin initialize.
    / z2 \5 Y3 R7 x2 d$ t
  106.   * @param  None./ _, Z, b5 K( o5 H% G5 Y0 _8 i) M
  107.   * @return None.0 o$ w, S& q' m0 M7 |% D
  108.   */! ^" h) [" q& O
  109. static void SPI1_CS_Init(void)* u; T: y$ `( A4 \, z* E- }3 |
  110. {) J5 r+ a# @& F1 |1 \
  111.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    2 S% k  t# j8 A5 ]  p5 O
  112.   6 B- C' [1 Y5 d0 E' `' d2 p
  113.   /* GPIO Ports Clock Enable */' t& b) p- S; W4 E5 H/ b6 o2 B
  114.   __HAL_RCC_GPIOB_CLK_ENABLE();
    & G5 X2 u* U# ^7 O+ O% ^
  115.   2 F' x2 i4 a  ]  j. `) B2 P
  116.   /* Configure GPIO pin : PtPin */
    * F. I" F0 M/ L, T9 C
  117.   GPIO_InitStruct.Pin   = GPIO_PIN_14;
    2 W( n" i: G7 }) Y6 Y/ m3 W
  118.   GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
    9 Q6 I( Q: V& r$ D1 x2 M
  119.   GPIO_InitStruct.Pull  = GPIO_PULLUP;
    2 L% @5 D1 U; h. ]4 I+ z
  120.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  ^: H# c$ V) b1 e) r" s
  121.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);" D1 Y2 X2 @) G' b: h
  122.   
    0 ?  n( X+ c  m* k7 D9 H
  123.   /* Configure GPIO pin Output Level */
    1 _$ u8 \. Z+ W
  124.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
    3 [4 e  [% _# `# n& U3 y8 L& s" r
  125. }$ s4 `( t8 t7 s& k5 v2 l& J  L( y
  126. 0 ~( v9 @) y$ ^
  127. /**
    ( x. A" ^, \- x$ V: X
  128.   * @brief  SPI1 CS pin level pull low.
    0 ~7 N$ l  X1 R
  129.   * @param  None.$ w+ k- W) X" o# T; Z
  130.   * @return None.
    & L) u2 m8 H) z; ~" S
  131.   */" ?, i% b9 a& j: S; n+ U) D* s
  132. static void SPI1_CS_Low(void)
    : s0 w% C8 |+ K: S
  133. {
    ( `' t* p% p& k& E
  134.   /* Configure GPIO pin Output Level */
    # C0 C/ E9 C0 R: {; u8 _0 E
  135.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
    6 Q. z1 C) ]. t% k: Y
  136. }
    + d5 f% e* y: t1 T6 m
  137. - Q8 U+ n/ |. O
  138. /**
    2 X8 C& V# {4 L% v8 y$ _
  139.   * @brief  SPI1 CS pin level pull high.
    ' X; k5 Z" I" Q$ S8 h3 Y. ]
  140.   * @param  None.
    7 ^4 D+ u& Y0 ?! X" E% N
  141.   * @return None.
    9 o3 m4 T! ~7 r0 J: r
  142.   */
    3 Q  j6 k5 g( K
  143. static void SPI1_CS_High(void)
    . f# ]' y& ~2 n) s# D$ u# e$ \2 w. H
  144. {6 T+ b0 f) p, S6 J( n! j! H0 s. M  U
  145.   /* Configure GPIO pin Output Level */
    3 A, X$ }1 T. t. S: B" A# n5 [  \$ k
  146.   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
    9 I/ u( G6 v1 x3 I8 w6 z. H
  147. }
    5 N+ J% |% V* T% K4 }& d5 S- }
  148. 6 W) Z: L/ y7 }" \( M' k
  149. /**
    / T! J5 A, j6 O
  150.   * @brief  System Clock Configuration
    ( i5 @0 r8 G3 J# Y1 U& i# R9 ~
  151.   *         The system Clock is configured as follow :
    & Z$ N" ^! Q5 `; r7 \% v
  152.   *            System Clock source            = PLL (HSE)3 N# h8 k- \( _, ?" I/ Q* u
  153.   *            SYSCLK(Hz)                     = 168000000
    9 X' _. ~9 @1 U
  154.   *            HCLK(Hz)                       = 168000000
    8 G" G* X  f; M: {
  155.   *            AHB Prescaler                  = 1
    + `7 X  @+ o% k1 ^) v% [' G
  156.   *            APB1 Prescaler                 = 4
    ' j$ w0 k9 }& U* p- f. @0 Z
  157.   *            APB2 Prescaler                 = 2# d( }) t" G* D* h5 k( w" [' z4 ?
  158.   *            HSE Frequency(Hz)              = 8000000( m/ G2 J* C$ T; ~& y0 f
  159.   *            PLL_M                          = 8
    ' E7 t' B) U3 V5 {3 ]
  160.   *            PLL_N                          = 336
    # o8 s' n8 O- _# G/ `# v
  161.   *            PLL_P                          = 2  D" T$ [  t$ j9 k( t% ]
  162.   *            PLL_Q                          = 7
    * e4 m* a7 J; u6 R. L: a; K, V
  163.   *            VDD(V)                         = 3.3+ w9 m( a/ V: m. ]7 z4 j
  164.   *            Main regulator output voltage  = Scale1 mode
    2 O5 V& Q0 n. @
  165.   *            Flash Latency(WS)              = 5
    * z/ j8 U3 S- O
  166.   * @param  None
    ; b, E4 E, J# C! t' w3 n
  167.   * @retval None4 G5 Z' j, G& R5 C) ~- u  ^" _( b
  168.   */9 P" `9 g/ P2 K( T1 _4 d
  169. static void SystemClock_Config(void)
    / t! i0 _( o) k2 c7 R
  170. {
    . q# Y% Y. s% }
  171.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
    ; @# r- E3 y; Y( e2 Z; k
  172.   RCC_OscInitTypeDef RCC_OscInitStruct;4 B, O$ P9 O2 R+ J& O4 H/ r

  173. ' n6 L" i: {8 l' }9 X$ T6 e* ?+ \5 r. A
  174.   /* Enable Power Control clock */
    5 o% c( I4 G! _) H7 i6 {5 C) u
  175.   __HAL_RCC_PWR_CLK_ENABLE();! ~; r- I: n" s7 r

  176. % i+ P9 w2 V3 {! M2 E7 n
  177.   /* The voltage scaling allows optimizing the power consumption when the device is
    ) G: \% p/ z' q! ?2 q# @" w' [' E7 n( ]# k
  178.      clocked below the maximum system frequency, to update the voltage scaling value * c1 R- u! m. ?4 o. [
  179.      regarding system frequency refer to product datasheet.  */
    - H) k/ ~5 O) S# ?6 _9 T
  180.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    4 N6 p' n) d& e' }- o
  181. ) |1 s% a2 K% j8 e
  182.   /* Enable HSE Oscillator and activate PLL with HSE as source */
    $ E1 G" w% \9 ?; E  R
  183.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
    - ^; v4 N7 S% c# u9 q
  184.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;7 v" c* Q# y% B) H# F: D
  185.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    8 H' S3 A. b9 E' w3 j5 r5 V
  186.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
    3 J( f( ]: z" F0 q* B
  187.   RCC_OscInitStruct.PLL.PLLM = 8;
    " K$ n+ a( `, |+ y. t
  188.   RCC_OscInitStruct.PLL.PLLN = 336;
    & C/ ~- e1 ]/ @5 U
  189.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    * L1 Z: n! \5 ?9 B" b9 W) h4 v
  190.   RCC_OscInitStruct.PLL.PLLQ = 7;
    9 t* _/ v! o6 c, F/ @: \- t
  191.   HAL_RCC_OscConfig(&RCC_OscInitStruct);! w) c4 {2 k/ R; m5 X7 H
  192.   
    8 t* L5 U% a; m
  193.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
    + ?" K, f" o1 G6 Q. X, b& M$ G, y
  194.      clocks dividers */
    - N8 F, ?2 G& a( G
  195.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    0 b* b, S0 V/ H2 Y% m" ]) U2 V
  196.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    8 e, p3 o% s- ]
  197.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;. r9 k# L) o0 r  Y; V! r' L; `
  198.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
    ) M6 o' z2 D/ e1 O
  199.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  , ]+ I" M# z( q' y4 b
  200.   HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);$ \2 l5 E) |' g0 P' J

  201. / Z8 A( o3 E& ^
  202.   /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */
    + h. W) E0 B, l7 N
  203.   if (HAL_GetREVID() == 0x1001)4 L  w2 ^' q* h5 `  R6 d+ Z
  204.   {
    0 S1 \2 z* O$ W9 I  \0 E& Z. d4 o
  205.     /* Enable the Flash prefetch */) i0 o) L/ k$ w- p; i: A1 {
  206.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();& n. f, G; O( @& e
  207.   }
    4 x; j" Y) ~! {; _6 q+ _
  208. }# f# o" H" J; i
复制代码
9 n5 q: d) h  H) @
归档链接  ]4 {7 M* L6 A
ARM CMSIS Driver 学习 之 USART
2 a6 M8 u0 g. y% X$ k
收藏 评论0 发布时间:2018-4-14 18:00

举报

0个回答

所属标签

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