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

基于STM32F1 SPI3 使用DMA发送和接收

[复制链接]
攻城狮Melo 发布时间:2023-5-22 19:50
关于STM32F1 的SPI 操作讲解已经很普遍了,这里分享一下STM32F1 系列 SPI3 使用DMA 发送和接收,关于SPI3 DMA发送和 接收大多数所都是在中断中 执行的,其实原理一样都需要死循环,等待数据发送完毕后在执行下一步操作。0 U0 \' V, T  s' O7 z) }9 j

: |6 c; w) I( n
  e7 T7 @- C3 i4 b1 N5 B# q
  1. // 初始化SPI3
    % g- C3 {- q! z% M4 R
  2. void SPI3_Init(void)
    & d' L0 s; H+ q; T/ m
  3. {% V  C3 @/ x* U
  4.         GPIO_InitTypeDef GPIO_InitStructure;
    $ h; G$ ]( l7 {9 X1 q7 S, _
  5.         SPI_InitTypeDef SPI_InitStructure;
      E) O0 [/ S: C
  6.         DMA_InitTypeDef DMA_InitStructure;
    ) p9 @; I- U' Z2 g. V. @4 z
  7.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
    0 w; d4 f: ]0 X" z& S0 D" k& p# E
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
    7 F* ^" G! ]& s. X
  9.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能(保留SWD下载口). g% ^, Y, V: P. j  l. Y
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
    & _6 I6 U! _1 ^. c; ]

  11. % U/ Z! F/ m+ Z; U' ]/ b  v8 t
  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;$ \2 v3 W2 [$ j
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
    , E+ n5 l+ J9 f9 q- Q
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: I3 Y3 f; U1 Z1 O: s7 Y) a
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);  
    1 w# H! @( {0 L6 q& ]
  16. 5 L+ C% a  o5 H# Y* [
  17.         GPIO_InitStructure.GPIO_Pin =GPIO_Pin_15; //PA15 =1* [8 D3 T6 x2 b* x* T
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    * k5 |9 ^9 y4 L* w4 I! W
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;7 q" V$ U6 w0 Q
  20.         GPIO_Init(GPIOA, &GPIO_InitStructure);
    1 Y; d9 T& j: O, \: U0 g$ s
  21.         PAout(15)=1; ' P5 m6 d+ g: ]6 S9 }
  22.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;' S: }$ `, D1 Z) q  H1 c/ `" b
  23.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    , s9 @1 n+ R9 X% K, ?; Q
  24.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;) P4 z5 s, j' l$ H. g
  25.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;               
    / h7 k' z% T* r) ^7 T
  26.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    $ G( v" }( m% O; P- @
  27.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;0 [1 J. k6 u* n( ?
  28.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    & ]. w/ R7 X( M
  29.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    1 k, [$ s* g6 r3 D0 ]6 b; _0 b& M9 d
  30.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    + q3 g. J; b4 V. X" c; a
  31.         SPI_Init(SPI3, &SPI_InitStructure);* b4 h0 m$ n* ^2 x3 p
  32.         //使能DMA发送, r# t: ?; s4 f$ f
  33.         DMA_DeInit(DMA2_Channel2);
    ( W* G1 F6 ?& a: q% \* b; e9 H0 s* w
  34.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR;
    + D7 j) N% u3 m3 Y: G
  35.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; . Q3 o" w; `3 n4 [" K
  36.         DMA_InitStructure.DMA_BufferSize = 1024; ! h1 }$ K9 i+ H" O# @
  37.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    * l  u; {2 f$ k2 ]9 {# u9 z5 O
  38.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    9 T, {4 h# A( F# `& p0 c
  39.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    % k$ I2 S. e8 f  b, f
  40.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    " D( W! Z2 }/ t( W$ Y/ Q- K, y
  41.         DMA_InitStructure.DMA_Mode =   DMA_Mode_Normal;8 G: q6 m" Y$ ~7 e. _& ~
  42.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
    0 [$ t- P4 V& j! J
  43.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; $ W) f4 f" P' {! i5 G5 @
  44.         DMA_Init(DMA2_Channel2, &DMA_InitStructure); $ {! Z: c: Z; i# A! c, M1 @
  45.         //使能DMA接收7 r8 K/ ^4 ^1 g+ J
  46.         DMA_DeInit(DMA2_Channel1);
    % {7 w+ U. G( Y& m1 X. N% J" X6 |3 C
  47.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI3->DR;
    : y( K$ U$ d4 Q. X( ?
  48.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;( J- F2 a4 |: l8 w2 P- [
  49.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    * N/ l6 F# U+ f5 Q
  50.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' E& H* }5 C! E. b; t4 G+ Z
  51.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;# S1 g" c4 o2 Q# F
  52.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    , W) {; x- B% o5 R9 \& n! Y) T
  53.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  K" r  b2 g( B5 f7 _
  54.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;% L( b3 B. h% g% w1 s+ B
  55.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    , |4 e# J) j6 O% |3 f
  56.         DMA_Init(DMA2_Channel1, &DMA_InitStructure);7 s' R9 y0 F4 q9 \* Y
  57.         SPI_I2S_DMACmd(SPI3, SPI_I2S_DMAReq_Rx, ENABLE);
    3 N1 l$ N0 k! I/ s
  58.         SPI_I2S_DMACmd(SPI3,SPI_I2S_DMAReq_Tx,ENABLE);/ C: T, a8 p4 f4 T: ^2 g' O
  59.         SPI_Cmd(SPI3, ENABLE);
    - \) Y# q) h# w# L" `7 U
  60. }
    . |! J& W' v8 H. f+ C8 Q2 `
  61. // 速度设置
    6 S/ |6 C: K. }
  62. void SPI3_SetSpeed(u8 SpeedSet)  y( Q: }# J" w
  63. {- N, F& r& `# {+ p  P
  64.         SPI3->CR1&=0XFFC7; " O, ?$ z! e% v' m/ R  E
  65.         SPI3->CR1|=SpeedSet;; ]! w6 A* g" J) K1 p
  66.         SPI_Cmd(SPI3,ENABLE); & V5 I* `9 ?4 s. H6 E9 ?
  67. }
      M. @( f0 n! e5 ?+ l9 a( `& B! i
  68. // CPU发送8 w! O. M' t" F+ N$ c2 Q! }
  69. uint8_t SPI3_ReadWriteByte(u8 TxData)$ ~' a# v$ b7 d+ w# q9 x0 K
  70. {               
    9 H$ _* }6 D& ^8 K6 n; a/ S" P  N7 K
  71.         while((SPI3->SR&1<<1)==0){;        }: b3 A3 G* p0 N/ U
  72.         SPI3->DR=TxData;                                    
    . C1 n, z* j' x6 |+ u4 |+ r
  73.         while((SPI3->SR&1<<0)==0){;        }         
    " [. l: J0 S2 [: e5 k! ?& j
  74.         while(SPI3->SR&(1<<7)){;}
    5 S8 `; d' s! y7 ?" ~% G
  75.         return SPI3->DR;
    4 \! x9 B9 G  r- J3 g3 b* P
  76. }& C/ `; E4 l5 J) m9 Y" j' M
  77. // SPI3 DMA发送$ r  R  u# k6 s) Z, C" W
  78. void DMA_SPI3_TX(uint8_t *buffer,uint16_t len)5 _& s7 R1 J; c1 C
  79. {
    & C0 Y  [9 e5 z! y: M7 \
  80.         DMA2->IFCR |=(0xf<<4);
    7 S2 C- q5 s2 x) Z8 i; X
  81.         DMA2_Channel2->CNDTR=len; //设置要传输的数据长度
    ! ~- |7 B, N8 Z. e
  82.         DMA2_Channel2->CMAR=(u32)buffer; //设置RAM缓冲区地址
    ! F' y) f% `  E2 h! |# Z
  83.         DMA2_Channel2->CCR|=0x1;" Y' m' ?% E3 r0 j6 A7 p
  84.         while(!(DMA2->ISR&(1<<5))){;}
    6 E" s2 k# @% z4 ?8 z
  85.         while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET){;}! i- Q: |9 d) b; n+ A
  86.         DMA2_Channel2->CCR &=(uint32_t)~0x1;
    ( I+ W7 C/ v8 e5 q
  87. }+ x6 b: b+ ^4 i* ^" c
  88. // SPI3 DMA 接收
    % F4 e- V  w- a* V; k
  89. void DMA_SPI3_RX(uint8_t *buffer,uint16_t len)
    8 D- Q/ G7 q- T7 [
  90. {$ g4 y% z4 ^* z8 a# u/ y1 n
  91.         SPI3->CR1|=SPI_Direction_2Lines_RxOnly;
    6 C$ I. k' l; k1 q3 q+ W& f# Z; l9 N
  92.         buffer[0] = SPI3->DR;// 读取一次数据
    0 M9 a5 I# T: N
  93.         DMA2->IFCR |=(0xf<<0);
    4 M% p  I/ k: @& z
  94.         DMA2_Channel1->CNDTR=len; //设置要传输的数据长度, d4 ^. G" a& c- `) B$ O& Z
  95.         DMA2_Channel1->CMAR=(u32)buffer; //设置RAM缓冲区地址  [# E) C" L5 V+ [- p8 j# y- ?
  96.         DMA2_Channel1->CCR|=0x1;
    , a# S0 n/ b$ M7 q: a
  97.         while(!(DMA2->ISR&(1<<1))){;}' r7 b; z/ {3 Q- m3 {( m
  98.         DMA2_Channel1->CCR &=(uint32_t)~0x1;0 u5 @& u" ~! v. N2 J
  99.         SPI3->CR1&=~SPI_Direction_2Lines_RxOnly;& S, K' b3 n# O- ~) _8 i
  100. }
复制代码
  [  V7 k0 }4 U9 b! b9 x
转载自:kensey
- ]4 M, U8 d/ H2 U; D如有侵权请联系删除
5 o; t; J7 l$ i' @" F7 `1 D) K- m3 ?, t0 I, ~

1 x  n6 S; a. ^; S
, a. o5 W& K$ i' w1 f8 K- u
收藏 评论0 发布时间:2023-5-22 19:50

举报

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