本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
2 m9 ?# c1 W `9 P! K5 H) p/ U
# o/ `4 P9 u! ^- a) g' `4 L这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。' W% `2 `2 C" Q$ B* S, y8 N/ P$ G
& |. M) ~2 H N' G$ F! N: ^8 @) B首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
* l* I* j8 \, a# C" Y9 ^
$ q E" g; d: I, `" R/ y
" _' ]& Y6 u7 _ o1 Q( D, t7 l0 ^7 O选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
$ u! ~$ H1 s. Q% [" p7 K
2 k6 d% p. Z/ P" T4 ]
6 N* S* v5 w. L7 ], w# Y
“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。
5 }: a: \8 n6 i
+ d8 p+ `# _4 H/ g# ^+ N. l8 G5 [6 D+ A
7 a: t1 B$ r, F0 H
. V7 ~' I0 v3 i: h7 t0 ?
9 H- D* E D0 [ h: B9 {) v9 {“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。
+ q! f i& b5 m' G$ X- d
1 A1 F3 v; I; g0 y! W) F% {+ i
, q8 g3 c! a8 s% V" i0 P4 x“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。0 K7 [/ o2 S" f
: `7 l# |! y; Y0 x) NADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
t! v, q/ s2 k( c! W r1 _0 Z
" E& D, d: ~* P3 w! O
! \. |# F/ j/ `4 U& I9 X B% o: }- a. |, }6 A
最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。
0 Z& z: w9 a! a q: u
* f6 I7 s. c% R2 `% o Y. R
至此Cube设置完成8 I% e( e4 d6 R! J/ Z
2 w) W3 S1 E% k# y附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。- /* USER CODE BEGIN 0 */
: O$ l# N3 M. d - /* ADC variables */# Q* T, b4 ~+ ?5 A
- __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值
5 `( l2 G' x3 \: E! ] - __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值/ K/ a$ l& ]; q' N
- /* USER CODE END 0 */
3 X$ {% W1 h3 s3 ~* k" e3 o - # N- k x7 [ W& p4 v8 W5 F
- int main(void)5 V o; m3 a% D/ Q' z9 u
- {+ N- Q% f' F0 n
- /* USER CODE BEGIN 1 */
! l/ Z& ]# S" K! @4 n/ J - uint16_t out_en_cnt=0;
% B. s* H# b" }8 y5 d/ G - /* USER CODE END 1 */. c _/ {3 z/ Z+ n
- ) y1 R$ U$ ^# u% W, i$ @
- /* MCU Configuration----------------------------------------------------------*/ _5 n: A/ n! l+ z/ \' n
2 U* W2 S/ m) y4 e. n" U! M7 E3 G- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ w- s5 G' F5 R- E( `) {
- HAL_Init();1 L1 Q2 B( N/ T
- " K( @! T. l# v8 H, X) O* a) s
- /* USER CODE BEGIN Init */
8 }1 l. X% ]6 c. ]0 L
z% _% a, D* z# f+ {- /* USER CODE END Init */
/ r4 j b* t8 f: Q - 0 _; f. l" {0 E$ Z# X/ {' V# M# A/ o
- /* Configure the system clock */
' W# d7 x, r9 R1 x+ j& F0 J( G$ f+ r - SystemClock_Config();
1 |4 r: N( C: P" i9 j* l r - 6 y' ]+ n$ h' o0 Z. g4 z( C5 p0 [
- /* USER CODE BEGIN SysInit */
9 x% e4 s- v. e) f - ; `: O9 y4 ~! V+ U# R$ N/ H$ }
- /* USER CODE END SysInit */
: i( u& V# n; V- {9 D% } - 2 y/ S0 N! {; T/ `! p$ o
- /* Initialize all configured peripherals */
4 B, Z! c5 f* t4 z1 d - MX_GPIO_Init();
# I7 v6 W) ~6 }+ r& | - MX_DMA_Init();+ V' y2 e3 i$ n8 Z1 x$ O5 p1 Y% {
- MX_USART2_UART_Init();
" ?; z& s5 k- ]' X6 P5 A) O - MX_ADC_Init();
& v Z/ H U* K# S - /* USER CODE BEGIN 2 */
# A/ f+ g" g8 E; c- f - HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
# J# {- P" Q7 U/ b% _ - HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断6 d) l0 `8 w+ t
- HAL_Delay(30);//等待第一轮ADC数据采集完成
/ I$ s4 b' A9 E) O - /* USER CODE END 2 */
. [" u. L' J6 Z* ]/ n h. |+ t6 G0 e ]2 M
# B) T% D% l5 a; X+ J$ }! P$ A" N1 y- /* Infinite loop *// Z6 z8 `5 Y! Z/ Y6 N
- /* USER CODE BEGIN WHILE */: H: {. G: S: E7 d' C2 `
- while (1)
0 i6 ]2 t& p4 R. T0 \; r# W - {
2 i& x( O+ l$ ^( Z' n Q - HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
, z( ~: p* f( Y5 j, U1 q) W - adc_getvalue();
+ n% m* i6 _0 s# E2 B9 Y( m -
( s) v+ v) A1 g% }9 S4 _ - if(++out_en_cnt == USART_TIMES)# d; {7 b' t1 w7 |) l2 ~9 F
- {) `0 r- |! v/ A: {5 e) u
- out_en_cnt = 0;
`) A: j7 ]) E) v9 j/ w9 p; m3 C - HAL_Delay(500);$ ?7 D9 V0 e0 H$ `
- printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);
' K0 ^$ a8 ^ d b, o6 C j8 A - }
: t7 S& q2 b9 { - }
! \- [! ]5 G: `) w
复制代码 ' t, s' q7 q" e4 J8 X8 N
最后,附完整工程。
7 z' I2 C: y2 V. V' r" L
; `/ F( @$ G- Q8 r7 ]5 @! j, E) Y1 `
/ R' y0 J9 G' t0 S9 F( F; _ |
cube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。