Driver_ADC.c
如果需要關閉adc轉換,只需要設置CNT,將其置為0,后面再轉換一次就停止了。
#include "Driver_ADC.h"void Driver_ADC1_Init(void)
{/* 1. 時鐘配置 *//* 1.1 adc時鐘 */RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;RCC->CFGR |= RCC_CFGR_ADCPRE_1;RCC->CFGR &= ~RCC_CFGR_ADCPRE_0;/* 1.2 gpio的時鐘 */RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;/* 2. gpio工作模式: PC0 模擬輸入 CNF=00 MODE=00 */GPIOC->CRL &= ~(GPIO_CRL_CNF0 | GPIO_CRL_MODE0);/* 2. ADC相關配置 *//* 2.1 禁用掃描模式. 只有一個通道不用掃描 */ADC1->CR1 &= ~ADC_CR1_SCAN;/* 2.2 啟用連續轉換模式 CR2=CONT 1*/ADC1->CR2 |= ADC_CR2_CONT;/* 2.3 數據對齊方式: 右對齊 左對齊 */ADC1->CR2 &= ~ADC_CR2_ALIGN;/* 2.4 設置采樣時間 ADC_SMPR1 010=13.5周期*/ADC1->SMPR1 &= ~(ADC_SMPR1_SMP10_2 | ADC_SMPR1_SMP10_0);ADC1->SMPR1 |= ADC_SMPR1_SMP10_1;/* 2.6 通道組的配置 *//* 2.6.1 配置幾個通道需要轉換 */ADC1->SQR1 &= ~ADC_SQR1_L;/* 2.6.1 把通道號配置到組里面. */ADC1->SQR3 &= ~ADC_SQR3_SQ1; /* 先把5位清零 */ADC1->SQR3 |= 10 << 0; /* 設置最后5位 *//* 2.7 選擇軟件觸發 */ADC1->CR2 &= ~ADC_CR2_EXTTRIG; /* 禁用規則組的外部轉換 */ADC1->CR2 |= ADC_CR2_EXTSEL; /* 選擇使用軟件觸發ADC */
}void Driver_ADC1_StartConvert(void)
{/* 1. 上電: 把ADC從休眠模式喚醒 */ADC1->CR2 |= ADC_CR2_ADON;/* 2. 執行校準 */ADC1->CR2 |= ADC_CR2_CAL;while (ADC1->CR2 & ADC_CR2_CAL);/* 3. ADON = 1, 開始轉換 0>1 從休眠模式喚醒 1->1 開始 */ADC1->CR2 |= ADC_CR2_ADON;/* 4. 使用軟件開始轉換規則通道 */;ADC1->CR2 |= ADC_CR2_SWSTART;/* 5. 等待首次轉換完成 */while((ADC1->SR & ADC_SR_EOC) == 0);}double Driver_ADC1_ReadV(void)
{// 12位的ADC 范圍 [0, 4095]return ADC1->DR * 3.3 / 4095;
}
Driver_ADC.h
#ifndef __DRIVER_ADC_H
#define __DRIVER_ADC_H#include "stm32f10x.h"void Driver_ADC1_Init(void);void Driver_ADC1_StartConvert(void);double Driver_ADC1_ReadV(void);
double Driver_ADC1_ReadV(void);#endif
main.c
#include "Driver_USART.h"#include "Delay.h"
#include "Driver_ADC.h"int main()
{Driver_USART1_Init();printf("ADC單通道\r\n");Driver_ADC1_Init();Driver_ADC1_StartConvert();while (1){double v = Driver_ADC1_ReadV();printf("v = %.2f\r\n", v);Delay_s(1);}
}