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

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的演示

 ( P3 d9 E5 _# ~2 ^8 Z# x+ f
好文章
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发表:$ B' B. ?" M; ]& B* w- V# L
  这里有个小小的例子,来演示DMA模块与系统程序并行工作。
, L* @& X1 P! s2 I* P  用串口以低波特率发送一个10K的数据,花费近10s时间,此时按照以往方法,CPU要不断等待数据发送、送数据;或者送数据、进中断、送数据,处理起来比较消耗时间。: e+ r% t+ a: L/ q- N% [/ [
  使用了DMA功能以后,用户程序中只需配置好DMA,开启传输后,再也不需要操心,10K数据完成后会有标志位或中断产生,期间可以做任何想做的事,非常方便。( E4 `& ?$ i+ ^# c* m, |
  这个是相应的代码例子,基于STM32F103VBT65 m0 v. l5 o% n" D: Y8 I

) T7 J" F& e$ N/ G7 N0 Z' Z) Bsdf) b9 g6 c# L) |! _6 c3 D9 j4 @
/******************************************************************************
- f9 L4 H) `8 V7 i* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData()% Q. h8 I6 X( Q* q+ C1 ]! j
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
: ~% k! L: e6 B! c* ?8 i" T4 U* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
( e% E+ P* \5 f% v- m9 f* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART
  S! z+ o$ E( [8 ~$ ~' Y* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可2 w* w( ]( F4 W' Q; A& g5 g9 G
* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止% _) ?* H) t# M& ]5 _; y$ |
* 串口依然发送,表明DMA传输是一个独立的过程。2 Y3 m/ ~: W: Q( y
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理& w8 \5 c8 ^. M1 ]! [" B2 q
* 作者:jjldc(九九)8 `  O: P2 X( E. J# }
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6
) W/ }9 _$ J6 i# B4 w& h- D*******************************************************************************/
! m& }+ c" |0 `$ r3 R1 F) ^. r9 v1 z: r
/* Includes ------------------------------------------------------------------*/7 j3 h5 B; o$ T' r& K+ z
#include "stm32f10x_lib.h": r7 J8 R# k" c* a
#include "stdio.h"
1 O* g# c  t$ K& {) ~# }0 Q* G1 X+ F: @; b# Y; D4 Z  K
/* Private typedef -----------------------------------------------------------*/
- V! T# Z! \$ y/* Private define ------------------------------------------------------------*/
4 g' o/ }: ]7 b# y! F#define USART1_DR_Base  0x400138047 b( G, D  \! j7 r, k3 Y/ g7 P+ b

- n; S) S8 ]: f9 E/* Private macro -------------------------------------------------------------*// L+ Z3 ~& z5 O2 o8 w+ B
/* Private variables ---------------------------------------------------------*/
+ x: Q, J& d: U) T#define SENDBUFF_SIZE   10240) N  L5 U. h; v
vu8 SendBuff[SENDBUFF_SIZE];$ z  p% [; I' R- U& \
vu8 RecvBuff[10];
( d* q* }+ e) z6 c( A3 K& Nvu8 recv_ptr;
: `( u. E: I$ \% t8 D# A  A3 m" p' t# V1 O
/* Private function prototypes -----------------------------------------------*/
: R; J5 q6 I; z2 ivoid RCC_Configuration(void);
' s& D# k5 r" Yvoid GPIO_Configuration(void);/ Q1 V" p2 `( i# S3 I! ?4 F
void NVIC_Configuration(void);' @% F* {0 D7 Z4 m$ D
void DMA_Configuration(void);
& A2 y, c+ |. u+ [! w8 s, L9 U4 z) U5 Tvoid USART1_Configuration(void);7 S7 I" z$ Q6 [' w

2 k" q* {2 t$ ]int fputc(int ch, FILE *f);
) o; ~) U! ?8 Q" z6 }* ^void Delay(void);& @+ E3 M2 L) j9 m2 o' @+ d
( o0 K' w# ^8 }- S; k. M
/* Private functions ---------------------------------------------------------*/
( b8 b1 W, M- ?' Y3 G" B+ Y4 G/*******************************************************************************1 }" d4 D6 I# J
* Function Name  : main' j3 i$ c! F/ U3 C) p
* Description    : Main program.* ^+ ~4 D" ~$ F; O: j& \/ O7 n  u6 d( U
* Input          : None
1 O( X7 T8 ]1 z: \* P. W$ v& v; f* Output         : None
$ f" g, l! h; n. y4 |" B+ V$ j, H* Return         : None& J  O6 f; K4 z) \  e
*******************************************************************************/2 Q+ t4 O5 K7 s$ q% Q
int main(void)
  J, L/ e9 w2 Z! l- G' e{
1 w% a9 C& y2 ?6 {+ L" d1 x    u16 i;
' R1 J; r9 h. \* R6 I, e#ifdef DEBUG
1 I$ X* r9 }3 T. y    debug();) g1 B+ B& ^6 s$ g
#endif
, ]0 L" \; e+ O1 d5 y    recv_ptr = 0;
& |0 j" A: J) S6 H" B   
& ~! ]: j5 J/ S. q5 O( {9 b    RCC_Configuration();  ~$ b9 A& a2 h, l/ O
    GPIO_Configuration();
& s. l2 D  C  ]' \. r    NVIC_Configuration();
, e) }- b6 r) z3 d/ p/ w3 V# r7 I/ l    DMA_Configuration();
5 K: v9 s! P/ F0 Q' @    USART1_Configuration();
, _2 t) W8 P; S5 L/ g   
) z' b- `  F0 ^; o    printf("\r\nSystem Start...\r\n");, x8 a2 o1 I  ^& _$ E# q/ O
    printf("Initialling SendBuff... \r\n");
