节后上班,安排时间把节前的任务做一做。通讯测试完了,测试一下14bit A/D外设。连接比较简单,参考板卡原理图,将电位器用杜邦线直接连到3.3V,GND和PC0端口,PC7(LED)端口即可。如图1所示:+ E* Q6 q/ {8 i5 y! I( Z+ e7 b- r
然后打开STM32CubeMX,根据需求对时钟,GPIO,AD外设进行配置,具体配置如图2所示:6 m1 C& L0 P: `: r5 X+ S& x) H
2 K' u" O& g6 e生成code,这样大框架就搭好了,主要功能是实现每300ms单次转换后LED翻转一次。在main函数中添加Calibration函数
# `& G5 _) w f& q! n- /* Perform ADC calibration */
9 _( z' X9 \9 c' _: W7 l& _ - if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)2 l2 T* t6 |: R% ~& O! \- G% @* P0 _7 ^
- {8 j( e! J* `) T V3 K% P
- /* Calibration Error */
' E( c) J( s, { - Error_Handler();
' |: G: `/ U+ d5 U - }
复制代码 在while 中添加开始转换中断函数
6 |6 _& P. I/ G0 l3 z8 i7 Q$ _- /* Start ADC group regular conversion */
/ _% [, ^: u+ k: b) i* [ - if (HAL_ADC_Start_IT(&hadc1) != HAL_OK)8 Z; v2 `) ~+ i/ X
- {8 s& T o/ y4 z' F; V
- /* Error: ADC conversion start could not be performed */
% }8 y: E. o! |% G1 f' G/ W - Error_Handler();
! E$ u1 M/ e3 B - }6 ?+ `" J+ H9 ?% e9 J" c. i4 c' g
- HAL_Delay (300);
& h( F: `, s9 D# J - HAL_GPIO_TogglePin (GPIOC,GPIO_PIN_7);
复制代码 还需要自己移植一下callback 函数! r$ x: P1 u; P Q( k0 ~
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)% c+ y% M+ o$ ~; T
- {1 |% K5 u2 H# ]; v! q
- /* Retrieve ADC conversion data */
X8 H+ u) Z+ N3 m1 i - uhADCxConvertedData = HAL_ADC_GetValue(hadc);+ c6 a" V& R' u" f
- 0 D3 f. T1 z6 |- z- ~
- /* Computation of ADC conversions raw data to physical values */7 X5 ^; h2 W+ {. e/ | W1 a' f
- /* using helper macro. */
! S) ]% P% h& i1 w - uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(ADC1, VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_14B);' t: Q* K% ?0 |, z: c
- }
复制代码 这就基本配置完了,但Debug并不顺利,代码一直卡在Error_Handler函数中,不知道什么情况。后来重新使用cubemx生成代码,就可以了。但是AD没有运行。查看了官方硬件开发入门手册,想来应该是VDDA电源没开启,参考了一下官方的例程,在HAL_MspInit 函数中果然有这一段:1 q, _! E1 S% }' Q# {
但是在CubeMX中没找到配置VDDA的地方,不仔细看文档会错过很多内容。
* H3 t1 p0 Q0 f& O6 `* o1 k' {这样再Debug,程序运行正常。转动电位器,在watch窗口中就可以看到转换数值和转换电压,如图3所示:; L& K. E8 L; O! K2 O6 d- |# f
初步测试了一下,后边可根据需要再调整。, z, I d: J, ?5 R3 K1 l7 f* ]
9 a! c. s: x+ B) D
|