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

【原创】STM32F103的SPI2的配置函数,DMA发送和接收!

[复制链接]
wjandsq 发布时间:2015-6-22 22:22
本帖最后由 wjandsq 于 2015-6-25 14:12 编辑 * W6 [% G9 Y0 B) y. m
; n* X7 [% D* P# t. M  R8 q
/*
5 N* T/ L. _* c; w$ a+ f * spi2.c
! ]) b6 X& n# I# S, J, L( z ** I+ P9 |. f2 l+ o0 {
*  Created on: 2015年6月22日
) r4 y$ ]/ U: q! V0 C9 j4 v *      Author: WJ- h" L4 G" w6 B
*/
: M0 C- M" x/ [3 p
1 L' r: F6 E* g. ]0 f2 o
- V3 H. K. A5 v$ j/* Includes ------------------------------------------------------------------*/
% i) x6 ]6 N) p#include "stm32f10x_conf.h"  q4 p# J5 q/ @  i4 j# k& ^3 }6 [9 a
/ u4 w# W0 X; y+ C
#define SPI_Flash_CS_Low()  {GPIO_ResetBits(GPIOC, GPIO_Pin_13);}
7 j! X. `9 ?& U#define SPI_Flash_CS_High() {GPIO_SetBits(GPIOC, GPIO_Pin_13);}$ k0 I0 ?" I$ Y3 q9 I

$ P& P1 Q5 r  g7 \/ C+ Suint8_t SPI2_Rx_Buf[4096];
+ _% e% z$ {1 suint8_t SPI2_Tx_Buf[4096];
) ~/ O9 p# M1 P3 C- {8 u8 a1 Y/ @# \8 f  ?
extern uint16_t Flag_DMA_Rxd_Finished;
8 d1 E; S: h- G2 {+ O$ D3 S( e; k% ]0 d/ ]- C
extern uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte);, l; g) V; g2 t( g) Y, ^# B5 F
7 N& V+ z$ p) b# d" |8 v! r% [7 S7 u
/**) s/ e5 _' e+ X! S( `
  * @brief  Configures the SPI2 Peripheral.; Z! P% F$ ]* X. f* s  i. `
  * @param  None
: d4 b1 ~: W3 _9 r, c' f, X! J* Z: z  * @retval None) E# g) P/ J* U* j. ~
  */
4 a# w% q6 ?' C, E4 g( T1 U8 fvoid SPI2_Config(void){1 a8 t( g8 L* i# @9 |
        GPIO_InitTypeDef GPIO_InitStructure;
4 D+ {* x2 @! l' C        SPI_InitTypeDef  SPI_InitStructure;: z' U2 H" X! k- Z3 z- b
        DMA_InitTypeDef  DMA_InitStructure;  S# C  ]; }( Y+ }' n
        NVIC_InitTypeDef NVIC_InitStructure;
8 \! D5 c+ Q6 y, @( z3 N! K
4 x3 D4 O0 a- h" a+ n        /* Forces or releases High Speed APB (APB2) peripheral reset --------------*/
: i4 n( j" I: U: s; f$ P/ n$ i  L        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);+ p9 }- T0 {1 [2 N, x. h/ I
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);
, ~3 n5 F% e& ], \8 g. p) n5 D2 f4 x# A1 e; \( {8 q: O
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
0 j! J0 j& o8 ], h$ [% e8 p4 j2 z1 @        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);% S- O3 \& u6 W* z  H+ X6 }; ?
( r- E6 I9 w! u# F
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);4 J& b% m) j. W" j# `1 B1 p
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);3 L+ H( K8 f, |4 D
- J5 R, m' i" u' X1 X0 E
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
- ?3 g& X4 E2 e$ ?        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);
7 }! @8 `, n$ u, |/ t3 J) g$ B- R3 M+ t7 v8 E. h
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
6 }- Y4 C! A4 ^* u        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
( `5 D& x- Q9 f" |        /* Peripheral Clock Enable -------------------------------------------------*/. [6 k3 ?1 o! @5 `
        /* DMA1 clock enable */
) b3 B% B2 v. d3 m0 v        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
' p' N( h' l, y- y  o' j) A        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);; _% [6 p# J7 j8 ?3 R: J* G* i4 ^
        /* Enable GPIO clocks */
: l2 U* |; c. C. ~4 T" M3 Q8 d( o        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);; A$ k4 b: _8 K8 S/ L
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);4 F$ @7 b1 \" B; e5 U" a8 q+ V
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);. u1 j- F4 x: H& w0 S