4 O- W1 F+ E3 K" {! w    for(i=0;i    {
) l2 I' R$ g  D0 ^3 S3 M        SendBuff = i&0xff;
7 o' A) a+ l& z* P; b  }5 d    }% q& t* V  b2 N$ c% X( m2 S1 `
    printf("Initial success!\r\nWaiting for transmission...\r\n");. X2 D$ f' ^# U& B
    //发送去数据已经准备好,按下按键即开始传输
6 n4 V, A) ]' I9 a3 T2 X- }  I$ b    while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
! }& o) _  D% S! \% l& w    & d9 Q* Z. L3 u$ |5 e: ?
    printf("Start DMA transmission!\r\n");
5 v! F, r/ b2 i6 n! n! O6 k    7 z* [6 g" V! [
    //这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作2 U( u4 ^4 A% v0 b3 _' }. S
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
0 I4 M) e  f: |# U5 ?) m    //开始一次DMA传输!+ |! k# `0 H4 C. o
    DMA_Cmd(DMA1_Channel4, ENABLE);
1 Q! U& U+ F1 Z8 C# i* O: w( d  V2 X1 H   
, [& e$ Q4 P& a& n7 a5 b    //等待DMA传输完成,此时我们来做另外一些事,点灯
5 J3 W+ }0 B3 q    //实际应用中,传输数据期间,可以执行另外的任务* E5 ?. \) }* I$ U, `; p
    while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)+ ^2 D/ i  R5 u9 g( y# n
    {$ w; a0 B* v1 o# ^8 w  |
        LED_1_REV;      //LED翻转5 [; j9 W- G: r$ Z% G( H. q/ ^
        Delay();        //浪费时间
! g  P, C0 B0 F+ U9 C    }3 D9 C4 Q2 \8 o, [) C+ p4 j4 u- L! n
    //DMA传输结束后,自动关闭了DMA通道,而无需手动关闭. A/ p- y5 A7 z5 w5 D& h. G
    //下面的语句被注释) a8 y: O9 p, p. R: g$ @* L6 u! h( O
    //DMA_Cmd(DMA1_Channel4, DISABLE);+ P& i2 X, F; E7 R/ J, ~
    4 k" S/ W& @( q& T1 f; u
    printf("\r\nDMA transmission successful!\r\n");! W  x4 X6 A  I  `& N2 u

& q3 D7 I- `; I# E4 ^( A* a1 O    + b. U# V1 L# ~, q
    /* Infinite loop */
  X% R" e8 b  G    while (1)9 f/ ~9 Q+ A5 q8 s& V8 M
    {& ^: T2 Z# `1 P+ M
    }0 s. h5 Q9 K. ^1 o
}
$ d5 q9 ?; I6 |" g* C( C% y3 o
1 W2 g, ^- D) y( Z/*******************************************************************************
% }  Y, u6 d  M, _# D' N' O* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)5 q% e. L: H% b' v5 {
* Description    : 串口发一个字节2 W! V6 J* g* B$ R) S
* Input          : int ch, FILE *f
7 P* K& a0 w6 I* S, o9 H+ a/ f* Output         : 0 ~7 ?% ~1 t8 n& ?; d! W! z
* Return         : int ch6 l+ F7 N; z3 _* S2 Q
* 这个是使用printf的关键" c) i+ }; N* c; J' O3 H) n
*******************************************************************************/
. P/ a! C$ D! ?& J, yint fputc(int ch, FILE *f)
8 v1 h5 ?$ C/ e7 q3 B) ?' w{9 Q8 u$ U& g. [+ o9 e9 |6 Y
    //USART_SendData(USART1, (u8) ch);6 }, l+ \- c1 M- o' F" p$ S+ t2 W
    USART1->DR = (u8) ch;
