节后上班,安排时间把节前的任务做一做。通讯测试完了,测试一下14bit A/D外设。连接比较简单,参考板卡原理图,将电位器用杜邦线直接连到3.3V,GND和PC0端口,PC7(LED)端口即可。如图1所示: 
然后打开STM32CubeMX,根据需求对时钟,GPIO,AD外设进行配置,具体配置如图2所示: 
 
生成code,这样大框架就搭好了,主要功能是实现每300ms单次转换后LED翻转一次。在main函数中添加Calibration函数 
- /* Perform ADC calibration */
 
 -   if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
 
 -   {
 
 -     /* Calibration Error */
 
 -     Error_Handler();
 
 -   }
 
  复制代码 在while 中添加开始转换中断函数 
- /* Start ADC group regular conversion */
 
 -     if (HAL_ADC_Start_IT(&hadc1) != HAL_OK)
 
 -     {
 
 -       /* Error: ADC conversion start could not be performed */
 
 -       Error_Handler();
 
 -     }
 
 -                 HAL_Delay (300);
 
 -                 HAL_GPIO_TogglePin (GPIOC,GPIO_PIN_7);
 
  复制代码 还需要自己移植一下callback 函数 
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
 
 - {
 
 -   /* Retrieve ADC conversion data */
 
 -   uhADCxConvertedData = HAL_ADC_GetValue(hadc);
 
  
-   /* Computation of ADC conversions raw data to physical values           */
 
 -   /* using helper macro.                                                  */
 
 -   uhADCxConvertedData_Voltage_mVolt = __LL_ADC_CALC_DATA_TO_VOLTAGE(ADC1, VDDA_APPLI, uhADCxConvertedData, LL_ADC_RESOLUTION_14B);
 
 - }
 
  复制代码 这就基本配置完了,但Debug并不顺利,代码一直卡在Error_Handler函数中,不知道什么情况。后来重新使用cubemx生成代码,就可以了。但是AD没有运行。查看了官方硬件开发入门手册,想来应该是VDDA电源没开启,参考了一下官方的例程,在HAL_MspInit 函数中果然有这一段: 
但是在CubeMX中没找到配置VDDA的地方,不仔细看文档会错过很多内容。 
这样再Debug,程序运行正常。转动电位器,在watch窗口中就可以看到转换数值和转换电压,如图3所示: 
初步测试了一下,后边可根据需要再调整。 
 
 |