STM32 AD C单次转换模式 连续转换模式 扫描模式,AD7739的连续模式包含了STM32的扫描和连续两个模式。每个芯片的具体定义不同续根据据图芯片说明书理解

402 篇文章 177 订阅

举例

用ADC1 规则通道的顺序为CH0,CH1,CH2,CH3,

不启动SCAN模式,在单次转换模式下:

启动ADC1,则

1.开始转换CH1(ADC_SQR的第一通道)

转换完成后停止,等待ADC的下一次启动,继续从第一步开始转换

不启动SCAN模式,在单次连续转换模式下:

启动ADC1,则

1.开始转换CH0(ADC_SQR的第一通道)

转换完成后回到第一步。

启动SCAN模式,在单次转换模式下:

启动ADC1,则

1.开始转换CH0、

2.转换完成后自动开始转换CH1

3.转换完成后自动开始转换CH2

4.转换完成后自动开始转换CH3

5.转换完成后停止,等待ADC的下一次启动下一次ADC启动后从第一步开始转换

启动SCAN模式,在连续转换模式下:

启动ADC1,则1.开始转换CH0、

2.转换完成后自动开始转换CH1

3.转换完成后自动开始转换CH2

4.转换完成后自动开始转换CH3

5.转换完成后返回第一步


开启扫描模式后 必须搭配DMA功能才能实现ADC的数据处理(不一定对,但是应该考虑数据存储的时间防止丢数,原文意思是如果设置了DMA位,在每次EOC后, DMA控制器把规则组通道的转换数据传输到SRAM中。而
注入通道转换的数据总是存储在ADC_JDRx寄存器中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是STM32F103AD单通道扫描连续转换程序的示例代码: ```c #include "stm32f10x.h" #define ADC1_DR_Address ((uint32_t)0x4001244C) uint16_t ADCConvertedValue[4]; void ADC1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); } void ADC1_Mode_Config(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 4; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } void DMA_Config(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 4; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); } int main(void) { ADC1_GPIO_Config(); ADC1_Mode_Config(); DMA_Config(); while(1); } ``` 在此示例中,我们使用了ADC1和DMA1的单通道扫描连续转换模式。我们将4个通道(PA0,PA1,PA2,PA3)配置为模拟输入,并使用DMA传输转换数据。 在程序中,我们使用了以下函数: - `ADC1_GPIO_Config()` - 配置ADC的GPIO引脚 - `ADC1_Mode_Config()` - 配置ADC的工作模式 - `DMA_Config()` - 配置DMA通道 - `main()` - 主函数,其中我们将配置函数调用并启用DMA传输 程序的核心是在`ADC1_Mode_Config()`函数中,其中我们配置了ADC的工作模式,包括单通道扫描模式连续转换模式。在这里,我们将ADC的4个通道配置为模拟输入,并将DMA传输启用以传输转换数据。 请注意,此示例中的ADC采样时间为55.5个时钟周期。您可以根据您的具体应用程序要求进行调整。 此外,请确保您已正确地配置ADC和DMA的中断和错误处理程序,以便在发生错误时进行适当的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值