STM32F4的ADC 配置

https://www.cnblogs.com/zyqgold/archive/2013/05/22/3093681.html
### STM32F4 ADC 配置方法 对于STM32F4微控制器而言,配置ADC涉及多个方面的工作,包括但不限于初始化、通道选择以及数据读取等操作。为了实现高效的多通道ADC采集,可以利用DMA技术来简化编程并提高性能。 #### 初始化与基本设置 在开始任何ADC转换前,需先完成必要的硬件资源分配和参数设定。这通常涉及到使能相应的时钟源,并通过修改特定寄存器(如`ADC_CSR`, `ADC_CCR`, 和 `ADC_CDR`)来进行具体的功能定制[^2]。 ```c // 启用ADC外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 设置ADC分辨率和其他全局属性 ADC_CommonInitTypeDef ADC_CommonInitStruct; ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); ``` #### DMA模式下的多通道采样 当需要处理大量连续的数据流时,启用DMA功能可显著减轻CPU负担。下面是一个简单的例子展示了如何配置DMA用于自动传输来自不同输入端口的模拟信号至内存缓冲区: ```c // 定义存储ADC结果的数组 uint16_t adc_values[NUMBER_OF_CHANNELS]; // 配置DMA请求映射到ADC事件上 DMA_InitTypeDef DMA_InitStruct; DMA_DeInit(DMA2_Stream0); DMA_InitStruct.DMA_Channel = DMA_Channel_0; DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC->DR; DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_values; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStruct.DMA_BufferSize = NUMBER_OF_CHANNELS; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStruct.DMA_Mode = DMA_Mode_Normal; DMA_InitStruct.DMA.Priority = DMA_PRIORITY_HIGH; DMA_InitStruct.FIFOMode = DMA_FIFOMode_Disable; DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStruct.MemBurst = DMA_MemoryBurst_Single; DMA_InitStruct.PeriphBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0, &DMA_InitStruct); // 将DMA连接到ADC触发中断 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 开启DMA传输 DMA_Cmd(DMA2_Stream0, ENABLE); ``` 上述代码片段中,DMA被用来将每次ADC转换的结果直接写入预定义好的数组内,从而实现了无需CPU干预即可获取多路传感器数值的目的[^1]。 #### 单次启动ADC转换 如果应用场景不需要持续不断地收集信息,则可以选择逐个激活各个通道上的测量活动。这种方式相对简单直观,在某些情况下也足够满足需求。 ```c void AD_Init(void){ // ...省略部分初始化代码... } uint16_t AD_GetValue(uint8_t channel){ GPIO_SetBits(GPIOA, GPIO_Pin_0); // 假定PA0作为第一个ADC通道 // 配置指定通道进行一次性的转换 ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_7Cycles5); // 触发软件转换命令 ADC_SoftwareStartConv(ADC1); // 等待直到当前转换结束 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } ``` 这段函数允许用户按顺序依次调用不同的ADC通道执行单独的一次性转换,并返回最终得到的数字量表示形式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值