+ u0 b4 ?- S- H  h, A5 U. a5 l        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
4 ^8 v. v- f6 A) n8 v8 o2 w- V        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);, y2 b+ A$ z. G# e0 r4 t
        /* SPI GPIO Configuration --------------------------------------------------*/
$ @" I& @" q0 ~1 B2 P        /*/ ?( m+ F" k" }1 Q' q8 \7 i
         * PB13 --> SPI1 SCK         Mode: GPIO_Mode_AF_PP; U: x  }* i$ M* K* m3 J
         * PB15 --> SPI1 MOSI Write  Mode: GPIO_Mode_AF_PP- }7 L( J+ P1 S. [0 v
         * PB14 --> SPI1 MISO Read   Mode: GPIO_Mode_IPU
+ t2 W- n; e2 S& E3 m& I         * PC13 --> SPI1 CS
. P& l- g2 i2 z0 V         */
5 N- U- f2 N8 E) A* G4 C  H. y1 S$ m; i# i# u& v) }: F2 C
        GPIO_DeInit(GPIOB);- _4 b1 C$ b0 Y# n, a5 @" v
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
1 B5 ]# _4 O6 b0 |' x% e        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. `, X" t% V$ R. H7 j
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;+ c2 X+ r  B3 `  ]2 U+ b# s4 @
        GPIO_Init(GPIOB, &GPIO_InitStructure);6 D: I: O0 `7 @9 G
        GPIO_SetBits(GPIOB, GPIO_Pin_15);9 `' S# x$ R4 L3 ^- {* Q
7 {3 ]( T8 u/ i, f& P; W
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
+ {+ K" [# R4 X        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;* N% _6 n0 q  v  |2 {+ [" C5 Z5 a" R# G
        GPIO_Init(GPIOB, &GPIO_InitStructure);
( X% C  o, r6 G0 H        GPIO_SetBits(GPIOB, GPIO_Pin_14);
% W# |9 z8 O; S0 @
* S6 A. h0 ]# h' s5 S        GPIO_DeInit(GPIOC);
- X$ T: e8 D- n  {& M4 k        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
0 J2 M3 t* D) _8 w        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/ z3 G2 [1 b$ b& ?; V5 v1 i        GPIO_Init(GPIOC, &GPIO_InitStructure);  a) N0 c+ e% I0 b9 B  t
        GPIO_SetBits(GPIOC, GPIO_Pin_13);
. d6 V# n6 F1 w- v
$ Z4 K  ^. ]0 x6 v9 P6 r+ J* a1 Q. P+ U        SPI_Cmd(SPI2, DISABLE);
1 B/ p* f1 W$ L6 o% x- V. {/ i        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
: h0 V  a5 h" J% s2 g  z; |        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
5 u) t. v: V4 P5 O        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
# C& y2 t( d* k0 ^6 @" \3 g        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;3 G, W$ D5 ]- r+ v
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
" O6 w* Y' A* }: U/ F        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
0 d% W  t' ~% j5 h& q8 C$ g2 E; w        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
1 u; n, p" ?) |: Q5 \7 m        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
( K8 ~7 I+ M# \5 y/ s2 k2 _2 d        SPI_InitStructure.SPI_CRCPolynomial = 7;
3 i( h) q* d* |2 k        SPI_Init(SPI2, &SPI_InitStructure);6 a- |6 {( }& X1 J4 r
        if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != RESET){0 |" M( P" p4 E- `: t$ q  T
                SPI_I2S_ReceiveData(SPI2);
9 O" `+ P. B' c. Q2 c                SPI_I2S_ClearFlag(SPI2, SPI_FLAG_CRCERR);0 h0 N; }$ ~: s
        }
