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

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

[复制链接]
wjandsq 发布时间:2015-6-22 22:22
本帖最后由 wjandsq 于 2015-6-25 14:12 编辑
* ]% p" u9 q1 f1 W/ ]
, E  [& I+ C1 n5 M/*
" v! g( ~3 O6 a  O1 P! t+ W# f * spi2.c
8 T* x" U0 ~% A" z- f. v5 a *, r# X9 c+ t2 Z3 k  E( N2 l
*  Created on: 2015年6月22日8 j2 D- k2 ^  V, N7 U2 o9 v( U
*      Author: WJ
  [, y" t+ ~$ L! b+ Z. u9 u/ @$ w8 x */
! A: [5 c; }" M' g1 }2 Z( Q0 @) p2 c- T

1 x3 n8 d4 M/ m; ^4 |$ n  ]& S8 S( g/* Includes ------------------------------------------------------------------*/
& m9 e7 I& j4 W9 h, }) e( x; O#include "stm32f10x_conf.h"
4 O$ M; y7 f; }! L. E' H$ J5 A9 l* ^% W' @' s
#define SPI_Flash_CS_Low()  {GPIO_ResetBits(GPIOC, GPIO_Pin_13);}) P' w. h" g3 w( j0 p9 K
#define SPI_Flash_CS_High() {GPIO_SetBits(GPIOC, GPIO_Pin_13);}' H8 s7 |- `1 V+ Q/ K
0 t1 V) C8 [- ?2 f" g
uint8_t SPI2_Rx_Buf[4096];! q9 W& o: A6 Z
uint8_t SPI2_Tx_Buf[4096];
) k6 n- C2 ]$ n9 M0 [( {8 j. v; X; _+ m0 [
extern uint16_t Flag_DMA_Rxd_Finished;0 ]. W/ M3 F  l8 U- L2 ]% y

2 e* l) B$ t. cextern uint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte);
6 K5 q3 M% Z* [: L7 l2 {( U' }
  v6 Q& I- ?) n5 z5 A" W1 ^/**! |2 |5 {% O5 o5 F% L
  * @brief  Configures the SPI2 Peripheral.8 i8 Y1 a7 B9 V. c/ y4 {1 C# t
  * @param  None, B& v% q, X1 u# n: s  g! K+ X, D& I
  * @retval None
* l+ V8 T6 F8 D2 p- }* L3 D3 O5 |  */
5 U* }/ q# T2 j3 hvoid SPI2_Config(void){
9 g, J  A9 i' M3 s# A2 y/ m        GPIO_InitTypeDef GPIO_InitStructure;+ B0 b  S! U$ m( S7 U2 t1 o
        SPI_InitTypeDef  SPI_InitStructure;
7 u4 n- f" ]; h8 p+ O2 ?2 z+ x        DMA_InitTypeDef  DMA_InitStructure;2 r, F% N1 p2 \% X
        NVIC_InitTypeDef NVIC_InitStructure;
/ j  l' j+ F* j$ F$ v
8 J6 k/ u" _1 l        /* Forces or releases High Speed APB (APB2) peripheral reset --------------*/
, I8 _! [0 X! k/ p8 s2 g4 O2 ]( t' w        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, ENABLE);0 u; M( c. g- T5 x9 T# _& M' ]3 B
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_AFIO, DISABLE);) l; P, y# p, ^& q/ X* @
0 c4 G* [. T- t
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);. X8 X! B0 Q  v8 E/ V
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, DISABLE);8 y7 `4 G4 y0 w# x. ]2 |0 D5 {

" g+ R4 C* o& m9 p. a4 q' D        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, ENABLE);
+ Q9 U3 K' c/ t! u! w        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB, DISABLE);
( g5 A9 c% A7 r
$ v  N2 Y8 T5 j        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, ENABLE);
& |+ x' a5 p: K; j3 v1 S6 G        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC, DISABLE);1 l" O0 e" X7 T1 S! Y

3 t: V5 Q; G' E% p1 U3 p+ ?        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);4 x' ]. f: S/ j% _8 V: o. o
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);! a/ \2 k  I; V2 g0 P" z
        /* Peripheral Clock Enable -------------------------------------------------*/
* F6 b, Z0 B4 O, M$ i7 h/ O* b        /* DMA1 clock enable */
/ n) q* |" y/ S7 n/ W0 u        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
1 f( n7 z6 @$ Y5 ?% Q8 C/ f        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
$ J6 R% P5 t8 `4 m2 s9 U        /* Enable GPIO clocks */
! k; V1 E7 a- c! ]7 P8 q* S        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
! K# _. E( \/ ?! Z. C        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
3 d- ?1 o) m5 n# X        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);' @: V3 @  a% y- T7 K3 w- p* B0 L2 `

