代码功能概述
ADC 配置:配置 ADC1 和 ADC2 为规则同步模式,采集两个通道的模拟信号。
DMA 配置:配置 DMA1 通道 1,将 ADC1 的转换结果自动传输到内存数组 ADC_DualConvertedValueTab 中。
中断处理:当 DMA 传输完成时,触发中断,用户可以在中断中处理采集到的数据。
(1) 系统时钟配置 (RCC_Configuration)
- void RCC_Configuration(void)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // 使能 DMA1 时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); // 使能 ADC1、ADC2、AFIO 和 GPIOA 时钟
- }
功能:使能 DMA1、ADC1、ADC2、AFIO 和 GPIOA 的时钟。
关键点:
DMA1 挂载在 AHB 总线上,因此需要使能 RCC_AHBPeriph_DMA1。
ADC1 和 ADC2 挂载在 APB2 总线上。
GPIO 配置 (GPIO_Configuration)
- void GPIO_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- // 配置 PA1 和 PA2 为模拟输入
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度 50MHz
- GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化 GPIOA
- }
功能:配置 PA1 和 PA2 为模拟输入模式,用于 ADC 采样。
关键点:
ADC 通道 1 对应 PA1,通道 2 对应 PA2。
ADC 配置 (ADC_Configuration)
- void ADC_Configuration(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
-
- ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult; // 规则同步模式
- ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 禁用扫描模式
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 使能连续转换
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 无外部触发
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
- ADC_InitStructure.ADC_NbrOfChannel = 1; // 1 个通道
- ADC_Init(ADC1, &ADC_InitStructure); // 初始化 ADC1
- ADC_Init(ADC2, &ADC_InitStructure); // 初始化 ADC2
- ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 配置 ADC1 通道 1
- ADC_RegularChannelConfig(ADC2, ADC_Channel_2, 1, ADC_SampleTime_55Cycles5); // 配置 ADC2 通道 2
-
- ADC_ExternalTrigConvCmd(ADC2, ENABLE); // 使能 ADC2 外部触发
- ADC_DMACmd(ADC1, ENABLE); // 使能 ADC1 的 DMA 请求
-
- ADC_Cmd(ADC1, ENABLE); // 使能 ADC1
- ADC_Cmd(ADC2, ENABLE); // 使能 ADC2
-
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件启动 ADC1 转换
- }
功能:配置 ADC1 和 ADC2 为规则同步模式,并启动 ADC1 的转换。
关键点:
ADC_Mode_RegSimult:ADC1 和 ADC2 同时转换。
ADC_DMACmd:使能 ADC1 的 DMA 请求,将转换结果通过 DMA 传输到内存。
DMA 配置 (DMA_Configuration)
- void DMA_Configuration(void)
- {
- DMA_InitTypeDef DMA_InitStructure;
-
- DMA_DeInit(DMA1, DMA_Channel1); // 复位 DMA1 通道 1
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; // 外设地址(ADC1 数据寄存器)
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_DualConvertedValueTab; // 内存地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 传输方向:外设到内存
- DMA_InitStructure.DMA_BufferSize = 4; // 缓冲区大小(4 个数据)
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不递增
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; // 外设数据宽度:32 位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; // 内存数据宽度:32 位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 高优先级
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁用内存到内存模式
- DMA_Init(DMA1, DMA_Channel1, &DMA_InitStructure); // 初始化 DMA1 通道 1
-
- DMA_ITConfig(DMA1, DMA_Channel1, DMA_IT_TC, ENABLE); // 使能 DMA 传输完成中断
- DMA_Cmd(DMA1, DMA_Channel1, ENABLE); // 使能 DMA1 通道 1
- }
功能:配置 DMA1 通道 1,将 ADC1 的转换结果自动传输到内存数组 ADC_DualConvertedValueTab 中。
关键点:
DMA_Mode_Circular:循环模式,传输完成后自动重新开始。
DMA_IT_TC:使能传输完成中断。
NVIC 配置 (NVIC_Configuration)
- void NVIC_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; // DMA1 通道 1 中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; // 抢占优先级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; // 子优先级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断
- NVIC_Init(&NVIC_InitStructure);
- }
功能:配置 DMA1 通道 1 的中断优先级并使能中断。
DMA 中断处理 (DMA1_Channel1_IRQHandler)
- void DMA1_Channel1_IRQHandler(void)
- {
- DMA_ClearITPendingBit(DMA1_IT_TC1); // 清除 DMA 传输完成中断标志
- // 当进入 DMA 完成中断,意味数据采集完成
- // 此处可直接对 ADC_DualConvertedValueTab 数据进行分析
- }
功能:在 DMA 传输完成时触发中断,用户可以在中断中处理采集到的数据。
关键点:
DMA_ClearITPendingBit:清除中断标志。
主函数 (main)
- int main()
- {
- RCC_Configuration(); // 配置时钟
- GPIO_Configuration(); // 配置 GPIO
- DMA_Configuration(); // 配置 DMA
- ADC_Configuration(); // 配置 ADC
- NVIC_Configuration(); // 配置 NVIC
- while (1) {}
- }
功能:初始化系统并启动 ADC 和 DMA。
|