- ?8 U5 J6 R  z; r
4 J, ~$ m. f8 Y: H$ H" e        /* DMA1 Channel4 Configures for SPIS Receive */
3 H8 i, [' |9 P        DMA_DeInit(DMA1_Channel4);9 H; V- ~; f8 [4 l
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);( q# l2 S% ~5 }* S% [( ^% k
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Rx_Buf;
" J! O' |: V6 [( }" {        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;3 }+ A- q9 [' x" _2 N' F
        DMA_InitStructure.DMA_BufferSize = 0;
- }4 |! P8 e+ ]  v' v" g/ u8 n7 g( f        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;, o4 R  E8 _5 P0 a4 w. }
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' b# l* G- e) w- [0 y
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;( S7 l% d# A( B# g" Z6 m
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
: l: j+ |7 I. u8 ^' X        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
* @( D! ^8 f/ x        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;; ^* W) {+ W; z, y
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;0 c$ t. ^+ d0 P
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);  ~* `5 b3 n2 R% _0 k
$ M3 f# f+ m6 x" P; h
        if(DMA_GetITStatus(DMA1_IT_TC4)!= RESET){
3 F$ x. J$ q$ ]% J/ m                DMA_ClearITPendingBit(DMA1_IT_TC4);2 d& a. _# Q: V0 I$ _* h
        }
+ v- ~) t" Y4 H8 y% Q. \        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
1 K$ U+ ^( T* D1 |        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
% d7 `" v- b: T" t( d
% I/ ?1 M3 c- B# U4 P% r        /* Enable DMA1 Channel4 SPI2_RX */8 }& H& b1 {$ h
        DMA_Cmd(DMA1_Channel4, DISABLE);* q* j- J& v5 _$ P8 s- j4 M
8 \: r( V( ^# q7 ]
        /* DMA1 Channel5 Configures for SPI2 Send */3 c; G- o9 I3 g) c" M3 e0 s! S* l$ H
        DMA_DeInit(DMA1_Channel5);
7 n- C# p: m% r4 i7 P; |3 M        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
7 J+ Y6 C. W+ L* L# I        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Tx_Buf;. Y9 ~+ \3 l8 E1 Q3 Z2 n+ y
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;8 k1 \% G& E% a# V4 m! i( e
        DMA_InitStructure.DMA_BufferSize = 0;4 {: A! @0 K: O+ `! J) Z5 A
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
0 J# @5 z& c& g7 A        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;# E3 w; G) ]+ D: I4 |. `
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;9 z  M0 L3 O) I: F9 t; t
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
' ^' i+ t* X$ H, v) o8 W        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;" u6 ~4 `9 w6 Z: P2 n: u% V
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
' g! O! ]" `9 g) K" d        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
/ f' ~* k7 ?& M% ?! z        DMA_Init(DMA1_Channel5, &DMA_InitStructure);
  k5 P0 N7 `- i+ M) Z5 ~  H! q3 y5 X2 n3 j9 J
        if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET){# P9 i' C' L# j( H+ C5 ^) A
                DMA_ClearITPendingBit(DMA1_IT_TC5);2 Q. j% k. n5 f
        }
* z  Y' ~: \( Y. q9 x/ r" m/ X        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
0 L3 n) [. o3 y7 d# e        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);( n8 C: {5 B8 U$ d6 z6 q8 d
/ ]2 @- a  n: Q: a) X
        /* Enable DMA1 Channel5 SPI1_TX */
5 T# r* D% A8 z: a: Z& r4 a/ I        DMA_Cmd(DMA1_Channel5, DISABLE);+ t. \4 @4 y+ C3 s7 Q
/ B; |( G4 N' ]+ z/ g
        /* Enable the DMA1_Channel4、DMA1_Channel5 Interrupt */
0 i+ l: r% B9 P6 G, w4 v5 ?2 ?        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;- [) ^8 q2 E% P7 |9 P  D% x
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;& K; j* q0 \* N) _! V/ M2 u
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
; B/ @* e7 v2 r6 C/ x) C        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5 j2 U- w; J6 g8 h$ t$ S& _/ x        NVIC_Init(&NVIC_InitStructure);" h/ r0 n& z2 b- K, ~

! j. e( Y. S4 \7 t% k        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;" r& _0 s9 [- D+ d; u
        NVIC_Init(&NVIC_InitStructure);
  _' P  k1 G; A: y* k9 `* Y
: `* ^& x# b( @: ~4 l) ?9 e        /* Enable SPI2  */
9 x! Y6 K% \6 C        SPI_Cmd(SPI2, ENABLE);
' N/ v: b! q4 v2 m* J7 T9 m}$ Q+ B0 i$ I/ `* P5 p; f- p4 M5 ]2 L
/**# p* @5 E' x: W3 _! D" _& i
  * @brief  SPI1_DMA_Start
9 f7 E' c- @8 C8 }  * @param  len <= 40965 B# d4 F; Q  M$ a7 r1 P
  * @retval None1 ?% `+ t/ m+ W1 u
  */* S  A" s: }7 v0 ], y
8 L& ]( G) {1 N2 l7 o
void SPI2_DMA_Read_Write(uint16_t len) {
8 \6 d6 i" ^) P4 G6 @' D8 l        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);0 }7 f' i0 z% j5 Q
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);" k0 W5 @" ?$ O) e
        DMA1_Channel4->CMAR  = (uint32_t)SPI2_Rx_Buf;* E+ e5 o8 X1 z" H9 x7 U
        DMA1_Channel5->CMAR  = (uint32_t)SPI2_Tx_Buf;
