ADC_Init(10000, VDDA); // 设置ADC时钟频率和参考电压 ADC_SetupChannels(AD10 << ADC_DR1SEL , 0x02, BURSTMODE); // 将AD10的AD值映射到ADC_DR1寄存器中 ADC->CR_b.DMAEN=1; // 开启ADC的DMA传输1.2 DMA配置
DMA配置步骤:
- 初始化DMA;
- 配置DMA列表.me32f103单片机存在DMA列表机制,数据传输的地址可不连续,类似链表。
- 配置DMA通道参数。
- 获取空闲的DMA通道,开启数据传输。
DMA_Init();
NVIC_EnableIRQ(DMA_IRQn);
// 初始化DMA列表
DMA_InitChnLinkListItem(&data_item,
(uint32_t) NULL, // 下一列表地址
(uint32_t)&ADC->GDR, // 源地址
(uint32_t) data, // 目标地址
1000, // 数据长度
DMA_WIDTH_HALFWORD, // 数据字节 16bit
0, // 源地址不增加
1); // 目标地址增加
// 通道设置
DMA_InitChannelCfg(&receivechncfg,
DMA_CONN_ADC, // 数据源为ADC
DMA_CONN_MEMORY, // 目标源为内存
DMA_TRANSFERTYPE_P2M_CONTROLLER_DMA); // DMA方向为外设到内存,有DMA控制
freedmachn= DMA_GetFreeChannel(); // 获取空闲DMA通道
if (freedmachn!=0x0F) // 存在空闲通道
DMA_Transfer(freedmachn,&data_item,&receivechncfg); // 开启传输,当传输完成或者传输错误,触发中断
void DMA_IRQHandler(void)
{
uint16_t i;
DMA->INTTCCLEAR=0xFF; // 清除计数中断
DMA->INTERRCLR=0xFF; // 清除错误中断
for(i = 0;i<1000;i++) // 对数据进行处理
{
rdata[i] = data[i]&0x0fff;
}
if (freedmachn!=0x0F)
DMA_Transfer(freedmachn,&data_item,&receivechncfg);
}
注:
- 传输完成或传输错误后,该通道DMA传输将会停止,需要重新开始DMA对应通道。
- 在对DMA进行传输时,数据源为ADC->GDR,该寄存器RESULT[11:0]为AD值。DRN[14:12为DR寄存器号…故DMA完成读取后的数据不仅仅为AD值,因此通过位运算取出非AD值。
- 当使用多个ADC通道时,此时DMA传输完成的数据是多个ADC通道按顺序采集的AD值。