3 Q2 ?- m' ?; w5 y" o+ o    5 t: }$ I4 ^2 X) V" P" t  C
    /* Loop until the end of transmission */
0 k6 c% w" w. @4 R' f9 J% v; i    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
5 {0 c, z1 j. ]    {
9 [7 D& q- `: d5 O2 G    }$ n  t! s; @2 M0 E1 F
- e+ c5 d' E- }+ N1 k, x
    return ch;
* Q8 E0 B* n# `3 G' Z) Y}
3 H" B* J( U5 j5 }2 N  p" J6 {3 F& w" Q* C: L" ^
/*******************************************************************************
+ h/ |: y8 @& A* Function Name  : Delay
0 A5 U  U+ n7 F1 o$ a8 O( U3 V* Description    : 延时函数
$ A" f+ y4 n3 ~9 p' f0 w* Input          : None
& Z  s! I- `5 f2 C, z4 f6 [* Output         : None4 w- v: {- v" G" ^" ~8 w
* Return         : None
$ L3 c" U: V# b" K: S: }2 x*******************************************************************************/
( d- h. u. O$ Cvoid Delay(void)9 ~2 S( e, p6 _4 N- F
{' h" I6 z" J$ M8 V! u7 Q# b
    u32 i;. N: }4 }4 U7 \* |2 O  a7 E
    for(i=0;i外设& m& i  _! |/ S4 N, m
    //每次传输位:8bit/ ]4 M6 ]4 Q2 O9 [1 _
    //传输大小DMA_BufferSize=SENDBUFF_SIZE
; j8 S3 k; [( H    //地址自增模式:外设地址不增,内存地址自增1
" l0 Z' M; P! u) d    //DMA模式:一次传输,非循环1 E/ |; D$ t. g: L( n3 s
    //优先级:中- H: ~9 g$ R0 y
    DMA_DeInit(DMA1_Channel4);( F4 r+ V9 h" T0 l) h/ q; K
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;( D0 y, o) V& V! [
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
+ s4 c1 Q% ?6 K8 _8 h; e    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
5 S5 M0 _# Y+ E" d) v* W4 K    DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;! S* o5 h% _5 ?0 l
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
( N, ^% ?# P: U1 e& w6 F: m. e    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;5 p% w( _0 F( W6 C$ l$ k
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
6 |$ C& r: ~( I' q" ?    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;2 Z5 ^* E7 j0 `4 n7 c
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;4 z, h  B/ x9 a; \+ B* s! {
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;5 K# l9 [! z4 r: [3 V( N
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
, X# N' e2 O7 g' r* ~% P$ H- ^$ |    DMA_Init(DMA1_Channel4, &DMA_InitStructure);: J- }- x8 }. L$ y; l4 j9 N: o2 F' A
}
 9 p# |0 c0 t* l! t) a

0 n, t$ _( M  K1 w3 B  L好的谢谢
gx2009111224 回答时间:2011-5-8 14:46:30

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

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

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

看看再说

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版