注意,在CubeMX中,void SystemClock_Config(void)多了如下代码:
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
- PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC|RCC_PERIPHCLK_CKPER;
- PeriphClkInitStruct.CkperClockSelection = RCC_CLKPSOURCE_HSE;
- PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_CLKP;
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
复制代码
查看HAL_RCCEx_PeriphCLKConfig函数中关于adc的部分:
- /*---------------------------- ADC configuration -------------------------------*/
- if(((PeriphClkInit->PeriphClockSelection) & RCC_PERIPHCLK_ADC) == RCC_PERIPHCLK_ADC)
- {
- switch(PeriphClkInit->AdcClockSelection)
- {
- case RCC_ADCCLKSOURCE_PLL2: /* PLL2 is used as clock source for ADC*/
- ret = RCCEx_PLL2_Config(&(PeriphClkInit->PLL2),DIVIDER_P_UPDATE);
- /* ADC clock source configuration done later after clock selection check */
- break;
- case RCC_ADCCLKSOURCE_PLL3: /* PLL3 is used as clock source for ADC*/
- ret = RCCEx_PLL3_Config(&(PeriphClkInit->PLL3),DIVIDER_R_UPDATE);
- /* ADC clock source configuration done later after clock selection check */
- break;
- case RCC_ADCCLKSOURCE_CLKP:
- /* HSI, HSE, or CSI oscillator is used as source of ADC clock */
- /* ADC clock source configuration done later after clock selection check */
- break;
- default:
- ret = HAL_ERROR;
- break;
- }
- if(ret == HAL_OK)
- {
- /* Set the source of ADC clock*/
- __HAL_RCC_ADC_CONFIG(PeriphClkInit->AdcClockSelection);
- }
- else
- {
- /* set overall return value */
- status = ret;
- }
- }
复制代码
而实际上我们只需要在生成HAL_ADC_MspInit中添加一句核心的__HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP);//ADC外设时钟选择就可以了。
ADC的时钟源有三个选项:
- /** @defgroup RCCEx_ADC_Clock_Source RCCEx ADC Clock Source
- * @{
- */
- #define RCC_ADCCLKSOURCE_PLL2 ((uint32_t)0x00000000)
- #define RCC_ADCCLKSOURCE_PLL3 RCC_D3CCIPR_ADCSEL_0
- #define RCC_ADCCLKSOURCE_CLKP RCC_D3CCIPR_ADCSEL_1
复制代码
默认将采用RCC_ADCCLKSOURCE_PLL2,即400M的输入时钟,时钟太快,所以会导致ADC采集出来的数据不会有变化。
全部代码如下:
主程序代码:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "adc.h"
- int main(void)
- {
- u16 adcx;
- //Cache_Enable(); //打开L1-Cache
- HAL_Init(); //初始化HAL库
- Stm32_Clock_Init(200, 2, 2, 2); //设置时钟,400Mhz
- delay_init(400); //延时初始化
- uart_init(115200); //串口初始化
- printf("hello\r\n");
- MX_ADC1_Init();
- while (1)
- {
- adcx = Get_Adc_Average(ADC_CHANNEL_19, 20); //获取通道19的转换值,20次取平均
- printf("adcx:%d\r\n",adcx);
- delay_ms(500);
- }
- }
复制代码
————————————————
版权声明:小盼你最萌哒
|
感谢分享,非常有用哇