//ad.c
/*
PB0-ADC1-channel 8
PB1-ADC2-channel 9
*/
//初始化GPIO-PB0_1
static void ADC1_2_GPIO_Init(void)
{
//ADC1
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
//ADC2
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
//DMA1-Ch1初始化
uint32_t u32_ADC1_2_arr[1];//内存地址
static void ADC1_2_DMA1_Channel1_Init(void)
{
DMA_InitTypeDef DMA1_Ch1_InitStruct;
//DMA1时钟使能
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//外设基地址:ADC1->DR
DMA1_Ch1_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
//存储器地址
DMA1_Ch1_InitStruct.DMA_MemoryBaseAddr = (uint32_t)u32_ADC1_2_arr;
//外设数据大小
DMA1_Ch1_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
//存储器数据大小,和外设数据大小相同!
DMA1_Ch1_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
//外设寄存器只有1个,不用递增
DMA1_Ch1_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//内存地址递增
DMA1_Ch1_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
//缓存大小,等于数据目的地大小?
DMA1_Ch1_InitStruct.DMA_BufferSize = 1 ;
//数据源头来自外设
DMA1_Ch1_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
//禁止内存到内存,数据从外设到内存
DMA1_Ch1_InitStruct.DMA_M2M = DMA_M2M_Disable;
//循环传输模式
DMA1_Ch1_InitStruct.DMA_Mode = DMA_Mode_Circular;
//优先级为高,只有一个DMA通道,优先级设置不影响
DMA1_Ch1_InitStruct.DMA_Priority = DMA_Priority_High;
//初始化DMA1-Ch1
DMA_Init(DMA1_Channel1, &DMA1_Ch1_InitStruct);
//使能DMA1-Ch1
DMA_Cmd(DMA1_Channel1, ENABLE);
}
//ADC1-ADC2初始化
static void ADC1_2_PB0_1_Init(void)
{
//ADC1
ADC_InitTypeDef ADC1_InitStruct;
//ADC1时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//双ADC 规则同步-同步规则
ADC1_InitStruct.ADC_Mode = ADC_Mode_RegSimult;
//扫描模式
ADC1_InitStruct.ADC_ScanConvMode = ENABLE;
//连续转换模式
ADC1_InitStruct.ADC_ContinuousConvMode = ENABLE;
//ADC1软件启动,不用外部触发
ADC1_InitStruct.ADC_ExternalTrigConv = DISABLE;
ADC1_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
//ADC1转换通道个数
ADC1_InitStruct.ADC_NbrOfChannel = 1;
//ADC1初始化
ADC_Init(ADC1, &ADC1_InitStruct);
//ADC时钟PCLK2的8分频,9MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//ADC1 通道配置
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);
//ADC1命令 使能
ADC_Cmd(ADC1, ENABLE);
//ADC1 DMA命令使能, ADC2无DMA功能
ADC_DMACmd(ADC1, ENABLE);
//Calibration
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1)) {
;
}
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1)) {
;
}
//ADC2
ADC_InitTypeDef ADC2_InitStruct;
//ADC2时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
//双ADC 规则同步-同步规则
ADC2_InitStruct.ADC_Mode = ADC_Mode_RegSimult;
//扫描模式
ADC2_InitStruct.ADC_ScanConvMode = ENABLE;
//连续转换模式
ADC2_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC2_InitStruct.ADC_ExternalTrigConv = DISABLE;
ADC2_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
//ADC2转换通道个数
ADC2_InitStruct.ADC_NbrOfChannel = 1;
ADC2初始化
ADC_Init(ADC2, &ADC2_InitStruct);
//ADC时钟PCLK2的8分频,9MHz
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
ADC2 通道配置
ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 1, ADC_SampleTime_239Cycles5);
//ADC2外部触发转换命令使能
ADC_ExternalTrigConvCmd(ADC2, ENABLE);
ADC_Cmd(ADC2, ENABLE);
//Calibration
ADC_ResetCalibration(ADC2);
while (ADC_GetResetCalibrationStatus(ADC2)) {
;
}
ADC_StartCalibration(ADC2);
while (ADC_GetCalibrationStatus(ADC2)) {
;
}
//软件触发ADC1
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
//
void ADC1_2_RegSimult_Init()
{
ADC1_2_GPIO_Init();
ADC1_2_DMA1_Channel1_Init();
ADC1_2_PB0_1_Init();
}
//ADC.h
#ifndef __ADC_H
#define __ADC_H
#include "sys.h"
void ADC1_2_RegSimult_Init();
extern uint32_t u32_ADC1_2_arr[1];
#endif
//main.c
#include "adc.h"
#include "stm32f10x.h"
#include "stm32f10x_adc.h"
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
#include <math.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include "usart.h"
uint16_t u16_ADC1_PB0_val;
uint16_t u16_ADC1_PB1_val;
int main()
{
usart1_init(9600);
//ADC1_2_RegSimult
ADC1_2_RegSimult_Init();
while (1) {
//ADC1_2_RegSimult
u16_ADC1_PB0_val = u32_ADC1_2_arr[0] & 0x0000FFFF;
printf("%d\n",u16_ADC1_PB0_val);
u16_ADC1_PB1_val = (u32_ADC1_2_arr[0] & 0xFFFF0000)>>16;
printf("%d\n",u16_ADC1_PB1_val);
delay_ms(500);
}
}
设置参考:第43章 ADC-双ADC(同步规则) - hazy1k - 博客园