#include "adc.h"
u16 ADC_NUM=0;
void adc_init(void)
{
RCC->APB2ENR|=1<<2; //開啟PA時鐘
GPIOA->CRL&=0xFFFFFF0F;
GPIOA->CRL|=0x00000000;//PA1模擬輸入
RCC->APB2ENR|=1<<9; //開啟ADC1時鐘
RCC->APB2RSTR|=1<<9; //ADC1復位
RCC->APB2RSTR&=~(1<<9);//停止ADC1復位
RCC->CFGR&=~(3<<14); //ADC1分頻系數清零
RCC->CFGR|=2<<14; //PCLK2 6分頻后作為ADC時鐘
ADC1->CR1&=~(0xf<<16); //作業模式清零
ADC1->CR1|=0<<16; //獨立作業模式
ADC1->CR1&=~(1<<8); //非掃描模式
ADC1->CR1|=1<<5; //開中斷
MY_NVIC_Init(1,3,ADC1_2_IRQn,2);//設定中斷優先級具體的設定方法這里不貼出了
ADC1->CR2|=1<<1; //連續模式
ADC1->CR2|=1<<20; //規則通道的外部觸發轉換模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //軟體控制轉換
ADC1->CR2&=~(1<<11); //資料右對齊
ADC1->SQR3&=0XFFFFFFE0; //規則序列中的第1個轉換清零
ADC1->SQR3|=1;
ADC1->SQR1&=~(0xF<<20);
ADC1->SQR1|=0<<20; //規則序列中1個轉換
ADC1->SMPR2&=~(7<<3);
ADC1->SMPR2|=7<<3; //通道1的采樣時間239.5周期
ADC1->CR2|=1<<0; //開啟ADC1轉換
ADC1->CR2|=1<<3; //使能復位校準
while(ADC1->CR2&1<<3); //等待校準結束
ADC1->CR2|=1<<2; //開啟AD校準
while(ADC1->CR2&1<<2); //等待校準結束
ADC1->CR2|=1<<22; //開啟規則轉換
}
void ADC1_2_IRQHandler(void)
{
if(ADC1->SR&(1<<1))
{
ADC_NUM=ADC1->DR;
}
ADC1->SR&=~(1<<1);
}
主函式
說明 串口實作函式沒有貼出,大家自行百度
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "adc.h"
int main(void)
{
float VV=0;
Stm32_Clock_Init(9); //系統時鐘設定
delay_init(72); //延時初始化
uart_init(72,115200); //串口初始化為115200
led_init(); //LED初始化
adc_init(); //ADC初始化
while(1)
{
VV=(float)ADC_NUM*3.3/4096;
printf("電壓值為->%.2fv \r\n",VV);
LED0=!LED0;
delay_ms(200);
}
}
時間比較倉促 后續再改正帖子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/75740.html
標籤:單片機/工控
