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

【经验分享】STM32的DMA演示,USART

[复制链接]
STMCU小助手 发布时间:2022-1-18 19:42
/******************************************************************************# A& f; h% [7 B* m' O* g5 l; R9 w
* 本文件实现串口发送功能(通过重构putchar函数,调用printf;或者USART_SendData(): `+ s3 u0 t8 O! m* Q9 X3 t/ x3 ^
* 这里是一个用串口实现大量数据传输的例子,使用了DMA模块进行内存到USART的传输
" \+ I% K1 M# @# B2 d# E* 每当USART的发送缓冲区空时,USART模块产生一个DMA事件,
3 m; Z+ y& M  }. J6 E* 此时DMA模块响应该事件,自动从预先定义好的发送缓冲区中拿出下一个字节送给USART! T- w. C4 M5 N8 u" O# K
* 整个过程无需用户程序干预,用户只需启动DMA传输传输即可
/ h* _9 I5 v  u* o; Y0 V* 在仿真器调试时,可以在数据传输过程中暂停运行,此时DMA模块并没有停止' ]" ^" P! F7 G5 l# S: a/ S/ b( j
* 串口依然发送,表明DMA传输是一个独立的过程。; l6 v2 L4 J2 W3 R
* 同时开启接收中断,在串口中断中将数据存入缓冲区,在main主循环中处理
0 y- W  F8 w2 a' _: F" f! @. j* 作者:jjldc(九九)# I3 V3 t% [3 b$ W& t8 v
* 代码硬件基于万利199元的EK-STM32F开发板,CPU=STM32F103VBT6: i$ Q7 x$ H; |' A8 A) L- X# o" e
*******************************************************************************/
  f- I1 ]' F, b$ E/* Includes ------------------------------------------------------------------*/7 y, [, c+ A. ]7 l' `* n' S
#include "stm32f10x_lib.h"1 r+ p: R# `! g5 y, }  M2 j
#include "stdio.h", V# L1 K# T- H2 b
/* Private typedef -----------------------------------------------------------*/( l; W. j7 C$ ~
/* Private define ------------------------------------------------------------*/
3 s; C2 Q) j# O& f3 v- w#define USART1_DR_Base  0x40013804
  Z- k' z- P7 g0 B( x/* Private macro -------------------------------------------------------------*/0 ^$ B% Z# x# i3 j+ C. y
