国民技术N32G45X ADC配置

     最近在使用国民技术的N32G45X系列的芯片做项目,使用了ADC外设,根据芯片规格书中的描述,ADC 时钟源分为工作时钟源、采样时钟源和计时时钟源;

1、仅可配置 AHB_CLK 作为工作时钟源,最高可到 144MHz;

2、可配置 PLL 作为采样时钟源,最高可到 72MHz,支持分频1,2,4,6,8,10,12,16,32,32,64,128,256;

3、可配置 AHB_CLK 作为采样时钟源,最高可到 72MHz,支持分频 1,2,4,6,8,10,12,16,32;

4、 计时时钟用于内部计时功能,频率必须配置成 1MHz ;

支持配置双ADC模式,ADC1和ADC2一组,ADC3和ADC4一组;

支持配置DMA方式接收数据,独立模式,每一个ADC都支持配置为DMA方式;当配置为双ADC模式时,ADC2的数据通过ADC1的DMA通道获取,ADC4的数据通过ADC3的DMA通道获取;

当使用软件触发转换时,需要注意,在使能了ADC后,需要延时一段时间(<=20us),才可以正常的启动ADC的转换。

### N32G45x ADC 采样配置与使用实例 #### 配置 ADC 参数 为了正确设置 N32G45x 的 ADC 进行数据采集,需先初始化 ADC 控制寄存器。这包括设定转换模式、通道选择以及分辨率等参数。 ```c #include "n32g45x.h" void ADC_Configuration(void) { /* 开启 ADC 和 GPIO 时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2_PERIPH_ADC1 | RCC_APB2_PERIPH_GPIOA, ENABLE); /* 设置 PA0 作为模拟输入引脚 */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0; GPIO_InitStructure.GPIO_Mode = GPIO_MODE_ANALOG; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 初始化 ADC 结构体并配置默认参数 */ ADC_InitTypeDef ADC_InitStruct; ADC_StructInit(&ADC_InitStruct); } ``` #### 启动单次转换 当完成上述基本配置之后,可以启动一次性的 ADC 转换操作来获取当前电压值: ```c uint16_t ADC_SingleConversion(void) { uint16_t adc_value; /* 清除 ADON 位以停止任何正在进行中的转换 */ ADC_Cmd(ADC1, DISABLE); /* 执行软件触发的单一转换 */ ADC_StartOfSingleConversionCmd(ADC1, ENABLE); /* 等待 EOC 标志被置位表示转换结束 */ while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); /* 获取转换后的结果 */ adc_value = ADC_GetConversionValue(ADC1); return adc_value; } ``` #### 使用 DMA 实现连续采样 对于更高效的数据收集方式,则可以通过启用直接存储访问(DMA)功能来进行批量传输: ```c void ADC_DMAContinuousSampling(uint16_t* buffer, uint16_t length) { /* ...省略部分代码... */ /* 配置 DMA 请求映射到 ADC */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = length; 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_VeryHigh; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* 将 DMA 流绑定至 ADC 并开启自动注入序列 */ ADC_DMACmd(ADC1, ENABLE); ADC_AutoInjectedConvCmd(ADC1, ENABLE); } // 注意这里假设已经定义好了中断服务函数用于处理每次 DMA 完成事件。 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值