4 S& N5 u1 ^# B; i" G- D% C        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
7 M5 b3 w5 v  m9 ^* V! |  F        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);# e( f$ J! i6 P( H* }( W8 y
        /* SPI GPIO Configuration --------------------------------------------------*/1 C. a5 n7 v4 J( l7 t0 M" k* y
        /*
1 x+ b9 o* O, t7 l3 S, L; i         * PB13 --> SPI1 SCK         Mode: GPIO_Mode_AF_PP
* V# i& y) m) |' p/ p, x& w         * PB15 --> SPI1 MOSI Write  Mode: GPIO_Mode_AF_PP# U2 Q5 ^- u9 r* \  Q) U' x2 Y' R
         * PB14 --> SPI1 MISO Read   Mode: GPIO_Mode_IPU2 R& I1 b& w# O: Z. H
         * PC13 --> SPI1 CS
& S% V3 O+ ]5 B$ I4 s% P& b: ?4 Z         */; J# |( S* s- Z: e
/ J) J8 O4 x7 d: z+ O0 W
        GPIO_DeInit(GPIOB);' A. {- [* x9 _3 O. U  W* }
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
5 m; B* m) E' d. Q2 d        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
' Y# I# @- P/ l! r; F        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;; G1 ~7 I  M" [
        GPIO_Init(GPIOB, &GPIO_InitStructure);
