栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1.ME32F103单片机ADC和DMA

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1.ME32F103单片机ADC和DMA

1. ME32F103单片机ADC和DMA 1.1 ADC配置
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配置步骤:

  1. 初始化DMA;
  2. 配置DMA列表.me32f103单片机存在DMA列表机制,数据传输的地址可不连续,类似链表。
  3. 配置DMA通道参数。
  4. 获取空闲的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);	
}

注:

  1. 传输完成或传输错误后,该通道DMA传输将会停止,需要重新开始DMA对应通道。
  2. 在对DMA进行传输时,数据源为ADC->GDR,该寄存器RESULT[11:0]为AD值。DRN[14:12为DR寄存器号…故DMA完成读取后的数据不仅仅为AD值,因此通过位运算取出非AD值。
  3. 当使用多个ADC通道时,此时DMA传输完成的数据是多个ADC通道按顺序采集的AD值。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920347.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号