本帖最后由 电子星辰 于 2018-6-20 17:05 编辑
6 H ~- u$ Z$ `2 N7 R( o& N3 v% R
这是一个基于STM32F042K6T6的Nucleo板,使用Cube配置,通过过DMA连续采集较多采样数的ADC单通道程序。6 n: Y W) |4 Z3 U q8 u' P9 b+ S
' Y3 C, e& v2 S' F: y5 X首先先在Cube新建工程,选择Board Selector标签,在搜索框里打042即可。
0 N" M! N' y$ `" ~$ l
! r# Y& i0 }5 l* S6 Y
( p* U4 Z) ?% y2 s# Q; Q
选择之后会弹出一个选择是否初始化外设为默认设置的弹窗,选择“YES”的话,时钟、串口、调试什么的它就给你设置好了。选“NO”就全部自己设置。这里我选的是YES。
$ U' D' I- o, }) h( R
( l' N7 u) C5 E( ~: ]
+ N) b7 R7 F6 R$ t* ]' L4 ^3 |“Pinout”标签页里的串口默认设置就可以(Nucleo板042K6是使用的USART2,就那个MicroUSB接口,既可以下载也可以串口传输),ADC中勾选IN0。
' t, R' n* b4 K# {0 g# K
2 i& E5 H! e7 I2 a
2 M0 G9 p! Z; N. Y9 w+ t
4 r5 p9 V' e$ w/ p9 T! J# u3 @7 C1 I
0 x$ h/ O* r7 K# ]2 W
“Clock Configuration”标签页里,我喜欢主频设为最高,直接把HCLK改成最高48然后回车,它就自己给你弄好。) Z1 d# u( V! |3 z/ h2 }6 Z+ N
* w9 ~7 W: T! q/ f: N8 C$ u0 e; t# G1 m1 o, ]
“Configuration”标签页里,先设置USART2,参数设置如图,因为我不需要接收就不勾选中断了。
# I% j- Z& [4 A! t' J
. e. b+ Z% x& [( }ADC设置我先要添加DMA,模式选择连续模式Circular,这样就在循环前设置一下,以后直接取数据就行了。数据长度DATA Width一定要注意,12位的ADC两个都选半字,在代码里只取12位,如果使用全字然后代码里又没取对,那就会数据异常。
. S" M6 `5 E, _. |' L: ]! ?
0 \, O. O: @/ ]5 Q' S* I
' A' }- o+ ]5 ~2 ^& r, u1 p
# V0 D2 l6 l$ z: ^+ b; L+ m9 s最后是生成工程,点击图中红框图标,第一次会弹出设置窗口,以后再点会直接生成。如果想再设置,就在菜单栏里的工程菜单里点设置。
4 s% h( m3 }) [$ x
+ m2 ?; i7 V0 Z" M- Z( P& `至此Cube设置完成5 ^9 a4 w( b' O: }( I* s) y4 F
, B0 x2 n: M+ C附部分代码,特别说一下DMA采集函数里的ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)]这个地址,因为我设置的是半字传输,所以必须是16位,如果设成32位,数据就会异常(例如2个数据叠加)。- /* USER CODE BEGIN 0 */
) L4 |! x/ \; W' n1 k - /* ADC variables */) B$ t8 ^, x: t4 o) R
- __IO uint16_t ADC_ConvertedData[(ADC_SAMPLE * ADC_NUMOFCHANNEL)];//AD转换结果值, o* x K& R7 [6 U% j. Z! Z
- __IO float ADC_ConvertedValueLocal[ADC_NUMOFCHANNEL];// 以浮点数保存转换计算后的电压值
4 r4 | {7 Q, h" X3 \4 S - /* USER CODE END 0 */
' O. T7 ?$ K3 [! k' C. v
4 n: _$ H t# P8 P- ?- int main(void)
2 o: F& n U6 b/ Z2 h: B - {
, \: t; N7 o$ `4 y - /* USER CODE BEGIN 1 */* B' U7 P- m, K
- uint16_t out_en_cnt=0;
% G0 S6 |5 d3 z) M# ^: n: ] - /* USER CODE END 1 */+ g9 t% m, e* K' }
- . r. T0 u2 W% p9 G/ k/ N: c
- /* MCU Configuration----------------------------------------------------------*/
" E) I. h5 g Z) a
' d3 }( g$ j. F5 X- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ O9 T) _8 y) r2 @0 c6 n$ k3 I8 {
- HAL_Init();
! V1 a5 e2 e, P7 E- w7 _7 i - / E" v$ ~& ?% }' s
- /* USER CODE BEGIN Init */" e/ {! l" D& b! }' ~
' b1 `, }: _: \8 C' A# |$ m- /* USER CODE END Init */! i/ K" h% V) M7 K) B
& d6 ?* T& U1 T1 M2 G- /* Configure the system clock */
. ]3 ?: g# I; r - SystemClock_Config();
1 w" [, l2 [/ k# I9 ?* r# C% V. B$ g
: P4 ]9 ~1 m. Z- /* USER CODE BEGIN SysInit */2 z( u7 N2 z) g( T0 y% X
- & b% S m# Z5 d9 w9 K& |
- /* USER CODE END SysInit */% k" X8 I' z) ]" _
- " }4 ]: p) y! c* W* m9 _" _9 `/ E
- /* Initialize all configured peripherals */6 `" w" n/ A( ?* {9 C" F
- MX_GPIO_Init();
& w) g7 ?' w, y% x4 k1 R - MX_DMA_Init();0 y% d6 c$ [1 B" S% L/ U+ T% Y
- MX_USART2_UART_Init();
, h6 k3 i2 y6 {& G - MX_ADC_Init();+ N2 T1 v/ C5 p( V/ e1 J
- /* USER CODE BEGIN 2 */' e4 \/ |0 b) _
- HAL_ADCEx_Calibration_Start(&hadc);//启动ADC自校验
3 D7 w& n: ?: n) f, Q - HAL_ADC_Start_DMA(&hadc,(uint32_t *)ADC_ConvertedData,(ADC_SAMPLE*ADC_NUMOFCHANNEL));//启动AD转换并使能DMA传输和中断 n- r: V/ U. {( D4 w1 f7 \
- HAL_Delay(30);//等待第一轮ADC数据采集完成. A% J8 @6 y; m% z; \7 D
- /* USER CODE END 2 */8 V; _# t! L7 E f' q
6 }6 R' i: @, s- /* Infinite loop */3 s& I7 ^* Z7 p5 a: l8 V
- /* USER CODE BEGIN WHILE */* O# S) [' w5 @* j* c
- while (1)
8 ^3 W' w" T) e - {
0 q; V: g& j3 V }* E, ]( ^9 m - HAL_Delay(30);//一次采样+转换时间=(239.5+12.5)周期/14MHz=18us,延时30ms
6 a: ~. p5 K- m7 o% w) ]$ V - adc_getvalue();
0 W8 \# s& M/ V; w -
: D$ q, x' V% N: R$ _ - if(++out_en_cnt == USART_TIMES)0 `& o1 f6 @# V# k7 ]6 l
- {& Z' U: A4 F% m( Z1 [/ }: e, _
- out_en_cnt = 0;0 u( C6 L+ @+ X7 Z
- HAL_Delay(500);
3 I8 f9 H( }. Y# p. j" [ - printf("CHANNEL_0:%.2f\r\n",ADC_ConvertedValueLocal[0]);( x4 Z& U% O0 z& U
- }
$ d9 Z1 @2 O' _ - }
8 F+ Q$ u1 k" V$ s" h1 h* V( i
复制代码 & H" w) g% P1 ]. K$ E y4 ]
最后,附完整工程。
. T. J- x6 m1 }" v+ r/ t1 y, r# y) R# N
9 x2 P i& [+ X/ `1 I$ h8 }7 E! i
|
cube确实用起很方便,但感觉还不完善。有时候出问题就一直解决不了。。。