本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
: ?0 d2 X% C& |+ n1 Z1 X8 K9 Y% O) s3 o1 U1 `9 H3 c/ l& f, c1 b; T
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。1 H, b- V& F* d4 x
" c) ]. V3 @; I
首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。/ w+ X; `1 T r( [! l
& y; G) f& i& K9 }* r8 `' W o# `. {
/ W& J$ f, w$ O; F8 T) S
选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
2 c. F1 K- g4 [
# y/ y4 Q+ F, P; J) [. K" H3 j8 w+ o' d8 t0 r0 V V6 {
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。" r& c0 j4 }" k7 v% x6 _- u2 o
: Z7 o9 q% D* D% k9 Z) w1 t
6 G2 S/ C: f k; p3 d9 N
' g/ t9 V' {2 z, }, ~: S
d4 l) W/ ~4 u0 r1 ~( g$ ^“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
( \+ Z! O1 X6 j2 a m3 H
0 X. V7 f O8 Z* {, e- t. m) V5 u$ c8 r6 o" p$ d
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。) f1 R+ [ U2 ^1 Z3 J
( J2 V; S( ]1 I/ M; h
ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
& E: B$ e- K; ^2 B: F0 Q
8 P: G! }9 u2 ^2 e: u8 Z3 l
3 P! z9 h! {$ r6 p8 k; a# \5 p
, [/ [1 e0 |/ A最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。* ~8 F# F7 S8 v
) z6 J" \2 B2 P# S+ P8 F1 R
至此Cube设置完成# z" c/ N5 d! N
% w: E; V* P# U: D5 Q/ r
附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。- /* USER CODE BEGIN 0 */
; S. e; e# O! E - /* ADC variables */& \- j( y# g2 G- S. b: L, H
- __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
0 f, X& T% A2 u u" \: R - __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
- E) ~- |9 S9 Q% }- Y j - /* USER CODE END 0 */1 [5 I) c* B+ m, [4 m3 v. V4 g
- # R& z& u* E* v
- int main(void)
: d" k( ^; T1 j t - {/ C/ t7 A# f0 E% C0 O. P
- /* USER CODE BEGIN 1 */7 V8 i- R, O- U2 h8 g
- uint16_t out_en_cnt=0;1 v! Q! Q8 I3 e) Y9 H
- /* USER CODE END 1 */
/ b+ u& X& x( g3 L) ]7 {! ^+ t9 a
: W4 u0 B/ d* H3 t$ X7 E- /* MCU Configuration----------------------------------------------------------*/
% D# g; y$ S9 \3 S) B7 e. V8 N3 t - $ y+ ?4 U. Q% n' m
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */0 l" O: U. g0 W+ }/ v( p; ]
- HAL_Init();( G, ]' I8 G" I% U+ v" |
; v+ j X" V/ h- /* USER CODE BEGIN Init */! [5 R- w8 e* T V: A
; h& X6 i# d$ u' }( e8 w6 ]- /* USER CODE END Init */1 _& }% e. E: U; X1 A# C1 K
; y# p0 F' A* R V0 H/ [- /* Configure the system clock */
* S9 I, y% t3 M - SystemClock_Config();; f7 O: z) ~3 [7 O
- 7 c& r# F' o" j3 i0 P( h- _; }0 P
- /* USER CODE BEGIN SysInit *// j8 ?2 |+ x, t
7 b: g- V5 K( M) V- /* USER CODE END SysInit */( J; Q) k3 j& L- u
7 j5 {5 J k1 E9 A- /* Initialize all configured peripherals */
' Z; a* I/ h' c% Q6 A% v# y# w - MX_GPIO_Init();3 ]/ }! N1 C/ G' u
- MX_DMA_Init();% d1 @' W4 o& z, \! M1 P. t
- MX_USART2_UART_Init();& j4 b$ T2 g5 A( l
- MX_ADC_Init();
' _9 Y- K- E! d3 z. ?& D3 X - /* USER CODE BEGIN 2 */
" t$ z) Q* [% W- H8 v# O7 ` - HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
$ H( [, Y i0 \3 W) m - HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断9 [4 V" Q" Y1 O2 u
- HAL_Delay(30);//等待第一轮ADC数据采集完成
- c4 b8 s! ? B7 X* u% J t - /* USER CODE END 2 */2 u, r$ D4 O, R( w3 u
- ) E2 z3 B% L8 I9 l1 l J
- /* Infinite loop */
! o( S- |8 G1 I, u - /* USER CODE BEGIN WHILE */) ~4 v+ H: A# E" U0 ~
- while (1)9 U" F, A$ e- r5 j; k( |+ I( n! j
- {( Y e! y' i% B" W8 B; P( J& p
- HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms( ~, U, k. l) U' o; h4 ~% o8 D; ~
- adc_getvalue();" x' P7 o/ t1 ]5 l6 `! _& K, B) J- m
-
$ d: R2 ?+ ?1 k Q' j6 D - if(++out_en_cnt == USART_TIMES)
: s& O! M: L' U! X. T6 D) w - {/ X1 x5 o& I. @! U# N+ w
- out_en_cnt = 0;2 q8 t! o8 e5 X p" b. o x7 l
- HAL_Delay(500);
9 G% R; a3 h: [; g+ N - printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);2 k9 L& J/ H2 l) l' `- m
- }# P& o4 p3 w- \' t
- }5 T" V B$ T8 t" z6 q
复制代码 / Z4 L2 m# A4 g; ~1 w: `
最后,附完整工程。
. [: C) g0 h3 a2 \
' F% S* p' K3 l4 R* N. B6 H3 p, g9 V
0 Q& l. \) V% s" p) K5 ?1 ^' X7 K) b) o
|
cube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。