/* Private variables ---------------------------------------------------------*/) G3 p9 E, W! p+ N$ X  m* o) m8 B
#define SENDBUFF_SIZE   10240$ X) J5 H; u; f1 p3 J
vu8 SendBuff[SENDBUFF_SIZE];, o& E' n: _, I+ n( R
vu8 RecvBuff[10];" s2 y) K' n, b: [! M
vu8 recv_ptr;# A8 p) U  l$ k- q- A( j: t
/* Private function prototypes -----------------------------------------------*/- a( y( j% H4 |
void RCC_Configuration(void);  u% P2 r0 @; Z! ~2 p
void GPIO_Configuration(void);
" G$ a$ q9 U; X3 C! [: I  d" mvoid NVIC_Configuration(void);
& {" t/ y5 L' G; W% {! g& xvoid DMA_Configuration(void);, Y, b9 t( D5 L9 }! Y. r
void USART1_Configuration(void);+ W4 M9 ?: N- |
int fputc(int ch, FILE *f);
" A; ?4 m: N, Y" p8 O" evoid Delay(void);
2 `5 A1 Z9 x: W9 a6 m/* Private functions ---------------------------------------------------------*/
, W0 n- K/ D  y4 F' Q/*******************************************************************************  X& D0 _0 x% m- D2 r* N
* Function Name  : main. }& y( T9 a  u2 b4 x. C3 {
* Description    : Main program./ @) k* g+ O, M5 |0 j5 x
* Input          : None* s# R4 z# s! ]" P7 y  o; k5 ]
* Output         : None
7 b* q! _" v, V9 z: t7 k" X5 M4 _1 ?* Return         : None, Y* H) u) A& C- r! V1 d
*******************************************************************************/; q" r4 H  J7 F3 ?/ ?3 V. Q
int main(void)
' e; |) c& \! K4 I2 `1 D( ~{
2 l8 k5 Z4 O9 N- r% F7 X  Ku16 i;1 ?6 l" k  n% {  X. [
#ifdef DEBUG
! b8 i! w! l$ T- K; g7 B9 \% Mdebug();
0 N0 P+ P  C$ }  g/ S. G6 _/ V% R, I#endif5 Y, c- X8 o3 x$ c
recv_ptr = 0;
5 N6 N' G# _' _! r7 H' o" v0 ]RCC_Configuration();9 n5 P- d% R' |; j8 m/ z; t
GPIO_Configuration();7 w3 m  A& X; \
NVIC_Configuration();5 \5 W* e& q6 c2 g
DMA_Configuration();
5 c. }4 H! f) k% C: lUSART1_Configuration();2 h2 _+ F9 _4 ^( a8 C5 K
printf("\r\nSystem Start...\r\n");
' |. o+ ^0 B8 }- P( n' iprintf("Initialling SendBuff... \r\n");" p6 B. A1 `, L! s; L: k
for(i=0;i<SENDBUFF_SIZE;i++)6 e" u( A# U% q' ?8 u4 R
{
; a! o- T$ V6 w0 w' d, ~# R- V; JSendBuff = i&0xff;3 q7 g  w+ p" O+ v/ k6 p
}
$ j2 x& y- {4 Q; Z/ c8 r( m( dprintf("Initial success!\r\nWaiting for transmission...\r\n");# n5 W8 B7 U7 z9 L9 F& [
//发送去数据已经准备好,按下按键即开始传输2 b* `. A, G& e+ G7 H# R" S* g
while(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_3));
: I( {* a/ W- _8 P* V4 hprintf("Start DMA transmission!\r\n");
4 V' T" z9 |/ \" H//这里是开始DMA传输前的一些准备工作,将USART1模块设置成DMA方式工作
8 r: a+ P7 G/ N3 X& zUSART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);' A: b: n: d4 {
//开始一次DMA传输!
4 e0 D0 W- c8 m/ dDMA_Cmd(DMA1_Channel4, ENABLE);( `4 Z" j1 }& Q4 k0 @8 \
//等待DMA传输完成,此时我们来做另外一些事,点灯
  C- L+ p- z9 q, A//实际应用中,传输数据期间,可以执行另外的任务1 f' F9 L8 ^% |, D' k0 H9 w4 d
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET)
! @& h4 t; F- z7 T& [{
/ e( |5 X6 D- H, @  mLED_1_REV;      //LED翻转. P3 V% c  B6 F
Delay();        //浪费时间
5 o- q0 c0 o/ ^" z3 n* {5 A}
- M, _# p5 _* T+ Y6 O; a//DMA传输结束后,自动关闭了DMA通道,而无需手动关闭
' r+ E& }2 Z+ o7 L8 \7 A- G4 R//下面的语句被注释
4 M+ w% ^# q0 n9 M8 t: R) G/ s//DMA_Cmd(DMA1_Channel4, DISABLE);5 e: n, m/ G  ~* ]7 b- L. B8 Y
printf("\r\nDMA transmission successful!\r\n");
8 J# b0 o' o5 s& y& T4 [/* Infinite loop */" A2 j& e, c! x7 H; U" V. u+ t
while (1)# o" K8 o; I3 v' ~* h9 M) [" X
{
  z+ k, X! m/ V0 f# i6 U}; v( I! Z6 w3 A/ k$ }
}
# L$ w* W& M- e( H/*******************************************************************************
4 c* w6 b2 N- {1 A1 s+ ?* Function Name  : 重定义系统putchar函数int fputc(int ch, FILE *f)
, T$ N% Z+ q8 Q4 H+ b* Description    : 串口发一个字节1 r* e1 k2 E- q& w/ D% l
* Input          : int ch, FILE *f7 }. f( H0 J4 M! x, {, M
* Output         :
% @+ z" b3 _2 G* b% L7 {" x2 y% M* Return         : int ch
4 J& J& o0 L0 C$ h* 这个是使用printf的关键! t. L6 V. Y) v7 U
*******************************************************************************/$ |1 ^9 U) D9 S  B
int fputc(int ch, FILE *f)
. @3 q: a# A/ d$ x2 P/ `{3 q- v8 P3 d% r% t2 B% q$ q
//USART_SendData(USART1, (u8) ch);, b; R2 G( _) P
USART1->DR = (u8) ch;4 Z+ `6 C7 G# z1 ~  `; q
/* Loop until the end of transmission */; r" z6 N+ q! O2 v
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)( u% {( O2 I& k, e
{
% t) u* k, O: D2 \3 r! m8 b0 C}! ?9 r4 Q' ]1 Z9 C; m
return ch;
  c2 w0 M; I; q4 q) z$ f! ]}
/ V6 p0 w& I2 O% J( c3 d$ S! e/*******************************************************************************
2 ~# g9 U' ?! ]8 ]8 N* Function Name  : Delay
$ n& ?8 M0 o" g  K. S9 X& _  C* Description    : 延时函数
' L# [8 F2 W" O0 p0 ?7 N/ B* Input          : None
/ f; g5 }( I# D: E* Output         : None
7 H, J9 Y2 L7 F0 ?0 d- Q# X/ x* Return         : None8 R" f# e" l% ]' U2 }! j
*******************************************************************************/% ?2 m/ l$ ?/ ~8 B
void Delay(void)8 p7 q2 t  J( \3 Z3 z, l
{( `' C$ j# q& b
u32 i;
; e" h! X7 E+ ]& e( wfor(i=0;i<0xF0000;i++);1 _" V( z! w% [/ G8 D) \
return;
2 O  t2 W/ J& d7 K}  E- S" @4 G, X8 v: n6 v
/*******************************************************************************
, L9 k& v3 v# |+ I" u0 f4 @* Function Name  : RCC_Configuration
- H6 r( B' N4 k& S' W0 L4 V; l: @$ B* Description    : 系统时钟设置
8 |7 r0 ?% w6 T5 `' O2 I* Input          : None( B3 B) x, X! M/ V1 v8 m8 l
* Output         : None
9 F  P/ K" m3 k( \* Return         : None
2 S  y  K/ a; O- g$ h: y*******************************************************************************/6 X) u8 U; C4 m. j" l$ F
void RCC_Configuration(void)
9 i9 h- `- f1 j3 y{) w) T( v5 B8 C( d+ R* ~% o
ErrorStatus HSEStartUpStatus;$ T" \* K" }: \0 Q; ^1 t: J
//使能外部晶振
$ }& g3 {0 K# O- h+ [RCC_HSEConfig(RCC_HSE_ON);- n( q7 h, B$ r
//等待外部晶振稳定9 Z0 x; |7 _* d6 n; ]
HSEStartUpStatus = RCC_WaitForHSEStartUp();
4 N) r9 `  s9 J& W6 t//如果外部晶振启动成功,则进行下一步操作
# S* k/ A+ p3 F0 t+ `/ uif(HSEStartUpStatus==SUCCESS)" R: V" k" b( V1 e, d
{5 B2 e7 r6 t) t0 j- s
//设置HCLK(AHB时钟)=SYSCLK
7 U' F7 H9 d" Y' _RCC_HCLKConfig(RCC_SYSCLK_Div1);
# W, g& g1 v  a) x  R1 q. x6 ^8 B//PCLK1(APB1) = HCLK/2" `7 a: z# I' ^( Q7 i% S2 k) ]% P* _
RCC_PCLK1Config(RCC_HCLK_Div2);) h( H! b6 _' x* i& b
//PCLK2(APB2) = HCLK2 e, {, O9 h" O$ \7 ]3 z8 i
RCC_PCLK2Config(RCC_HCLK_Div1);
+ g" ^6 p% w5 G% M7 u) o//FLASH时序控制5 I5 e1 S0 i  d" A% `6 O& N0 t4 l
//推荐值:SYSCLK = 0~24MHz   Latency=0
. |8 N+ \, S$ i3 w//        SYSCLK = 24~48MHz  Latency=1( K3 M/ y. l0 F2 r0 E
//        SYSCLK = 48~72MHz  Latency=29 f! @  m4 P; ^1 r) ^) v
FLASH_SetLatency(FLASH_Latency_2);
- ]* c/ z/ N, z" g//开启FLASH预取指功能
. m) r- L. |- A! Q+ E- g! }FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
6 `: p) n& d6 [0 J: s: ]# R//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
# u, P% p& H% oRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);9 E) ]* g( q& E3 i1 V
//启动PLL! j. _& K& ~2 O. m
RCC_PLLCmd(ENABLE);
& y$ L0 b4 A. |' ?9 s+ \//等待PLL稳定) G" T& t! j+ l& i
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
1 u. J- P1 Y; O, Q//系统时钟SYSCLK来自PLL输出
. ]. n0 ~4 ?/ L. F6 nRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
! o) ?2 f( {7 \' E; u3 ^//切换时钟后等待系统时钟稳定
4 }& O: [6 ~2 f+ M3 Y+ s  ]3 j8 k$ Rwhile(RCC_GetSYSCLKSource()!=0x08);
% A0 Z7 ]' v. p5 H/*  o$ V' h: U% u8 d
        //设置系统SYSCLK时钟为HSE输入- D9 B, ]4 Z7 R- e* s% z
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);% f3 A7 ^+ L4 s  B/ u, R5 M& D
        //等待时钟切换成功* p+ T  w7 Y+ P
        while(RCC_GetSYSCLKSource() != 0x04);; [( ~: P# t- ?4 P" m3 d+ `
        */" M) w0 X9 U# V4 C+ _
}5 D* _7 h) j+ w. L' Z' g5 l
//下面是给各模块开启时钟
9 n" D" C+ d9 i1 U& [//启动GPIO( t7 d- t% f& m4 A4 M$ D2 |5 Q/ r" T
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
4 C) a( D4 Q# J: E+ I7 TRCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
6 Z7 Y+ F+ ?7 ~3 G9 ]# v: l) uENABLE);3 r2 f) S9 T1 S( W2 G; I% P
//启动AFIO
$ U2 X1 I0 h$ |; l3 O% W' QRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);! Y2 I+ ]' z  o/ R& J7 i) G
//启动USART1
6 S  C; l6 O- a8 `( ORCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);8 o' Q: j3 j; p; x5 _
//启动DMA时钟
$ j  C6 L8 f3 vRCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
. k$ E  J8 x- P}4 |) X6 v& u& U+ q1 Q3 u
/*******************************************************************************6 {$ o2 q! S; \* j+ R( u; O
* Function Name  : GPIO_Configuration
) B; H5 X, `1 n  q* Description    : GPIO设置1 a- O( U! I9 E2 r1 K6 q
* Input          : None
. p# t$ g0 L0 q* X! e& n8 v3 }" b" |2 x* Output         : None' D' C6 G, ?! F7 p9 U' N
* Return         : None
# J  j1 F( e# X: Y& K*******************************************************************************/8 v7 E0 W' i' O9 g! W
void GPIO_Configuration(void)
- @0 {, z' m: r{; H$ q+ y7 z: |# V# ~/ j. t3 K: h& \
GPIO_InitTypeDef GPIO_InitStructure;" A0 |( a2 x3 g9 `$ m$ C" ~: g
//PC口4567脚设置GPIO输出,推挽 2M+ S% n: j& D+ G7 b" T' i
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
" ?/ p; P' M( P$ L( {GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;% g  z% T9 y/ n. N1 i
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;( C2 r3 e% G9 j  p1 }2 C
GPIO_Init(GPIOC, &GPIO_InitStructure);
, K# {0 h- K0 E! {$ H6 M' Q2 q//KEY2 KEY3 JOYKEY0 z! I) D% M$ {
//位于PD口的3 4 11-15脚,使能设置为输入
7 \7 I4 k8 s5 z0 n$ _2 e+ A- ?' fGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_11 | GPIO_Pin_12 |\! M# h% [% z: {! q/ P
GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
" ~+ Z! G) Q8 P, l+ K+ SGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
# |% n4 l( o/ U0 {. ]7 LGPIO_Init(GPIOD, &GPIO_InitStructure);
4 }6 Q# O! F% b& o//USART1_TX' {, {9 E" ]% a1 T: w2 `- o2 V
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;' @+ d, a% Q& E; o0 f# W/ \/ U
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
) a+ {$ J# u& b# `+ ?GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;6 N2 C% u5 h$ ]3 D7 k4 ?
GPIO_Init(GPIOA, &GPIO_InitStructure);% H0 X: c3 V# _! o& Y
//USART1_RX0 w2 t- s0 V  A* z( H2 m
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
/ M+ {. V( y3 O2 tGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
9 J2 W: g4 S6 E, ]/ H* b: P/ H; SGPIO_Init(GPIOA, &GPIO_InitStructure);) d5 H9 {! }. z' v5 J! E
}
2 V" X0 M" e5 `- k/ K/*******************************************************************************
; U' m9 Q7 r2 b: t: @* Function Name  : NVIC_Configuration% Z/ B7 M  D- g4 r! i' C. }
* Description    : NVIC设置
% v9 J# S7 T# D* Input          : None
' z, W$ O& Z) D8 B7 }* Output         : None
: k! o1 c0 A4 M  @! B# L% X6 T1 m* Return         : None
/ _7 ^8 h5 J1 t0 J" C  ?2 i*******************************************************************************/; I2 T9 P$ ?1 t" V* |3 I) Q
void NVIC_Configuration(void)
" y  J$ A7 B5 [{: A7 }1 F' L* r1 Q+ F  x) N  f
NVIC_InitTypeDef NVIC_InitStructure;: U$ A) T0 t- F( c
#ifdef  VECT_TAB_RAM
8 a" v+ m; ?/ E  P$ u% @// Set the Vector Table base location at 0x20000000
7 O* F) u. A5 q1 Y$ ?3 f+ `! f1 P* \- TNVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
& d' K# m. d$ g- Y#else  /* VECT_TAB_FLASH  */# @1 Z! b# j# W, p; v
// Set the Vector Table base location at 0x080000007 G8 e7 L6 O0 B) G8 x1 ?- H
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
& z* O/ x& T5 G1 q#endif
, n" }, f. A" `% r+ e. y% h//设置NVIC优先级分组为Group2:0-3抢占式优先级,0-3的响应式优先级) F- m7 I$ k4 X( M( g
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);3 N! W, e$ h6 n- ^, r$ b
//串口接收中断打开   
1 ^# L& q9 C, ]$ b5 X# ONVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
% v' G" i: X/ h8 pNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
* H: o& R# g' ?; S1 \0 TNVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
2 Q' w& S; B! ^6 E5 h% }0 i6 h; nNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
) X$ [" H2 e4 {NVIC_Init(&NVIC_InitStructure);: u$ i: u6 a& W( W3 Z
}
  @! ~& X( e6 t# ~# _/*******************************************************************************
* y- d+ b1 B# z& y% X/ l5 e* Function Name  : USART1_Configuration7 U  x  Z' Q- v# T- G% b
* Description    : NUSART1设置. t- O" R+ V3 L6 e
* Input          : None
6 p# e# }" m. ?# g4 K; [* Output         : None. o0 `( H% D! c
* Return         : None/ Z5 Y5 f1 [2 Z) D# ~
*******************************************************************************/$ [% b+ l! U. ^2 O0 V: t: q
void USART1_Configuration(void)
/ w) C4 f' ]* [8 W- t6 x{
/ i6 H7 T) b- vUSART_InitTypeDef USART_InitStructure;9 p4 [% X! r! Y0 G9 o
USART_InitStructure.USART_BaudRate = 9600;' Y4 Q, \+ q  f2 |0 Q5 r
USART_InitStructure.USART_WordLength = USART_WordLength_8b;1 z: a2 p( T+ L
USART_InitStructure.USART_StopBits = USART_StopBits_1;9 y/ W# {9 V1 C' u) b( m5 M
USART_InitStructure.USART_Parity = USART_Parity_No;
! M: V4 n0 o: sUSART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;+ A( R4 {! p( d/ X
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
6 m$ n- P+ ]. R. aUSART_Init(USART1, &USART_InitStructure);8 ^+ \* p  y# D5 H5 O' ^( U
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);5 B8 J2 Y3 e5 v# q" f( E0 N
USART_Cmd(USART1, ENABLE);% D! Z1 n4 A" ]! O
}1 ?, l4 E6 V5 P8 g' h3 \
void DMA_Configuration(void)1 U8 f. O9 m. @
{
: O+ Y0 I6 ^- U$ Z% j/ Y! X& zDMA_InitTypeDef DMA_InitStructure;5 E3 j* ]( V- [( n5 F* I
//DMA设置:
* G2 B  L3 [& F7 l; l" e3 B//设置DMA源:内存地址&串口数据寄存器地址2 {2 p, {" d" P4 {! o
//方向:内存-->外设
! M) Q- h- s9 \9 Q: g% `3 k//每次传输位:8bit# J& k+ C# y1 X. m- }* Y
//传输大小DMA_BufferSize=SENDBUFF_SIZE
3 ~) U" X7 v/ @//地址自增模式:外设地址不增,内存地址自增1
6 Q  K0 M  s! A' _  L& [3 a//DMA模式:一次传输,非循环6 X) L, f; \  k1 {
//优先级:中. @" \7 v- A' T1 V
DMA_DeInit(DMA1_Channel4);9 w& I9 Z8 D2 V2 w: Y; w; K
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;# Y7 _% s/ Y" S# Q" T' g
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
6 o/ @% q; \6 H) w3 |5 q9 s0 ADMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
8 ?/ R/ w( S- G8 A, r- UDMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;. S$ e6 |& n+ l9 Z
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
, A3 Y$ C. f2 U9 M+ _2 v! SDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
2 ]/ L1 ^9 @* X; j9 g! sDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
. [9 U# e: r. c! xDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
" T4 I' U" A# HDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
0 F6 t9 J; C2 ^% _DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;) `1 C8 L7 y  B/ j& U& B
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
4 W8 B+ Q# J/ E8 hDMA_Init(DMA1_Channel4, &DMA_InitStructure);. Z7 a) i6 u: D# U% o
}
2 T' @# R/ s2 w6 @+ C) m
收藏 评论0 发布时间:2022-1-18 19:42

举报

0个回答

所属标签

相似分享

官网相关资源

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