+ v2 z! _. p. ~3 x) V3 U/ E        GPIO_SetBits(GPIOB, GPIO_Pin_15);( z6 b. T- H: p+ ?: M, Q
1 \5 [% c: D. K/ i( T) l$ f0 _& u
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
* I) t% l( K  u$ B  j' Z1 @        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
% J6 g+ U+ i* [( B0 ~        GPIO_Init(GPIOB, &GPIO_InitStructure);
0 N" `) |4 }' i        GPIO_SetBits(GPIOB, GPIO_Pin_14);
% X' l' R0 H7 ?$ `4 l" ]2 `) Q  ^/ l' z2 t$ G, B
        GPIO_DeInit(GPIOC);
) b; h/ W$ u% C2 C1 z' e% R& W        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
" c4 T! {+ H+ B5 e/ ?- H        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;. r0 V* @& E1 D: E1 c
        GPIO_Init(GPIOC, &GPIO_InitStructure);
( Z# t5 Z" \) g! p& Z        GPIO_SetBits(GPIOC, GPIO_Pin_13);& J9 w) {9 ^4 ]! f& g9 ~

8 K4 @5 G- L7 W' o% i        SPI_Cmd(SPI2, DISABLE);
6 Z$ \3 c; G7 [! q6 Y2 s  |        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
- `+ w* r/ s9 e& s( J        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;0 z$ T* @. C1 C  U1 L
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;7 F& v+ v8 Q  H
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
5 D' N" x) Y. X3 E. p* H        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
9 @. w% @9 j5 a7 ]; K; Z+ {        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
: ^2 W- x+ Y2 F( s7 K- L/ m        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;, K1 ]: a, R: T5 N' \/ C
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;+ z: \" T, s1 k$ _6 s! s3 [8 v
        SPI_InitStructure.SPI_CRCPolynomial = 7;
. @+ G1 j8 F5 z        SPI_Init(SPI2, &SPI_InitStructure);, p( G' x8 L+ g2 T6 V; w
        if(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) != RESET){
  x0 H/ E4 @, Z  h% T                SPI_I2S_ReceiveData(SPI2);
1 A6 r" W+ F% f' ?& K# r                SPI_I2S_ClearFlag(SPI2, SPI_FLAG_CRCERR);
, i! J' x2 G  [. d        }8 \) ]& c6 s7 `, w
' k) N1 z3 I: v# D; ~. M7 a  ~- j1 O
        /* DMA1 Channel4 Configures for SPIS Receive */
5 N. p; z$ R! V        DMA_DeInit(DMA1_Channel4);5 N, b* Q4 D* P! I  Z
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);
5 `) R9 A: N( G8 O( @- f5 E5 Z8 ^        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Rx_Buf;$ x3 ^" ]9 a; n, r/ `
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
! ^$ J2 N- H: z; K  U2 ^        DMA_InitStructure.DMA_BufferSize = 0;
6 t. R' j7 s* c) n        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;1 F4 \; R7 t  V* [5 @" f% t
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;6 S. m  |: a0 m; }) K6 h
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;2 M0 M7 H5 d1 a
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;) V$ L5 Z  ]% F- z* D
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
' o* [1 K) r8 E3 m& J) Q        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;/ J7 Q5 y# _# A& h$ r' Q
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;) f5 d' x3 l3 }) S
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
) C( Z% c% \# c3 A& R
% T. O4 d; d1 M! U" a# t! p        if(DMA_GetITStatus(DMA1_IT_TC4)!= RESET){- {9 B  U& O+ a' l
                DMA_ClearITPendingBit(DMA1_IT_TC4);
9 [. ^' O  |5 x4 D        }* l- w6 |# C# \
        DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);$ f. g' t8 M" H" H4 ?; [
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
7 X' ]$ J2 M, M+ _3 T
9 W$ H' |7 A0 z: r: k% D: J' d" E        /* Enable DMA1 Channel4 SPI2_RX */: E+ Z3 G, d) \! c3 |! W4 m/ k) L
        DMA_Cmd(DMA1_Channel4, DISABLE);
, o1 s/ m2 ?# b# l! n4 T; z* y- p0 K7 v% Z
        /* DMA1 Channel5 Configures for SPI2 Send */1 I- x+ e) F8 [' u
        DMA_DeInit(DMA1_Channel5);
5 h' U# H+ A* Z9 x4 k        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI2->DR);5 K  N, K; \6 r2 D7 J6 l, m5 c
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SPI2_Tx_Buf;
; v0 F1 i5 b0 Z$ ^2 K4 p        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
. b+ @$ K2 e5 I! a6 p        DMA_InitStructure.DMA_BufferSize = 0;
0 q# Y4 ?6 n1 C7 Z        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;6 D) b9 D) P! H2 w( s; G
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
3 l" L7 b! e, p6 C  p        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
1 [  |( m# C, Z; c: I        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
! v2 u  ~+ ~. B+ w' r        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
* ?1 e1 Z" L# N" k1 K        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
$ T% Y# @4 Y7 E0 _: I        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;9 U, a8 Q9 r9 d1 u6 u+ [7 t3 g
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);3 Y( z1 f! l/ E2 w# `

, H9 ], s* O- H  k3 n        if(DMA_GetITStatus(DMA1_IT_TC5)!= RESET){
2 F; W: x7 W) a6 l8 O                DMA_ClearITPendingBit(DMA1_IT_TC5);
9 s5 `! E- Q, [- X        }
$ v" H; }0 x. Z/ x8 L* B5 L" K  `        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
: E3 m# b# P: \: C$ h0 r        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);  z+ E3 g4 i4 K# n( O' r

0 J" j! U  G# X) |- k6 p        /* Enable DMA1 Channel5 SPI1_TX */
- @1 X$ t) t  v& ?( x5 Q3 \+ g        DMA_Cmd(DMA1_Channel5, DISABLE);
" I1 T* {* V! j; \" V7 E0 H3 B- Y7 E+ p: |5 T' p9 P
        /* Enable the DMA1_Channel4、DMA1_Channel5 Interrupt */  v1 y8 k, u$ \2 y, B
        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
. @; _! q2 y. `+ O# [& b        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
+ r" z0 I$ z) Z: W; A        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
4 |/ J3 R: e/ _3 Y/ B0 E  C        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
5 }2 J. Y, b* h& s+ p+ m! @        NVIC_Init(&NVIC_InitStructure);$ X8 i* R# h6 R" H! c. k2 V

& Y- M5 ?: b: ~. P        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
1 k4 q1 |0 ?9 O) m6 x        NVIC_Init(&NVIC_InitStructure);( V0 ?; p5 x! |" D! i  d. H$ x

+ u3 c( ^/ f, k! b- N5 i+ x        /* Enable SPI2  */: \* Q3 x8 R- W9 v9 \* W0 D
        SPI_Cmd(SPI2, ENABLE);
' Y/ m; j, [/ F% [}
; d5 {2 b# c  V, e# \/**
0 R# v5 {+ a1 q% O  * @brief  SPI1_DMA_Start+ |+ A: a$ m! v  [
  * @param  len <= 40960 V" ^: w; u7 o  x" S9 j; i$ K# h% n
  * @retval None  I6 C+ {. q2 J3 R
  */, p& ]( q! _- l" ~( Z; U' c! `

* r8 V: v: [, }/ i2 o0 Q" {( Hvoid SPI2_DMA_Read_Write(uint16_t len) {! p; A$ z/ }% P  Y/ g
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);9 t+ l) F$ d1 z0 T* Q+ w4 k
        SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, ENABLE);
+ k+ Y; i# W9 b1 R: s' z        DMA1_Channel4->CMAR  = (uint32_t)SPI2_Rx_Buf;- G% B9 S- V. U& d. [8 z5 p6 E
        DMA1_Channel5->CMAR  = (uint32_t)SPI2_Tx_Buf;
0 l+ `8 {( g" {. u3 y# X        DMA1_Channel4->CNDTR = len;1 S) N6 Z) ]5 a* _5 H* ?$ O
        DMA1_Channel5->CNDTR = len;
# t4 {# s* o2 B+ h, S        DMA_Cmd(DMA1_Channel4, ENABLE);
5 Q3 q, Y8 c) e+ Z7 u- L        DMA_Cmd(DMA1_Channel5, ENABLE);+ b! r5 ^; c; u5 O
        SPI_Cmd(SPI2, ENABLE);/ A# m9 b( t' a% \. R9 B7 Z
}8 k" W* w, H$ w& z0 ^3 I, \

3 O" O4 k2 [2 K- a5 q" ]/**' a: z/ }0 x  ~9 F
  * @brief  SPI2_Set_Speed& [9 J, E9 L/ h1 a% V  ~% w! X
  * @param  SPI2 CR1 bit 9 8 7
9 L6 M1 }: P1 Y# ?- Y2 |  *          SPI_BaudRatePrescaler_2   ---> 000
+ m) d  g, ?8 y5 N" x  *          SPI_BaudRatePrescaler_4   ---> 001
, }( o3 P8 {) ~2 {9 c  *          SPI_BaudRatePrescaler_8   ---> 010: P6 o7 m" r& @+ x
  *          SPI_BaudRatePrescaler_16  ---> 011+ S  r: V. l* |2 p; n, j
  *          SPI_BaudRatePrescaler_32  ---> 1009 T2 B* T! b' p2 k: g8 W$ @$ E2 v
  *          SPI_BaudRatePrescaler_64  ---> 101# @: f9 A! W" q8 i
  *          SPI_BaudRatePrescaler_128 ---> 110
" x2 Y" H) \1 C( Q: o) y' i( Y  *          SPI_BaudRatePrescaler_256 ---> 111
: e) z. x/ ^& A( u$ P" r+ W# \  * @retval None3 f' R, S: ^" T  i, E5 R
  */2 g% _! Q: V3 ~7 l
2 Z7 V% V) a) ^: d, ]- i" m
void SPI2_Set_Speed(uint8_t BaudRatePrescaler) {
+ K6 r  D0 c7 U( e2 i$ H        SPI2->CR1 &= 0xFFC7; /* Clear BaudRatePrescaler Value (bit 9 8 7) */) c2 L$ {" Z2 s2 t( c- W
        SPI2->CR1 |= BaudRatePrescaler;& f% o( J: E, d7 r% _* Q
        SPI_Cmd(SPI2,ENABLE);" C, O4 h3 R  V& X
}
3 U9 L. [' x3 k# P; X! s9 D
2 Z# S; F3 @" Z/ v/**
& s3 |/ C6 p) D  v# r! X  * @brief  SPI1_Byte_Read_Write
' ]) c$ s6 Q# b! @7 c) A1 V  * @param  None) X' \( _- y: |* h& X$ p& b: |
  * @retval None
3 w7 `/ c- r% R3 ?0 |* R6 F2 |2 e! e  */
8 ?: Z7 V; U7 |" X5 Q% q- M9 b( nuint8_t SPI2_Byte_Read_Write(uint8_t SPI_Byte) {  M% W: ^% D! J
        // 发送一字节: E- k/ H5 c/ j/ A6 \4 p5 K. S& N
        while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
+ w7 X, o, h9 q! i/ s+ d: y3 c' a        SPI2->DR = SPI_Byte;
1 W8 N# s! R: Y7 N7 C        // 接收一字节4 Q$ ^* \: W" @) r2 N
        while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);2 l1 r( u! V: k% D: F& N4 U) _3 t
        return(SPI2->DR);