* n/ d6 h, F' s1 {+ B* K; m# O: v, B        DMA1_Channel4->CNDTR = len;7 G9 N- R4 f# O4 _8 O! p
        DMA1_Channel5->CNDTR = len;
- q2 z# Z; B. u( |+ Q( d        DMA_Cmd(DMA1_Channel4, ENABLE);& H' G7 o& V, c8 I: Y+ A3 t7 Y
        DMA_Cmd(DMA1_Channel5, ENABLE);3 I  V9 ~- }( b3 L1 s. Q; @: f' x* p
        SPI_Cmd(SPI2, ENABLE);
. J$ s. k: h- F2 Z}6 S6 Y# T6 g9 D: A0 N3 {
# e& C5 k6 b3 a, l4 M( Q( p; y) O
/**% c: A; p7 V+ }3 M% _2 ^6 q. s
  * @brief  SPI2_Set_Speed
" T5 u5 ]& F" P8 N- r1 C  * @param  SPI2 CR1 bit 9 8 7, W' X8 w* A8 i6 x! M: e
  *          SPI_BaudRatePrescaler_2   ---> 000
) ]; J- x$ N- `- {: ?  *          SPI_BaudRatePrescaler_4   ---> 001# ~$ I/ d' c" l2 W7 k4 [' A
  *          SPI_BaudRatePrescaler_8   ---> 0109 l4 f: s& U( ]9 Y4 c
  *          SPI_BaudRatePrescaler_16  ---> 011
3 S) \$ b- ]5 T1 R$ S( }  *          SPI_BaudRatePrescaler_32  ---> 100
0 Y$ h; w  C- @* d4 C  *          SPI_BaudRatePrescaler_64  ---> 101
1 v$ y9 X6 b. |) Q/ h  *          SPI_BaudRatePrescaler_128 ---> 110
/ A. Y$ p  R  [% x  *          SPI_BaudRatePrescaler_256 ---> 111
3 z: _3 [& _0 P  * @retval None5 w3 l5 l/ S) I& }7 [  T% ?/ w/ f
  */* a% r: s- s* c" n2 ^  F8 H' T
/ g/ @- X  W; o0 \/ C$ r
void SPI2_Set_Speed(uint8_t BaudRatePrescaler) {1 T( _6 x$ B4 W1 ?
        SPI2->CR1 &= 0xFFC7; /* Clear BaudRatePrescaler Value (bit 9 8 7) */* Q- F1 z, m4 i1 S- |
        SPI2->CR1 |= BaudRatePrescaler;
7 M0 b. C# @$ a# H. ~8 i' ]        SPI_Cmd(SPI2,ENABLE);
: `/ [% R) q# |# A  c7 r/ Z}" p( q8 l5 g+ U: P+ I* i" {5 _3 o
+ s: f& Q1 {* P4 X0 b; L
/**: W8 G$ ?7 V/ D$ H! n
  * @brief  SPI1_Byte_Read_Write
1 x# J5 m2 ^3 |) B( n( t  * @param  None
) G0 r+ Z2 b1 T$ j5 `8 P7 }  * @retval None
1 O' Z- h" H5 _+ U/ a8 d  */% ?* n6 n+ d7 Q) I5 K
uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte) {) I8 D* ?  C0 D$ G) k
        // 发送一字节7 r) B: h& E3 S; v$ A9 Q
        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);. G2 i) w, k9 Q  m3 w% P
        SPI2->DR = SPI_Byte;; W/ o  L% n4 Z6 ~' d: ^5 R$ ?
        // 接收一字节8 F- q, Q4 x. a; R/ n
        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
