节后上班,安排时间把节前的任务做一做。通讯测试完了,测试一下14bit A/D外设。连接比较简单,参考板卡原理图,将电位器用杜邦线直接连到3.3V,GND和PC0端口,PC7(LED)端口即可。如图1所示:
1 M8 ]5 D7 w5 }9 d6 u然后打开STM32CubeMX,根据需求对时钟,GPIO,AD外设进行配置,具体配置如图2所示:
: A* L9 N( C: p
3 b2 |- \/ J& \$ r6 K" {3 S生成code,这样大框架就搭好了,主要功能是实现每300ms单次转换后LED翻转一次。在main函数中添加Calibration函数
! S0 L; I$ x% W& }2 U% D- /* Perform ADC calibration */3 N* ^- E% ]5 a) t
- if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK), X. V$ F; b. U6 W( i) N. q
- {! W5 r# F0 @9 I" u, b; W
- /* Calibration Error */
# _ J$ I2 p, | - Error_Handler();
) U$ k; j) F. K9 H - }
复制代码 在while 中添加开始转换中断函数9 \ X4 q1 @- @3 H* l1 x
- /* Start ADC group regular conversion */
+ A7 A5 w- Q) b - if (HAL_ADC_Start_IT(&hadc1) != HAL_OK)
" V1 i) S0 E9 o; i4 e- v) \, s, p' m m! T - {
" X2 C7 N- k! W/ S+ l8 V - /* Error: ADC conversion start could not be performed */
5 G+ i9 Z- C+ B7 o+ @# Q - Error_Handler();. }/ z% s/ u1 Z% @. p' ]8 L$ w$ ^
- }
7 @/ j$ i6 ~0 t- }2 J - HAL_Delay (300);
' Y" k+ j, d- {3 L - HAL_GPIO_TogglePin (GPIOC,GPIO_PIN_7);
复制代码 还需要自己移植一下callback 函数. d1 k; ^. _0 J% T0 b
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)7 h. Z6 s- ]. y
- { r& f" K: Z# K' a$ ?+ H
- /* Retrieve ADC conversion data */+ d! {+ y" _$ h1 ?
- uhADCxConvertedData = HAL_ADC_GetValue(hadc);
) e2 a; ~+ X3 G# b+ V
( h! u0 a, o3 X& _$ `# ?4 r2 I- /* Computation of ADC conversions raw data to physical values */5 R5 _, k( `0 D; r
- /* using helper macro. */
- g! W0 q! T7 [$ k; g) x - uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(ADC1, VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_14B);$ ^* ?* t: n7 V! H
- }
复制代码 这就基本配置完了,但Debug并不顺利,代码一直卡在Error_Handler函数中,不知道什么情况。后来重新使用cubemx生成代码,就可以了。但是AD没有运行。查看了官方硬件开发入门手册,想来应该是VDDA电源没开启,参考了一下官方的例程,在HAL_MspInit 函数中果然有这一段:( s4 K9 ~: _9 ` U
但是在CubeMX中没找到配置VDDA的地方,不仔细看文档会错过很多内容。
) X% R. `1 z' U/ Q! [" x这样再Debug,程序运行正常。转动电位器,在watch窗口中就可以看到转换数值和转换电压,如图3所示:
" \1 Q8 v0 O; P0 M7 k! B初步测试了一下,后边可根据需要再调整。- {" S S% i+ |8 _3 q) ~ Y0 j4 `
1 n8 d' e3 {; a7 z9 u |