一、打开上一节的工程,在上一节的基础上进行修改' A! v8 S9 H& Z0 {
二、配置DMA0 @) L, Z* e% b. T
在cubemx界面上点击DMA
7 M, e$ f1 p- ~ ^' w# @. X& Z
! c' F8 o2 a c6 p; P1 h
7 o! E0 @- k+ D& Y; O: Q& I
# S, W$ Y' W9 L* E0 I2 b因为串口1是挂在DMA2上的,所以点击DMA2,如图中标记的2,随后点击ADD
9 O3 y2 c# ~6 m+ G( B
: F1 a. Y& y g) l8 E' Q" e' W
: j8 c9 p% _2 i+ j: r
; r- W5 q' ` z
选择USART1_RX,继续点击ADD,将USART1_TX也添加进去,随后配置DMA如下图所示
4 \2 |; B: E& `& x% v2 C% a' P! d
- Q4 x: u0 m2 f/ w3 ?/ R2 I: e
7 Y; ?, m- s# _1 T; F4 g: f* O
, X8 y/ B, ?& E$ |' r- |8 c
( f$ N& X3 q, i( |
其中mode设置可以选择Normal表单次传输,传输一次后终止传输,Circular表示循环传输,传输完成后又重新开始继续传输,不断循环永不停止。此处选择单次传输。
% E- u" T8 @9 M( ]% g5 g U- S! {; |9 `( ]
Increment Address表示地址指针递增。串口发送数据是将数据不断存进串口的发送数据寄存器(USARTx_TDR)。所以外接的地址是不递增。而内存储器存储的是要发送的数据,所以地址指针要递增才能将所以的数据发送出去。" Q# |, i( }9 v) ^
y6 \. }, K1 J- A
串口数据发送寄存器只能存储8bit,每次发送一个字节,所以数据长度选择Byte。
' m% V1 t- e- V2 G6 p6 |: w# O$ W
0 Q! H$ |8 C8 e& `, s( A# M# s: j
三、生成代码
4 P7 B; u) i T$ ^ O在主函数中添加代码,添加完成如下所示
! s( c- C( @! T- <font face="Tahoma"><font size="3">int main(void)</font></font>0 y: E* L: N+ q/ d% |5 p
- <font face="Tahoma"><font size="3">{</font></font>
& d7 ^. M5 y+ j: ?( B/ t - <font face="Tahoma"><font size="3"> /* USER CODE BEGIN 1 */</font></font>
& Q$ ^3 m* X1 U" Z* j0 E - <font face="Tahoma"><font size="3"> uint8_t *data="uart dma test\r\n";</font></font>; }/ s2 C: E# i' o$ G' _- U
- <font face="Tahoma"><font size="3"> /* USER CODE END 1 */</font></font>
) U" R/ m6 \1 L7 g1 P' f9 Y, j - <font face="Tahoma"><font size="3">
F+ R3 }: w( i& R4 F& e - </font></font>
H8 H! ^1 U8 S$ n @( s& [ - <font face="Tahoma"><font size="3"> /* Enable I-Cache---------------------------------------------------------*/</font></font>: _! S7 y4 S0 C" o/ M
- <font face="Tahoma"><font size="3"> SCB_EnableICache();</font></font>
, }: X3 O9 t$ w: q* ` - <font face="Tahoma"><font size="3">
( T% o' o0 m# \+ |5 q& y - </font></font>! r' a5 m3 v4 g! C
- <font face="Tahoma"><font size="3"> /* Enable D-Cache---------------------------------------------------------*/</font></font>
: i: u- u& B/ d) g; I+ W" N. w - <font face="Tahoma"><font size="3"> SCB_EnableDCache();</font></font>
& @. |" M. z# [ - <font face="Tahoma"><font size="3">
# v3 T8 w0 p1 D1 s } - </font></font>" @2 _4 W3 k8 x0 W
- <font face="Tahoma"><font size="3"> /* MCU Configuration--------------------------------------------------------*/</font></font>
2 x/ w! F/ q; m2 O w - <font face="Tahoma"><font size="3">' ]. {7 R, n8 F: `& ?
- </font></font>3 }) M: ^9 j$ i" Q4 K
- <font face="Tahoma"><font size="3"> /* Reset of all peripherals, Initializes the Flash interface and the Systick. */</font></font>
$ G( ]& W5 X+ s - <font face="Tahoma"><font size="3"> HAL_Init();</font></font>2 Z$ L; [3 f1 V- |* A
- <font face="Tahoma"><font size="3">
( f8 k$ }$ @" t) x! o - </font></font>
( Q! k! G7 Z' Z; T' x' } - <font face="Tahoma"><font size="3"> /* USER CODE BEGIN Init */</font></font>2 q3 f0 g- X6 g4 X9 g% ^- R( D5 C
- <font face="Tahoma"><font size="3">2 C* ]$ g/ h2 M6 a: k( U" u
- </font></font>
( \0 _* U3 g6 a( b$ R3 I7 h - <font face="Tahoma"><font size="3"> /* USER CODE END Init */</font></font>5 z) X' [; S. ^
- <font face="Tahoma"><font size="3">
, i, V3 B* i' q1 q/ D - </font></font>
6 U1 G: c6 |4 b& @8 A" d - <font face="Tahoma"><font size="3"> /* Configure the system clock */</font></font>
9 f6 a: x9 y7 d3 H0 S1 C& w - <font face="Tahoma"><font size="3"> SystemClock_Config();</font></font>
; V* ?8 z: Q6 O! M - <font face="Tahoma"><font size="3">6 ?8 c& m0 a& W% k
- </font></font>
8 V2 N: E) m0 O! `( {! Q& e, X4 T% y - <font face="Tahoma"><font size="3"> /* USER CODE BEGIN SysInit */</font></font>
4 `) b4 @$ {1 J9 w9 y4 R! O - <font face="Tahoma"><font size="3">
: e. {5 b. I5 ~7 Z& \4 A% n - </font></font>
! `4 F% a2 j! g& w) i: M - <font face="Tahoma"><font size="3"> /* USER CODE END SysInit */</font></font>4 ^# F* C( Y4 A5 D' [" [$ m; ^7 F
- <font face="Tahoma"><font size="3">
* r- G! D7 k' Y! r o- I( i! ?6 N - </font></font>
* o: Z j, y6 t. a) u8 ^3 P - <font face="Tahoma"><font size="3"> /* Initialize all configured peripherals */</font></font>
% ?; b# N/ U3 Q - <font face="Tahoma"><font size="3"> MX_GPIO_Init();</font></font>3 f5 `9 a8 R1 b+ B1 n5 @# E( @
- <font face="Tahoma"><font size="3"> MX_DMA_Init();</font></font>
" A. L w1 j5 [ - <font face="Tahoma"><font size="3"> MX_USART1_UART_Init();</font></font>8 `+ \" n# q1 z" L y% O6 j1 ~- H" |
- <font face="Tahoma"><font size="3"> /* USER CODE BEGIN 2 */</font></font>% o- y# S. g% F' A' n. J, x
- <font face="Tahoma"><font size="3"> HAL_UART_Receive_IT(&huart1,aRecBuff,1);</font></font>( H- e5 N& O. k5 Y
- <font face="Tahoma"><font size="3"> printf("uart test is run!!!\r\n");</font></font>" D- B# w6 K0 O' k. _
- <font face="Tahoma"><font size="3"> </font></font>
1 J% i' Q3 {9 x) s8 g2 c: T - <font face="Tahoma"><font size="3"> /* USER CODE END 2 */</font></font># I) j) ?4 z( B6 n
- <font face="Tahoma"><font size="3">
2 d+ u/ n3 w; k( T0 q `* J - </font></font>8 G0 ]; F8 x$ c0 e1 |9 Y; L
- <font face="Tahoma"><font size="3"> /* Infinite loop */</font></font>) u+ d5 N6 [! h' U0 P: C- @
- <font face="Tahoma"><font size="3"> /* USER CODE BEGIN WHILE */</font></font>, \9 k5 M7 G$ e9 O, p: t1 P
- <font face="Tahoma"><font size="3"> while (1)</font></font>) i% C7 V% s$ c& W
- <font face="Tahoma"><font size="3"> {</font></font>
d, H, I5 v, h- X% J J - <font face="Tahoma"><font size="3"> /* USER CODE END WHILE */</font></font>2 W! k9 ^: a" |+ C) ]
- <font face="Tahoma"><font size="3">
4 f2 r7 K( e5 T& j- ^4 j* N - </font></font>
& n; N* a% ~7 Q6 H$ C8 M - <font face="Tahoma"><font size="3"> /* USER CODE BEGIN 3 */</font></font>" b: _ E* R7 H8 p. S, F+ M
- <font face="Tahoma"><font size="3"> HAL_UART_Transmit_DMA(&huart1,data,strlen((char*)data));</font></font>" {0 N x+ ?, d
- <font face="Tahoma"><font size="3"> HAL_Delay(1000);</font></font>0 I9 A" u6 p5 L) \
- <font face="Tahoma"><font size="3"> }</font></font>2 z0 e7 a$ Q n- j/ I q
- <font face="Tahoma"><font size="3"> /* USER CODE END 3 */</font></font>$ O1 J- l! E/ n" ]8 O
- <font face="Tahoma"><font size="3">}</font></font>
复制代码 + I+ U9 y4 F! x( N. c9 h
四、打开串口调试助手,观察现象,串口每隔1S输出一次数据1 D1 K, b' C( t2 j9 N
: S1 e$ X X5 S2 f5 e% {# `
' S/ K! T4 x8 [- Q. h" V$ }* E' ^2 _+ h- |8 Y( B- G
5 a3 W0 l3 j* j- f. f, p1 ]8 y) p
|