; |8 t: ?( q1 `: H& z( ~        return(SPI2->DR);. C1 V0 C; Y+ R2 {; [" N8 ^
}
/ e9 u" v$ S- N7 Y3 t1 B
( O' Y: j" d. I3 p# t! j. g+ X. |/*" H" Q) }) A) H! m/ p+ E2 E
* Function Name  : DMA1_Channel4_IRQHandler; F; ?$ J# L3 h% a* R
* Description    : None9 ]% N# M6 K! |3 c. t; V; V
* Input          : None, O- M: Z/ h- U
* Output         : None/ s9 p7 ~; P' ?/ x3 U! G& E
* Return         : None
' d; Z1 C* S0 g7 ?$ H *// q, A, n6 u0 Q* ^4 |
void DMA1_Channel4_IRQHandler(void) {
- Q' x2 {8 K  {0 ^2 y/ P$ d        if (DMA_GetITStatus(DMA1_IT_TC4))  {( W- F8 Y7 H3 d0 b$ a
                SPI_Flash_CS_High();
! g7 g2 F3 |- F# G  |                DMA_Cmd(DMA1_Channel4, DISABLE);$ \1 X7 u4 U9 M% r
                DMA_ClearITPendingBit(DMA1_IT_TC4);; _4 a3 T9 ?& h
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);) P5 E/ H  u% F. b8 F
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);5 {+ e1 o( D0 |& ~' ]/ f0 ?6 q1 K
                Flag_DMA_Rxd_Finished = 1;
$ c- M8 \  J7 f8 t. Z        }# b$ H, r6 U! W% \, c1 O( D+ ]) N0 i
}) x0 n8 B7 f& p- X

' v' [5 f* Q( e8 J- m/*8 z8 j& b8 I$ w. \# n) w
* Function Name  : DMA1_Channel5_IRQHandler. K6 d# l7 W  O5 ~! q8 y
* Description    : None
- [" C' l8 S: H4 b * Input          : None
& `$ I- v8 P& q! X8 y: J * Output         : None+ S) ^3 D8 T) o* ]9 w5 j
* Return         : None' ~' {/ P: C8 A6 e5 E, T( I; @( a
*/
$ x- u6 ~& |3 a0 Lvoid DMA1_Channel5_IRQHandler(void) {, Q; W6 k8 g# y, |; T# S; f
        if (DMA_GetITStatus(DMA1_IT_TC5)) {9 W9 D6 Y0 z& m+ h- q
                DMA_Cmd(DMA1_Channel5, DISABLE);# s; Q( |' h, y& }( ~8 D
                DMA_ClearITPendingBit(DMA1_IT_TC5);
8 {4 _$ ~  D5 d) P' `        }! ]7 A8 v$ T3 i! Q4 A1 w
}8 T6 Y: b3 f1 v) h0 ?! F% o8 v. e
3 A4 a. X9 U) a$ I( p+ W4 I

/ l# M( V7 M! [4 `7 I" }8 A! W4 ~+ s# g! l
1 收藏 4 评论6 发布时间:2015-6-22 22:22

举报

6个回答
Paderboy 回答时间:2015-6-23 06:53:11
多谢分享,支持个
wjandsq 回答时间:2015-6-23 08:51:16
本帖最后由 wjandsq 于 2015-6-23 08:57 编辑
( y* O* H) ^9 a5 S1 Q* v5 B% u
  L) j/ @- z3 X1 O( T命令字节发送和接收, 可以使用SPI2_Byte_Read_Write, 也可以使用SPI2_DMA_Read_Write,5 D1 x: S" ~' ^: M
这里使用SPI2读写SPI_Flash, SPI2_DMA_Read_Write 可以按照下面的方法使用:
# c% }2 P) U8 _/ p" J' N$ I
7 q: Y# z2 X/ s2 G% _' @. CSP2_Tx_Buf_load();            // 数据装入发送缓冲
6 n+ k  X0 h6 t  q+ l  \- M8 mSPI2_Flash_CS_Low();         // 片选使能
. q' o% I$ G: J0 pSPI2_DMA_Read_Write(6);   // 启动发送和接收, 在DMA传输完毕中断里片选关闭
( _7 N; z$ E; w+ Bwhile(Flag_DMA_Rxd_Finished==0) {4 T3 i0 E+ ]4 ]: B1 C
// 使用DMA连续收发时, 可以利用这个空闲做一些事情
9 G4 [* U6 t9 Y" m4 O( y// 如果是用SPI2_Byte_Read_Write, 单字节收发就没有多少空闲时间了
& T. e+ N) Z) v: |  Z0 }/ _;
/ u4 }; C  H& B* B/ {; o}
& L5 C6 i6 R# F; k: f7 ^8 N) JFlag_DMA_Rxd_Finished = 0; // DMA收发完毕,标志清0. S0 x. ^+ p! u# t" ]9 E/ u4 @1 S
+ L* Q& @) V! G; [) |+ H2 m7 e# S1 e3 r
; T4 ?' F+ B- O$ H! F
9 ^2 G+ R) k4 J1 s# g5 K. R5 R

  b" g+ M+ q' ^7 P: {$ M0 C4 L2 |  N# ~! ]) d! J7 \7 Y! L
stary666 回答时间:2015-6-23 10:02:01
看看,,,,,,,,,,,
☞❤安❤☜ 回答时间:2015-10-23 16:21:32
楼主这个问题解决了吗,我也遇到这个问题求指教
jcx0324 回答时间:2015-12-24 16:49:37
mark下,下次需要研究下
SPDF 回答时间:2024-7-22 12:07:50

研究,研究

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版