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

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

[复制链接]
私奔 发布时间:2009-1-4 14:30
阅读主题, 点击返回1楼
收藏 评论44 发布时间:2009-1-4 14:30
44个回答
lovestm32 回答时间:2010-5-13 10:32:00

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

很好,很强大
meiguang1028 回答时间:2010-5-23 14:52:49

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

谢谢楼主分享 好好学习一下!
盛超電子 回答时间:2010-5-24 08:19:01

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

好资料啊,希望以后写出更多好的例子方便初学者学习!
linghu2 回答时间:2010-6-21 17:28:19

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

 / w6 D2 b  i: `4 v; C8 }. H2 R
好文章
shuben-193481 回答时间:2010-7-3 16:39:15

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

多谢LZ,学习中。。。
clonehe1225 回答时间:2010-10-8 13:47:50

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

请问串口中断中接收数据怎么弄的?
lf8013 回答时间:2010-10-8 22:20:07

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

好资料啊,正在学习,谢谢了,顶
leaf198310 回答时间:2010-10-22 09:39:56

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

DING!!!!!!!
xiangxp 回答时间:2010-11-24 20:06:16

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

很好的东东!我喜欢,非常喜欢!
zetkkknm01x 回答时间:2011-1-6 20:54:59

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

谢谢,下载附件!
ml8866 回答时间:2011-2-21 19:51:04

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

非常感谢
zttyler-56924 回答时间:2011-3-30 01:11:19

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

很好,很强大
lihengjie0910 回答时间:2011-4-21 15:13:45

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

回复第 3 楼 私奔于2009-01-05 04:18:28发表:
原帖由私奔于2009-01-04 14:30发表:+ B8 u: @/ ?, Y+ f& ]
  这里有个小小的例子,来演示DMA模块与系统程序并行工作。1 @5 `, A% W+ ^& ~* o  w$ P
  用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。2 ^$ z/ T: M6 ^' A- J1 @& {6 V
  使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。
