ADC-双ADC(同步规则)ADC_Mode = ADC_Mode_RegSimult,ADC1为主,ADC2为从,仿真无果?哪里设置异常

//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 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值