' p+ q8 V( q& I0 y$ W}3 I& r5 m4 ]% @: W3 b

+ D+ s6 n1 {& i# w. V! d/*0 b" S& k8 m2 W: p2 g
* Function Name  : DMA1_Channel4_IRQHandler
& T5 A' {. j" }( E% K2 x * Description    : None
" ~- K+ h' Y/ j: g* ^ * Input          : None
, N, d, [6 L1 F: { * Output         : None* {0 |" K; I- X
* Return         : None
+ c0 \; L- Y$ k: W */
7 a5 q2 i) f$ p* w; T) V: X( Q: K. ]void DMA1_Channel4_IRQHandler(void) {
  D8 t7 v: \! J8 x; e        if (DMA_GetITStatus(DMA1_IT_TC4))  {0 @  P* K9 r" u6 i9 o
                SPI_Flash_CS_High();
$ a& K0 |" g: T. G7 J                DMA_Cmd(DMA1_Channel4, DISABLE);; ]; O& ~5 N! S) Y8 l5 [7 K
                DMA_ClearITPendingBit(DMA1_IT_TC4);
0 ~; n4 l8 E3 V- i; g6 x                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);; |% U* r4 Z% \7 M' a) e. Y' ?! f
                SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);
0 h1 f% h0 q3 H                Flag_DMA_Rxd_Finished = 1;
6 q5 `) r' l; `+ H* ]        }
1 G" L, i" K7 {# Z}' B4 y* I7 X, L. g3 j3 S2 d: A

# Q' p5 P  b" b3 }9 ]# ~4 i; c8 m1 ^% N/*6 Q6 y$ M9 T  U: i6 s+ R
* Function Name  : DMA1_Channel5_IRQHandler. i# e: s$ t, a* j
* Description    : None) p! e- j: S3 M
* Input          : None
0 l# N7 k# D% s7 m" P( D3 ]% {& }* _ * Output         : None% [% j$ Q1 I$ o( B1 ]( |
* Return         : None
0 m& w# s8 w+ ~7 a  u3 h$ P */
7 O+ Z! {$ y; q, ~/ d) @4 \void DMA1_Channel5_IRQHandler(void) {
. b& h  v9 X/ Q        if (DMA_GetITStatus(DMA1_IT_TC5)) {( S) U& b$ w! s# C
                DMA_Cmd(DMA1_Channel5, DISABLE);" b+ g% G- s; d; s5 x
                DMA_ClearITPendingBit(DMA1_IT_TC5);
0 F! r" p3 y; A8 o0 o1 C  E        }
( G: L4 G2 W) J! T$ w. X/ o# J}- E& ]8 z1 J- |
$ j' M! v4 u) C3 b6 j8 v/ U
: d% d7 `$ [  Y) ]

  ]4 ]. J! o' X7 g5 y, y- D
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 编辑 & U" l5 }, x* E% S+ F
: [; V, A- b  J5 i; q* R
命令字节发送和接收, 可以使用SPI2_Byte_Read_Write, 也可以使用SPI2_DMA_Read_Write,
/ R% f- E( i" N( b; y这里使用SPI2读写SPI_Flash, SPI2_DMA_Read_Write 可以按照下面的方法使用:
' v5 U1 k1 e- {! M6 @. D" u# r+ B* t6 N
SP2_Tx_Buf_load();            // 数据装入发送缓冲# O( n* R' a; l* D9 R- g7 ]/ X8 ]
SPI2_Flash_CS_Low();         // 片选使能9 ?7 Z0 ~* y3 E6 G
SPI2_DMA_Read_Write(6);   // 启动发送和接收, 在DMA传输完毕中断里片选关闭/ ~( T7 v* @' }, D# e
while(Flag_DMA_Rxd_Finished==0) {
) ~1 P+ A* p7 M1 Y8 @// 使用DMA连续收发时, 可以利用这个空闲做一些事情# z" E- H6 l7 c# A& N$ Y
// 如果是用SPI2_Byte_Read_Write, 单字节收发就没有多少空闲时间了
0 {. L; `1 ?1 K8 n+ M;
, y3 M4 v- R! ?1 Z' l}
! A) Z3 c! y. t: I9 h8 ^0 [) W" dFlag_DMA_Rxd_Finished = 0; // DMA收发完毕,标志清0
3 F7 h+ X' [: ^/ u1 @# E4 p6 V' _* k; Y& E* d: |

. Z" A8 z6 t$ y+ ^. I" \
, X- f3 f1 b1 N4 A4 Y
! o, E7 ^2 M' E% }9 a1 m! i! Z! L! A' e; C6 ]3 j
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版