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

STM32笔记(四)DMA、USART的演示

[复制链接]
私奔 发布时间:2009-1-4 14:30

4 b  v& H5 H, y4 B7 A      这里有个小小的例子,来演示DMA模块与系统程序并行工作。
2 J3 a4 `4 a; }6 d  用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。9 Q) i6 H. i: @  d2 }$ Y
  使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。
1 J% i. [. L& u7 q0 _& m  这个是相应的代码例子,基于STM32F103VBT6: b& u$ @4 n3 x: b" F  n' V' y

: t$ }2 j/ k5 E! D: W: [" L3 E" h% z
/******************************************************************************
' {! Y9 k+ Z! Y+ G6 K* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()7 B. X5 P8 y0 S6 X5 m" p) H% M
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
  [6 k! w1 ~: Y6 p8 d  s* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
% ]* \, [/ _+ Y1 }4 G8 e* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART- P9 _$ t% N. S2 h' j5 V* O2 e
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可% f8 J1 e, M/ F- T$ G
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止
- j) @; I6 y0 i) C- S. V$ ^* 串口依然发送,表明DMA传输是一个独立的过程。+ N3 i6 Z3 }. Z: C$ _
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理9 ^- m# q* R0 g$ l' Q5 ?& M
* 作者:jjldc(九九)& c& `0 b- W$ u' _
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
" K# _2 Y, E4 W2 E1 u) G0 d; |*******************************************************************************/
- d/ B, n( w. q+ z3 o$ n# B
, h8 B/ x8 \$ h( r3 C8 n5 E/* Includes ------------------------------------------------------------------*/: u# e; p/ \0 \: j1 F0 a% v) x
#include "stm32f10x_lib.h"
9 x' m8 |$ i$ B5 x+ K( P#include "stdio.h"/ `9 b4 ]1 a# L9 n
6 ]; M) s; k) _" y6 z9 t
/* Private typedef -----------------------------------------------------------*/+ T+ i7 f$ R3 ^% W+ l, ]
/* Private define ------------------------------------------------------------*/
! X! {2 A  B. K9 ], l' o#define USART1_DR_Base  0x400138041 V% e) X4 z; e1 J  ^" H- s2 l

' E; d/ |! c/ D) q8 F$ f# P/* Private macro -------------------------------------------------------------*/* o3 x, E" W( b
/* Private variables ---------------------------------------------------------*/
. c& H( E7 t9 |* P#define SENDBUFF_SIZE   10240
" I+ Y  Q- C8 z' Y3 I- W: Qvu8 SendBuff[SENDBUFF_SIZE];( E# P5 |4 ]& u! N1 n: o4 g
vu8 RecvBuff[10];& K6 N4 a- n) V% g: y. @& u
vu8 recv_ptr;
; z- @1 A& F4 ?6 b1 h) s: r! V+ T" e( H; b7 Z6 d7 C
/* Private function prototypes -----------------------------------------------*/
. T% v3 L" P9 d4 I) F1 j- N* Qvoid RCC_Configuration(void);
4 v. F: E% F2 }* \void GPIO_Configuration(void);9 E4 O. o- C0 o0 @, w, e
void NVIC_Configuration(void);# {1 K+ A8 S9 b6 w' N% ~# X
void DMA_Configuration(void);
4 ?" h6 H+ `4 a6 c/ u1 G1 Z! tvoid USART1_Configuration(void);; f* A6 r" _# k7 b; k4 H* y