% {, G/ D+ _8 A. G0 r6 V  这个是相应的代码例子,基于STM32F103VBT6
5 X( {  j# D* ~+ @/ B
8 D1 X: J: \' g- nsdf
0 `6 j" _9 ]0 z9 `/******************************************************************************
* Q: H' C! x' F+ d1 o9 y* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()/ U0 J: w: d$ \
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
/ c7 w- Z1 f3 Z& B2 K6 U9 j& H* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,; K& `+ {5 F+ w: Z
* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
# g* H& p% J+ W+ W/ t2 h; j# g1 x* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可& P$ I' a5 `2 ^" h) u! R
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止& L; p, S1 }8 [3 [! s  `/ n
* 串口依然发送,表明DMA传输是一个独立的过程。" R0 u* e/ U4 P" i3 p, V# s
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
% ~8 B0 Q$ F7 g0 S, Y' C+ E6 W* 作者:jjldc(九九)
# V+ G1 c& c; d% W8 v+ N* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
) t0 ], e1 d; Q/ M2 f) d*******************************************************************************/
; L4 ]; e% Z" l! t7 D9 Y! B# p0 l, A# t  i) \
/* Includes ------------------------------------------------------------------*/$ N! g1 V3 q' }* I( ~' h
#include "stm32f10x_lib.h"
) k# f0 z6 p7 J  t#include "stdio.h"( u/ H9 M& A3 j4 C" m5 ~3 q/ d
+ F( n- P+ `. u. a& F
/* Private typedef -----------------------------------------------------------*/
, A6 [6 G6 I! Q  v+ D. F/* Private define ------------------------------------------------------------*/
% o8 s5 y# j) X6 Q# W3 f#define USART1_DR_Base  0x40013804: R. ?) C& B, }4 p/ }9 G+ |
7 _* |$ J/ l* E$ j2 i
/* Private macro -------------------------------------------------------------*/
& l0 \- B3 F. y# _* }/* Private variables ---------------------------------------------------------*/
3 n7 S& w5 @& v#define SENDBUFF_SIZE   10240
( Y5 u% E; l+ D% V1 @& [* ^9 qvu8 SendBuff[SENDBUFF_SIZE];
3 z  H8 d+ l; g+ q4 f1 B- K% Lvu8 RecvBuff[10];- P- p) G1 g3 b# {
vu8 recv_ptr;- j  k, T( W( \! s3 G
3 u. a0 N4 R# \3 s% y
/* Private function prototypes -----------------------------------------------*/
* z! \0 p" j- [9 cvoid RCC_Configuration(void);
. O! n1 p1 g9 f+ y. ~. Pvoid GPIO_Configuration(void);# X5 Q2 _0 F* m
void NVIC_Configuration(void);4 h! {, }+ V5 l
void DMA_Configuration(void);( K5 l8 I6 m4 w! r4 J
void USART1_Configuration(void);
( D/ V* H% u# Z7 O
/ _8 n: X$ S; K; R( M. E( ]int fputc(int ch, FILE *f);$ C! E  [( d( E0 @# i& a
void Delay(void);
; J2 z! [' [8 N0 w; g/ P  ]* m* r( O
4 R* P  Z9 Y/ M; x/* Private functions ---------------------------------------------------------*/& V' Q: d" b9 S. ?6 a
/*******************************************************************************
4 M& q, H5 c2 i- N% z3 t. r  o5 Z* Function Name  : main
' ^, s: @% c6 o5 A7 ^. L+ H* Description    : Main program.( C6 \( u; ]" L. W3 S+ ]# ]
* Input          : None3 q; Z( U7 L5 ^8 m4 C& _7 Y
* Output         : None+ U4 W! ?# q6 T
* Return         : None
& g, N+ y6 l  m9 Y*******************************************************************************/
3 i6 ^4 [( z8 t* M* mint main(void)
# Z- p: ~8 O2 m# t, c/ w{1 T0 m9 w6 n6 x  n9 v
    u16 i;$ \4 s; A: |- P, K5 ]
#ifdef DEBUG
1 c4 ~; E8 a5 l' }% i/ ?" v    debug();
4 x. w# Y$ Y  N6 D! {+ N#endif
1 k" \' T  d5 E# {    recv_ptr = 0;) L) [  k1 O. o3 F2 E
    ' k* O2 P! u0 v/ l! Z) f; e
    RCC_Configuration();7 k9 g: G5 w8 {7 A! _# z$ L
    GPIO_Configuration();$ S+ b: d- F8 B6 K% H
    NVIC_Configuration();
: ^3 ?& N; m2 F    DMA_Configuration();6 R/ k" F0 A1 C5 I) ]
    USART1_Configuration();
, ?* e$ m2 T4 z/ `    4 B. Z2 d5 G% P! g
    printf("\r\nSystem Start...\r\n");
! B' H. ?: Y( ]# r7 {( J& f    printf("Initialling SendBuff... \r\n");
4 O6 i: U/ M8 ~    for(i=0;i    {
4 i! ^  E7 H1 S8 S9 ~! S        SendBuff = i&0xff;
. p. ~0 S. b+ y, i, N( C    }
' S; {7 D& I& N7 h) ~    printf("Initial success!\r\nWaiting for transmission...\r\n");& r, x% ?, o8 i9 W
    //发送去数据已经准备好,按下按键即开始传输
5 i! ~& ?. s" N9 ]% R    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));( P0 i/ R/ K; L* V4 f+ s9 r
   
; D$ Q  U3 @: P6 X    printf("Start DMA transmission!\r\n");: r7 w5 J! w$ i  a0 Q
   
+ @7 p; Z+ x4 `, D3 _    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作! \& v% o2 {4 F' ?. t
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);( l3 J% G2 u: S7 G
    //开始一次DMA传输!
' l2 Z( q2 k6 A. w+ C( E, s9 J    DMA_Cmd(DMA1_Channel4, ENABLE);
2 l; N' A* ?5 B% q5 Z% ~   
% r" F9 s+ V! V- s6 B! \7 X    //等待DMA传输完成,此时我们来做另外一些事,点灯
- e% I. X1 n; R0 O    //实际应用中,传输数据期间,可以执行另外的任务
$ L/ q$ g5 T5 Z2 }" E  B    while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)5 u% `7 t# s* ~* {$ o. X+ \/ g
    {
( r+ ~1 Y/ s% C+ e- e6 k        LED_1_REV;      //LED翻转1 O2 u- c. e# @5 T! O
        Delay();        //浪费时间
9 K/ p" H/ I' f1 h" N5 t6 y6 k! ~    }
) h$ o9 t1 o. d3 `4 @  X    //DMA传输结束后,自动关闭了DMA通道,而无需手动关闭! {8 D% B0 \6 r# X: r
    //下面的语句被注释
/ G3 F* V& y- \+ K. k9 z' o    //DMA_Cmd(DMA1_Channel4, DISABLE);, e* q: }0 A$ D# E
   
9 ^' b6 |4 |4 W" q! f9 w. ?    printf("\r\nDMA transmission successful!\r\n");
0 A! k* T* d8 q
( c3 V3 U8 `. b' I% n) M. M2 \5 c    * ?4 b# D; l7 g  N6 [, I
    /* Infinite loop */, y. {) P3 `: J! P6 q
    while (1)5 Q+ u6 i! l+ U  R0 N  v/ P
    {% U' d9 b/ M3 Q
    }3 h5 y0 B3 U  {; R0 K4 s
}9 L8 S% j+ K: A% ?6 b
  u) r1 b0 c$ y
/*******************************************************************************. o# f0 k5 O) Z$ P1 A2 K2 z4 n
* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)3 S& ?4 q5 |" m/ m
* Description    : 串口发一个字节* c$ z9 D# Y" @6 G1 O6 g
* Input          : int ch, FILE *f
1 [) v! _3 y5 o' D' x% x3 w* Output         :
; o/ X6 \6 E! |) b4 z* Return         : int ch
; y) B! P/ g7 S0 R8 m  [8 A* 这个是使用printf的关键* V9 g, n2 y' b) x
*******************************************************************************/
7 Z* o' Q& ^/ ?3 b" ^* R3 Mint fputc(int ch, FILE *f)2 @0 p  Y! C4 L$ Y! `6 _
{
0 o  _- t: Y& m; J9 C' s    //USART_SendData(USART1, (u8) ch);4 j5 W' N# z0 G: o# u
    USART1->DR = (u8) ch;- E& T5 V, w8 }) K5 }
   
+ a  {. V0 D; U+ X1 H# U    /* Loop until the end of transmission */; D( U8 Q8 l% M4 j4 G, C& ~0 X
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
( x$ M; h- L2 e, U$ y8 N: I    {7 B3 X# F, a1 V. a5 h: J  h% A2 x
    }
5 F* ~' ^7 t& g
, A# D/ A, u" [; ?    return ch;
/ o+ q8 d$ L0 I! L}
+ m; P7 w; l6 t! `, H: o' n! z- S7 m- n6 [/ R
/*******************************************************************************
* P; ?- b1 v7 @! X; B7 l* Function Name  : Delay
' d# l' g! k4 r# g* Description    : 延时函数
$ }7 x2 T! x5 F; U4 w' V6 N* Input          : None. g) U* G; w6 w8 o/ O; k
* Output         : None
( E3 c+ I, B- b/ u* Return         : None
) O9 W+ R# |- m) \1 ]# m+ g*******************************************************************************/
9 @- X5 d# v  [8 p: I1 wvoid Delay(void)/ D4 ]! s2 H& _" k1 F
{* G, a8 R' q4 Q. O
    u32 i;' v& p# v1 m" r, A
    for(i=0;i外设+ C9 r! G- N" K3 S( g8 ]
    //每次传输位:8bit
3 M9 z4 r# A8 g" k    //传输大小DMA_BufferSize=SENDBUFF_SIZE
: q( ]; G' D8 K" x( H3 m3 ?! x8 _    //地址自增模式:外设地址不增,内存地址自增1
  m+ s3 P. g5 v8 u$ g) j    //DMA模式:一次传输,非循环8 e0 R) S+ t/ j4 ?( [
    //优先级:中$ M9 E: c4 P9 x9 t" o
    DMA_DeInit(DMA1_Channel4);2 O, C& i4 `. e4 l6 S! s" ?
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
' X8 O& n8 B6 g0 Y9 T    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;) g$ J  |4 U* u) N& x) v- i
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
( M" I' x! e. _0 V    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;/ Y" R# \, t% x3 Z5 Y- X& B; S1 `8 N
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;; }( B; h! T; A5 F
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
, W. I; Y1 o+ T' ^    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
7 h0 X0 Q# e, u; s/ g: g' q    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
2 o) ]8 k) ]* c5 f" T9 {    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;7 X% ~: d8 F$ s1 r) X/ x
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;* d7 X, N3 Z: ]+ q0 |
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  }( L8 K* U! A. u9 R
    DMA_Init(DMA1_Channel4, &DMA_InitStructure);
( u. j/ J% l& o1 [2 _}
 ) j6 G) l$ l* ^# y5 z
* Q0 D' D0 E" |! G: ^
好的谢谢
gx2009111224 回答时间:2011-5-8 14:46:30

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

see
longben 回答时间:2011-5-10 23:21:45

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

看看再说

所属标签

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