ADC 采样模式
ADC 仅支持 连续采样模式。该模式下,ADC 不间断地按序对通道列表的通道进行采样,开关均可控,适合短时间内对电压连续采样。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:每当触发信号产生,ADC 会对通道列表中的所有通道按序进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
备注
BAT_MEAS引脚为专用引脚,不需要执行该步骤。设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
备注
BAT_MEAS引脚为专用引脚,不需要执行该步骤。设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
备注
BAT_MEAS引脚为专用引脚,不需要执行该步骤。设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
备注
BAT_MEAS引脚为专用引脚,不需要执行该步骤。设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:每当触发信号产生,ADC 会对通道列表中的所有通道按序进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
ADC 支持以下采样模式:
连续采样模式:ADC 不间断地按序对通道列表中的通道进行采样,开关均可控,适合短时间内对电压连续采样。
软件触发采样模式:软件每触发一次采样,ADC 输出一组数据。
定时器触发采样模式:通过设置基础定时器周期,定时触发 ADC 采样,ADC 输出一组数据。
ADC 支持 多通道采样,用户可以配置 通道切换列表 ,参数包括 采样通道数量 和 采样通道切换顺序。
ADC 采样顺序为:
首次触发采样时,ADC 对通道列表中的第一个通道进行采样。
每当新的触发信号产生,ADC 将自动切换到下一个通道。
当通道列表中最后一个通道采样完成,ADC 会在下一次触发信号产生后,对通道列表中的第一个通道进行采样。
使用 ADC 连续采样模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置采样模式为连续采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
通过轮询模式或中断模式读取 ADC 采样数据
轮询模式:
ADC_ReceiveBuf(u16 *pBuf, u32 len);
中断模式:
ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_AutoCSwCmd(ENABLE);
其中, ADCIrqHandle 的定义为:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); if (status & ADC_BIT_IT_FIFO_FULL_STS) { while (ADC_Readable()) { u32 sample_value = ADC_Read(); // 读出采样值 if (sample_cnt ++ > MAX_SAMPLE_CNT) { // 读到足够多的采样值 ADC_AutoCSwCmd(DISABLE); ADC_INTConfig(ADC_BIT_IT_FIFO_OVER_EN | ADC_BIT_IT_FIFO_FULL_EN, DISABLE); InterruptDis(ADC_IRQ); break; } } } ADC_INTClearPendingBits(status); return 0; }
使用 ADC 软件触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_SW_TRI_MODE; // 设置采样模式为软件触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
读取 ADC 采样数据
ADC_SWTrigCmd(ENABLE); while(ADC_Readable() == 0); ADC_SWTrigCmd(DISABLE); u32 sample_data = ADC_Read();
使用 ADC 定时器触发模式的步骤如下:
启用 ADC 模块的时钟与功能
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用
例如:调用以下函数来使用 ADC0 通道。
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 参考 pinmux table 配置 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
设置默认参数,并修改 ADC 工作模式。默认 ADC 对所有通道按序采样
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_TIM_TRI_MODE; // 设置采样模式为定时器触发采样
如有需要,修改 ADC_InitStruct 结构体,调整通道列表及其他参数
例如:用户设置通道切换列表的长度为 3 ,分别对通道 0、通道 2 和通道 4 进行采样。
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第一个通道号 ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第二个通道号 ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第三个通道号
初始化 ADC,并启用 ADC
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
确定基本定时器序号 tim_idx 并设置周期 period,通过中断处理函数读取 ADC 采样数据
ADC_INTConfig(ADC_BIT_IT_CV_END_EN | ADC_BIT_IT_CVLIST_END_EN, ENABLE); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, tim_idx, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE); ADC_TimerTrigCmd(tim_idx, period, ENABLE);
其中, ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { u32 tim_idx = (u32)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_CV_END_STS) { while (ADC_Readable() == 0); value = ADC_Read(); printf("ch:%d, data:%d\n", ADC_GET_CH_NUM_GLOBAL(value), ADC_GET_DATA_GLOBAL(value)); } if (status & ADC_BIT_IT_CVLIST_END_STS) { ADC_TimerTrigCmd(tim_idx, 0, DISABLE); printf("All conversion finished in channel list\n"); } ADC_INTClearPendingBits(status); return 0; }
备注
采样结果由 4 位通道号和 12 位采样值组成。用户可以分别通过以下宏获取:
ADC_GET_CH_NUM_GLOBAL(sample_data):获取 4 位通道号
ADC_GET_DATA_GLOBAL(sample_data):获取 12 位采样值
ADC 数字比较器
ADC 包含数字比较器,如果指定通道的采样数值在设置的范围内,会产生对应中断,用户可以在中断处理程序中进行特定的操作,如读取当前电压等。
数字比较器在 ADC 的所有采样模式下都可以工作。
数字比较器支持以下 比较模式 :
小于低阈值
大于高阈值
大于等于低阈值 且 小于等于高阈值
小于低阈值 或 大于高阈值
备注
低阈值和高阈值的取值范围为 0 ~ 4095 ,低阈值不能大于高阈值。
以连续采样模式为例,如果要使用 ADC 数字比较器,请按照以下步骤操作:
启用 ADC 模块的时钟与功能。
RCC_PeriphClockCmd(APBPeriph_ADC, APBPeriph_ADC_CLOCK, ENABLE); RCC_PeriphClockCmd(APBPeriph_CTC, APBPeriph_CTC_CLOCK, ENABLE);
根据 Pinmux 映射表配置 ADC 引脚复用。
例如,调用以下函数使用 ADC0:
Pinmux_Config(ADC_CH0_PIN, PINMUX_FUNCTION_xxx); // 请参考 Pinmux 表获取 function ID PAD_InputCtrl(ADC_CH0_PIN, DISABLE); PAD_PullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL); PAD_SleepPullCtrl(ADC_CH0_PIN, GPIO_PuPd_NOPULL);
指定通道并设置比较器的低阈值、高阈值和比较模式。
例如:调用以下函数来设置 ADC0 通道的比较模式,当采样值大于等于 2000 且小于等于 3000 时会有中断产生。
ADC_SetComp(ADC_CH0, 3000, 2000, ADC_COMP_WITHIN_THL_AND_THH); InterruptRegister((IRQ_FUN)ADCIrqHandle, ADC_IRQ, NULL, INT_PRI_MIDDLE); InterruptEn(ADC_IRQ, INT_PRI_MIDDLE);
其中,ADCIrqHandle 的定义如下:
u32 ADCIrqHandle(void *para) { (void)para; u32 status = ADC_GetISR(); u32 value; if (status & ADC_BIT_IT_COMP_ALL_STS) { printf("ISR:0x%x, Comp status:0x%x\n", status, ADC->ADC_COMP_STS); // ADC 在指定通道的采样值落在设置范围内 while (ADC_Readable() == 0); value = ADC_Read(); } ADC_INTClearPendingBits(status); return 0; }
设置默认参数,并修改 ADC 工作模式。默认情况下,ADC 按序对所有通道进行采样。
ADC_StructInit(ADC_InitTypeDef *ADC_InitStruct); ADC_InitStruct->ADC_OpMode = ADC_AUTO_MODE; // 设置为自动模式
如有需要,修改
ADC_InitStruct结构体,调整通道列表及其他参数。例如,将通道切换列表长度设为 3,并按顺序采样 ADC0/ADC2/ADC4:
ADC_InitStruct->ADC_CvlistLen = 3 - 1; // 设置通道切换列表长度 ADC_InitStruct->ADC_Cvlist[0] = ADC_CH0; // 设置第 1 个通道 ID ADC_InitStruct->ADC_Cvlist[1] = ADC_CH2; // 设置第 2 个通道 ID ADC_InitStruct->ADC_Cvlist[2] = ADC_CH4; // 设置第 3 个通道 ID
初始化 ADC,并启用 ADC。
ADC_Init(ADC_InitTypeDef *ADC_InitStruct); ADC_Cmd(ENABLE);
建议通过轮询模式读取 ADC 采样数据。