* a$ n5 a- j# pint fputc(int ch, FILE *f);
. ?  l4 Q3 h* C% ?* }) L& \; l2 O7 E$ fvoid Delay(void);! B0 F( r1 [8 o# k* E) s- A3 Y
$ I+ M- P" H/ e
/* Private functions ---------------------------------------------------------*/8 K/ S4 W+ v% |5 s( m
/******************************************************************************** [  r4 q7 n! N  ^8 e& A
* Function Name  : main
! d8 ^0 o& i. b4 N* Description    : Main program.8 X6 y  d2 m4 n  \
* Input          : None, Q+ S/ A6 l/ y/ |% Q
* Output         : None5 V/ i- v, A. p8 j1 {
* Return         : None
" F" S* N. ?2 J*******************************************************************************/! p' f( S0 }/ M" a7 I: m8 M  u
int main(void)) m7 e. S' r! [. l' ^
{
: {/ J7 m2 H1 I' L    u16 i;
: ^' r& u% ]8 t9 G#ifdef DEBUG
  T8 n% x8 M  L! p    debug();3 |$ g! ~- c& a# L* K
#endif, |* M6 b: F8 B7 x# R+ j
    recv_ptr = 0;
5 \+ B& K& i" e" k    : J( ^  [$ |9 ?  E, L
    RCC_Configuration();
, ~/ N4 v- f+ h5 w3 _2 V( A    GPIO_Configuration();# N2 o8 R' n6 t9 X  D: \( ^* a
    NVIC_Configuration();
# b- [4 J5 i- `/ m% p    DMA_Configuration();1 G/ B) {- f) ~& E! u% j* x
    USART1_Configuration();- D, u( x6 y  _: c
   
, Y! r" |! b5 J0 g- y! u    printf("\r\nSystem Start...\r\n");
% V7 C2 }6 I0 W/ }    printf("Initialling SendBuff... \r\n");
$ v* ~9 U9 a1 E8 S+ ?& k    for(i=0;i    {9 p0 t6 b7 J, S7 e# s4 t/ }: c
        SendBuff = i&0xff;
% M0 y( `- u3 v2 [$ H; C4 q    }6 @  _0 H- P/ s% I
    printf("Initial success!\r\nWaiting for transmission...\r\n");
' y4 L$ V. _  a2 J8 N2 R    //发送去数据已经准备好,按下按键即开始传输5 P2 o4 p! z' x5 _' ]1 Q5 X5 V! M( Q
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
8 \; u$ n& D7 l8 ~2 l/ }   
0 ?6 }2 y" k9 ~9 ~: A0 y6 i/ U    printf("Start DMA transmission!\r\n");
: i5 q% D2 @$ E& F+ r   
9 w2 ]3 Q) n5 g: U6 i0 |    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
8 R: q8 M0 ]# |$ v2 s2 ^" z+ @. ]$ R3 F    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
7 j! j4 Y& V! j/ u    //开始一次DMA传输!1 j' t% D+ H9 Z
    DMA_Cmd(DMA1_Channel4, ENABLE);# R# r- g3 K, N8 g9 ?. x  M. F: A( C
   
) F: r! J% c$ V+ |, B* c5 k6 Y* n5 A    //等待DMA传输完成,此时我们来做另外一些事,点灯
, r( C/ a  L* K8 G    //实际应用中,传输数据期间,可以执行另外的任务1 j5 |7 L+ I3 L  t  P4 f! @
    while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); Z* V( [; }+ M' e- q! d3 l# U
    {. `0 {  z4 u6 J0 ~" \* K+ q
        LED_1_REV;      //LED翻转# m5 \7 t; u$ d
        Delay();        //浪费时间! _' h/ I$ e' ^/ P. b
    }
. N0 W$ D' U( O+ e7 V    //DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
/ x; m5 c' f9 p1 H- G    //下面的语句被注释
9 j( S: M  d1 k6 j1 d/ r    //DMA_Cmd(DMA1_Channel4, DISABLE);6 u; e) L# D4 q
    - A, }. w! H1 k
    printf("\r\nDMA transmission successful!\r\n");  o7 Z# C5 m- T! Z+ o3 y! f
1 P- C$ L( G; c4 ]- c" {- `$ F2 @
    & p  y: z. _' E# S
    /* Infinite loop */9 w, F* f# ?' V# g4 g9 t
    while (1)
6 n) ?- l( \; R7 n# c8 S    {4 w) E+ q8 |0 E% E8 F
    }, T. m. @+ M, z% R6 O
}
2 u- G* ]. Y  [- M0 n" n" u/ n4 O( `: T+ C6 n
/*******************************************************************************$ X9 m8 `% x6 z" Q' e* g
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)# T4 R$ p2 |. k
* Description    : 串口发一个字节, C$ }, C1 S- o/ F# c' ^# b
* Input          : int ch, FILE *f- _6 A; k/ Y4 D. K$ E+ N* e, k
* Output         :
1 ~7 b' }1 v; }) |. M1 B* Return         : int ch- J) i$ ~# b. |# F: g. J
* 这个是使用printf的关键! g' ~7 J- D; v& f
*******************************************************************************/5 C5 E5 s6 n# r; r4 d; h
int fputc(int ch, FILE *f); B: i( j& E( H: T0 n
{
' A6 @4 @/ |; u- c4 o9 [0 j: A    //USART_SendData(USART1, (u8) ch);; {. b* A7 {+ _
    USART1->DR = (u8) ch;3 R8 e; W" r4 F+ h
   
) C' z3 f3 W0 q& J& e/ x+ @3 ]+ Y    /* Loop until the end of transmission */% x# }, h1 n) l9 w* V. l( A$ T
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
) b" j6 ]& @+ ]. ?/ j8 h    {
( t3 o  l) p( G! j, M! \, u    }
7 C  J( Z; W: y" y% U5 n: L/ L0 O6 x7 N) n
    return ch;9 o9 r, y) {7 Y; Z- W; S6 g
}: S+ _) O3 q( n; ?, a

: Z$ _% E2 I6 L9 S5 i# U5 k8 l/*******************************************************************************/ U' A" n- ]& S2 K
* Function Name  : Delay
; F/ G7 M. \) n; }- m9 n; d* Description    : 延时函数
- O( y0 j6 F& m* Input          : None( x6 B  _9 W8 R: M1 b( e' Q- V
* Output         : None
' l% C( ^" g2 g# _+ U3 u/ J$ Y2 f* Return         : None( F" W0 c0 E0 _
*******************************************************************************/
0 {8 L; t1 L5 [& |4 |3 s% evoid Delay(void)( J* J5 d$ N! W$ f& A1 I2 Q) ^
{, S, p6 A9 f4 t
    u32 i;' W$ `' Q! f  @0 r  _
    for(i=0;i外设
! n) O& |1 K$ }- j! a$ [5 m    //每次传输位:8bit+ i) q1 E1 `! {9 U
    //传输大小DMA_BufferSize=SENDBUFF_SIZE$ m7 T2 O  s& t1 T. M
    //地址自增模式:外设地址不增,内存地址自增1
# @6 e& b2 d* V0 T  Z& `1 K% {* X    //DMA模式:一次传输,非循环
- k+ I" I- B3 J    //优先级:中
0 g$ m! C1 s( u. B9 q! h    DMA_DeInit(DMA1_Channel4);- @3 N5 w/ A! a5 f( \0 r# c9 W2 N
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
5 B$ U) w$ ~2 o0 |: _9 u    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;0 \5 M8 Y! k2 [. V1 W
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
+ E! U0 k. p" Z5 }; q- z    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
. L% F5 [1 f% O, H% A# p    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
# u5 }; `0 U+ P; D- }    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;+ Z1 J$ s. t" s" M
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;9 j, i7 j( o' o( h; F
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;1 |& |8 N3 X1 G2 A9 v) v
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;* t  h$ @- x' _2 R9 @# L
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
5 D  z7 V  ^: \) V    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;& |7 X6 G) G* j5 \- Y) [
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);1 i, T; _7 v7 _+ w& _
}
收藏 评论44 发布时间:2009-1-4 14:30

举报

44个回答
jjldc 回答时间:2009-1-4 15:59:06

RE:STM32笔记(四)DMA、USART的演示

大哥,转发我的东西,也把附件带上啊,请给我的博客一个地址吧,注明一下出处,嘿嘿。辛苦您啦!
私奔 回答时间:2009-1-5 12:18:28

回复:STM32笔记(四)DMA、USART的演示

原帖由私奔于2009-01-04 14:30发表:
2 @5 c: o1 k7 [8 H2 y. I  这里有个小小的例子,来演示DMA模块与系统程序并行工作。
* N$ ^5 r+ Z' K. b( `7 j  用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。8 m# G8 e+ h& }, Q" G9 g
  使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。
+ v8 T& P1 q, f/ `  g  这个是相应的代码例子,基于STM32F103VBT6
5 z+ s+ _1 k+ G# j  a5 T, k: H/ r4 D6 t& ~, k" V' ~" J: ~
* c# I( X( C# |- |2 `8 U
/******************************************************************************
, p9 j" s- x% K: e7 R* N* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()+ F5 B1 y' ]5 m1 A; x2 Q6 |& [
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
# E  y2 I8 J5 y) E* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
0 S  F- I5 ]8 P7 |, V* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
. L! o* X' z( S7 P, i- v* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可0 `4 K( d/ e, d5 u9 z
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止; O+ d( l) \! e9 C  c- p4 C" b; C  b
* 串口依然发送,表明DMA传输是一个独立的过程。
) ^4 I- {; h3 t# t3 J* z. c* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理+ r6 w& \6 @3 l* W
* 作者:jjldc(九九)$ m$ c* R% b# ^. d0 V' e
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
; ?1 s8 s8 [- O*******************************************************************************/
+ F# r1 P9 D9 ~! T2 [8 r8 U
$ g* n0 X* i; z3 E# r+ V/* Includes ------------------------------------------------------------------*/
% i8 c, k* `& J6 Z#include "stm32f10x_lib.h"* B( Q, w9 Y1 H
#include "stdio.h"
0 B) W* ?2 Y4 F0 P& h
$ A+ _4 U/ @1 P/* Private typedef -----------------------------------------------------------*/7 z- h" h8 }$ e7 S# G& k9 _( e
/* Private define ------------------------------------------------------------*/
- K7 u7 T2 R1 p$ o+ V#define USART1_DR_Base  0x40013804
4 t4 B9 _7 F9 _+ p$ r4 Z1 `
2 ~) Y' B4 i% B0 \/ C: M/* Private macro -------------------------------------------------------------*/$ ]* C$ V2 ?# V4 u$ s( ^
/* Private variables ---------------------------------------------------------*/
/ N0 ]+ S, }/ l  x+ {#define SENDBUFF_SIZE   10240
2 f! A. B/ l/ j8 B+ M9 Jvu8 SendBuff[SENDBUFF_SIZE];2 C9 J8 o# p: u3 F: x8 q6 a
vu8 RecvBuff[10];# i/ i, Z8 Z( ~8 ^
vu8 recv_ptr;
/ D+ i# G7 [+ q* A
3 P1 l- D7 N& I' H7 X/ A/* Private function prototypes -----------------------------------------------*/0 n3 F  N* X+ A* L1 g: L% e% \5 [
void RCC_Configuration(void);) V4 x% J* Q% x+ `& U3 P1 R% @: `9 r" Q
void GPIO_Configuration(void);
; \! n7 `) s5 d# ~6 q- ?void NVIC_Configuration(void);& R0 n  j" E1 q, i" \3 j
void DMA_Configuration(void);
: F5 s  o/ G& Avoid USART1_Configuration(void);7 Q4 A7 x4 h( B
' ^1 S+ d8 D( I) {# h9 Q* x
int fputc(int ch, FILE *f);
, T6 A) M; g/ P3 K, `void Delay(void);
1 R/ p- I- _1 o+ [; A: B" b4 l3 r% `
/* Private functions ---------------------------------------------------------*/
$ c3 b4 I7 `! A2 J/*******************************************************************************3 \- p, k: b1 a, B) a' K3 h! |8 C* v
* Function Name  : main4 c# X6 U( M1 m2 N  Y8 k
* Description    : Main program.3 {) r! u8 C0 |7 f
* Input          : None+ J9 L% t+ }9 ]% s5 _* i
* Output         : None' R1 K/ m5 k- n2 ~- u3 x) {& x
* Return         : None
$ t. |' d1 a' w9 R, h5 c*******************************************************************************/
' d, o& _# o- iint main(void)0 j. }* t* c4 e5 t! d
{6 `) y* W+ {+ L
    u16 i;2 s$ r0 U1 G) c$ Q5 q
#ifdef DEBUG
0 E4 a" M6 X' m. [* J    debug();
) o7 h6 Z" ]0 V; _5 L0 e$ P3 d#endif9 l$ F' w3 _5 n3 u$ T- e
    recv_ptr = 0;
. ]  P+ _% O* _* U    0 W1 A0 d* q# S7 l0 s* U7 U2 m
    RCC_Configuration();
" t$ G) C8 P# w3 x; w/ _2 M8 E0 c    GPIO_Configuration();) S- N" q  Q0 p  t; `  s
    NVIC_Configuration();
4 F# o5 ^) X# c0 Q' A# E5 y    DMA_Configuration();
/ B7 `+ g" t( c- b' \2 S7 x7 z    USART1_Configuration();+ T" b3 J( v/ g: c
    , T  ?3 r) d. x0 G/ g( p' i" ]
    printf("\r\nSystem Start...\r\n");6 I- |1 Q: Z5 o6 n0 m
    printf("Initialling SendBuff... \r\n");
& |% |% F& D- M; B+ l" P7 M( Q    for(i=0;i    {& p* z9 a9 M. Z* }8 n7 S( `
        SendBuff = i&0xff;
" d+ q7 @2 [' J    }+ Q! R% E% F, x; s
    printf("Initial success!\r\nWaiting for transmission...\r\n");# A5 u# `. [* a3 z! s9 z9 v3 {$ F
    //发送去数据已经准备好,按下按键即开始传输! u" ]' Z3 r( ?
    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
! J4 @$ s9 @9 ]- B6 r5 ~3 ?) X- B   
% H2 Y$ h2 ?) T    printf("Start DMA transmission!\r\n");
. z+ P! J- I7 l# i4 H4 P! x   
+ h0 {# P7 h$ h" }1 F    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作+ W# L) k- _4 G" D  Q- e
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);  v3 c0 q  W& e6 s+ R
    //开始一次DMA传输!
: e% ~, x9 z# S3 Z3 ~" t: R8 G    DMA_Cmd(DMA1_Channel4, ENABLE);
( R# q6 R0 X- y, i    6 B. E7 Z9 a7 h1 R8 c
    //等待DMA传输完成,此时我们来做另外一些事,点灯
, N' z3 Q- Z7 u, `/ p. Z  P    //实际应用中,传输数据期间,可以执行另外的任务
; f$ |( b2 e; x9 {    while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
; j2 ~, f- _: _1 V- @& A$ f: J3 m    {# _. w! y3 g- |, j: E
        LED_1_REV;      //LED翻转
9 \5 h. N* N2 |1 Z        Delay();        //浪费时间
  T$ R1 L* @  m- j0 A+ X* U    }/ S' I- l# ^: v3 P+ T
    //DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
/ q! \% t" y; Q$ P+ u/ o    //下面的语句被注释% P8 d# I4 `- h6 p
    //DMA_Cmd(DMA1_Channel4, DISABLE);
2 d/ }8 h  C5 Y6 j& Q  X    4 P4 e* F( j+ z( t# ~/ g2 H
    printf("\r\nDMA transmission successful!\r\n");8 I6 l4 c8 l% a, o' t6 e

- Q2 h8 V3 U. z; s3 L   
! C' {7 \7 y* }9 V    /* Infinite loop */
! S& V8 u/ P* W3 S3 W; m    while (1)
1 K* F# F5 _, l& e* q    {
4 _5 M* Y0 @: E1 z/ D    }/ X1 W" z) k* |) S9 \$ F
}
, d2 h* l" }( Y* z8 N+ u# \
3 ?9 s7 j4 r- u( C/*******************************************************************************( W. R! `: K" `! @8 g& }) j8 D
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)
1 O% l5 L: a( W5 ]  \* Description    : 串口发一个字节4 S# I/ [" H2 j9 C2 y) ~" x
* Input          : int ch, FILE *f% q  ?9 f* D+ b; w3 N
* Output         : 0 K" w/ L0 ~2 O: a" m& E( Z
* Return         : int ch2 r6 P( M$ x0 p4 Y2 [
* 这个是使用printf的关键5 a# ^- n0 {$ O) F, `0 B% U
*******************************************************************************/$ C! @3 j8 t7 F2 G( U5 R6 E3 f
int fputc(int ch, FILE *f)1 R1 ?- t2 H( x- L
{
! O1 K  k6 R; x4 r) B* _8 ~    //USART_SendData(USART1, (u8) ch);
1 J1 o9 ^' K3 u' M; s: F    USART1->DR = (u8) ch;' c9 |0 o: l( S
    ; x0 R8 Q+ N, p# s" r
    /* Loop until the end of transmission */
8 Z8 Y4 }/ O5 L% y$ |  N    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
4 r" ~7 X3 f8 [7 D    {
6 d2 {( v* j) a$ W+ d' m    }
) g3 c8 H2 o: w
5 T5 s! _, V5 c  X  x- r" X" X    return ch;
) h8 J2 d  z9 ?: ]0 ?) W" T4 {}
' a- ]0 i- ?  D! a' ?# u% y1 o7 U  ~. g$ P- h3 C; i
/*******************************************************************************! }' Z9 B1 I# C) @
* Function Name  : Delay
$ Y1 J* P7 w: [8 J: V, G* Description    : 延时函数
" _, K" e2 C4 C* Input          : None
' S, w- r# n+ B* Output         : None* |$ _5 F& [! K& ^4 B
* Return         : None6 l3 P7 z$ n. V, a1 m( h# F2 S
*******************************************************************************/
" o% Q# S; B" Pvoid Delay(void)+ ^; [; W. h$ A0 T! F2 T' }2 ?3 r
{7 F( ]% W; A5 L
    u32 i;
# y7 l1 V$ |# f2 _  J* B    for(i=0;i外设+ U; K0 H+ ^' q# n  ~, t+ q) ~
    //每次传输位:8bit' n' K! U% e6 P8 \: A( ~
    //传输大小DMA_BufferSize=SENDBUFF_SIZE
% O  G2 x5 @, o  Z% T5 k    //地址自增模式:外设地址不增,内存地址自增1! E: h- a1 I. k" _' n- Z  ^
    //DMA模式:一次传输,非循环* R. D) m0 }7 y. K2 t+ F) O: [
    //优先级:中
1 R! N0 T& P3 t% ?; V9 r    DMA_DeInit(DMA1_Channel4);& K0 J  H) y/ q' e# _
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;+ g3 e9 b1 C1 b) R+ W' g
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
8 s# ~1 d% X0 e) h! C# m) d% F; V9 s) v    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
# H  ^7 T/ Z7 z- c. [0 |    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;+ k- N4 b4 X" i
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
: `0 u' W9 M; G5 R" d- N! F1 W    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
; W$ g. Y" N% R$ a/ ]3 f3 T    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
6 L8 ?& g( k* ~2 \    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
% S8 X* j+ ]' s" Z# A    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;8 a% p- J7 g* z
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
; Q# Z7 Q7 E' h: A! ^7 g, M0 x    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;, M. {- D' A& D5 H  z( k
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
, R- E8 c$ z$ l, k2 r}

例子.rar

下载

174.52 KB, 下载次数: 346

chentingzt 回答时间:2009-2-18 15:03:23

RE:STM32笔记(四)DMA、USART的演示

多谢大虾,好东西啊!
hjf2002 回答时间:2009-2-20 00:18:53

回复:STM32笔记(四)DMA、USART的演示

多谢楼主!
jiangping2007 回答时间:2009-12-15 15:49:18

回复:STM32笔记(四)DMA、USART的演示

回复才能下载,真恶心!!
zzz80675@sohu.c 回答时间:2009-12-24 12:07:53

RE:STM32笔记(四)DMA、USART的演示

多谢楼主
zzz80675@sohu.c 回答时间:2010-1-4 16:54:22

RE:STM32笔记(四)DMA、USART的演示

多谢楼主
wunihaoo-168150 回答时间:2010-1-19 20:10:10

回复:STM32笔记(四)DMA、USART的演示

学习了。。。。
yzk376 回答时间:2010-2-5 11:46:41

回复:STM32笔记(四)DMA、USART的演示

谢谢
baobaoaileilei 回答时间:2010-3-19 08:21:37

RE:STM32笔记(四)DMA、USART的演示

学习了,多谢了
weidimay 回答时间:2010-3-31 18:43:49

回复:STM32笔记(四)DMA、USART的演示

11111111111
Finovance 回答时间:2010-4-17 13:03:49

RE:STM32笔记(四)DMA、USART的演示

好东西,我搜产了!
ligang-159741 回答时间:2010-5-8 18:03:38

回复:STM32笔记(四)DMA、USART的演示

haohaohahhao
yaoguai100 回答时间:2010-5-11 18:56:35

回复:STM32笔记(四)DMA、USART的演示

e] <font class="jammer">( r0 h' J0 |# m0 Z% z% Z</font><br />
<font class="jammer">! C7 q6 w* V! S" B4 I) e8 R</font><br />
haodongxi 好东西启

 ( r0 h' J0 |# m0 Z% z% Z
! C7 q6 w* V! S" B4 I) e8 R
haodongxi 好东西启封箱
123下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版