stm32f103 uart5 dmaadc(DMA)为什么得到的数据都是0x0fff最大值 程序如下,请大神指教: }

& & 4.AD以DMA方式采集四路,每路DMA深度为28级,并,说明滤波原理。
& & 总结:
& & 第一个任务:ADC以中断方式采集一路ADC,通过配置ADC_InitStructure结构体中的ADC_SConvMode,它规定模数转换工作在扫描模式(多通道)还是单次模式(单通道),
& & ADC_InitStructure.ADC_ScanConvMode=DBLE,为单通道单次模式。
& & ADC_ContinuousConvMode,定转换是连续还是单次,ADC_ContinuousConvMode=DISABLE 为单次,ADC_NbrOfChangnel规定ADC规则转换的通道数。ADC_NbrOfChannel=1;//开启1个通道数。
& & ADC_RegularChannelConfig(ADC1,ADC_Channel_13, 1,ADC_SampleTime_55Cycles5);设置指定规则组的通道的采样顺序和转换时间。这里以为只有一路通道,采用的是PC3引脚,对应的通道数是13通道,采样顺序也就是1,。
& & ADC_Cmd(ADC1,ENABLE);使能ADC
& & ADC_ITConfig(ADC1, ADC_IT_EOC,ENABLE);开启ADC转换结束中断。
& & ADC_ResetCalibration(ADC1);//重置校验寄存器
& & while(ADC_GetResetCalibrationStatus(ADC1)); //等待重置校验成功
& & ADC_StartCalibration(ADC1);//开始ADC校验
& & while(ADC_GetCalibrationStatus(ADC1));//等待ADC校验好
& & ADC_twareStartConvCmd(ADC1, ENABLE);//软件触发开始转换
& & 因为ADC有一个16位的规则组数据寄存器(ADC_DR),采用一路转换时可以不用通过DMA传输。这里就没有配置DMA。
& & void ADC_Handler(void)
& & ADonvertedValue=ADC_GetConversionValue(ADC1);
& & ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
& & 当一次转换结束,产生中断,在中断函数里,读取ADC_DR寄存器中的值,一定清除中断标志位。
& & 采集出来的数据是16进制数,要经过处理,变成10进制数,具体如下:
& & (value*100/4096)*33,value是从寄存器读出来的十六进制的数据,经过此变换后就变成10进制数,是个整数,我们通过串口显示的时候要把小树部分也要显示出来则有:((value*100/00,整数部分。
& & ((value*100/00/100,((value*100/0/10),小数部分,
& & 串口配置,我是通过STM32上的串口1与PC机通讯的,具体配置如下:
& & void USART_Configuration(void)
& & USART_InitTypeDef USART_InitS
& & USART_InitStructure.USART_BaudRate=9600;波特率9600
& & USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据位
& & USART_InitStructure.USART_StopBits=USART_StopBits_1;1个停止位
& & USART_InitStructure.USART_Parity=USART_Parity_No;无奇偶校验
& & USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
& & USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_N
& & USART_Init(USART1,&USART_InitStructure);初始化串口配置
& & USART_Cmd(USART1,ENABLE);使能串口
& & int utc(int ch,FILE *f)
& & USART_SendData(USART1, (u8)ch);
& & while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)//检查发送是否完成
& & }此函数,是把printf输出函数定向到USART。
& & 第一个任务大概就是这个过程,在后面的任务有相同之处,就不重复叙述了。
& & 第二个任务:ADC以中断方式连续采集四路。
& & 首先配置4路模拟输入,我配置的是PC0、PC1、PC2、PC3四个IO口,输入方式为模拟输入,速度采用2M,它们对应的ADC通道分别是10、11、12、13通道。
& & 在第一个任务说了,ADC规则转换多路采样时,ADC的数据寄存器只有一个16位寄存器,所以必须采用DMA来传输数据,DMA配置如下:
& & DMA_InitStructure.DMA_PeripheralBaseAddr=DR_ADDRESS; //DMA对应的外设基地址
& & DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&B //内存存储基地址,定义的一个数组
& & DMA_InitStructure.DMA_DIR=DMA_DIR_P //DMA转换模式为SRC模式,由外设搬移到内存
& & DMA_InitStructure.DMA_BufferSize=4; // DMA缓存大小,4个(设置DMA在传输时缓冲区的长度)
& & DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_D //接收一次数据后,设备地址禁止后移(设置DMA的外设递增模式)
& & DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_E //关闭接收一次数据后,目标内存地址后移(设置DMA的内存递增模式)
& & DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfW//定义外设数据长度
& & DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfW
& & DMA_InitStructure.DMA_Mode=DMA_Mode_C
& & //循环模式开启,Buf写满后,自动回到初始地址开始传输
& & DMA_InitStructure.DMA_Priority=DMA_Priority_H//优先级高
& & DMA_InitStructure.DMA_M2M=DMA_M2M_D
& & ADC配置:
& & //ADC配置
& & ADC_InitStructure.ADC_Mode=ADC_Mode_I//独立转换模式
& & ADC_InitStructure.ADC_ScanConvMode=ENABLE;//开启扫描模式
& & ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//开启连续转换模式
& & ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_N//ADC外部开关,关闭状态
& & ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_R//对齐方式,右对齐方式
& & ADC_InitStructure.ADC_NbrOfChannel=4;//开启通道数,4个
& & ADC_Init(ADC1,&ADC_InitStructure);//初始化ADC
& & ADC_RegularChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_55Cycles5);
& & ADC_RegularChannelConfig(ADC1,ADC_Channel_11,2,ADC_SampleTime_55Cycles5);
& & ADC_RegularChannelConfig(ADC1, ADC_Channel_12,3,ADC_SampleTime_55Cycles5);
& & ADC_RegularChannelConfig(ADC1,ADC_Channel_13,4,ADC_SampleTime_55Cycles5);;
& & //ADC通道组,第10、11、12、13个通道,采样顺序分别是1,2,3,4转换时间55.5个
& & ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
& & ADC_Cmd(ADC1, ENABLE);//打开ADC1
& & ADC_ResetCalibration(ADC1);//重置ADC1校准寄存器
& & while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
& & ADC_StartCalibration(ADC1);//开始ADC1校准
& & while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
& & ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能ADC1软件开始转换
& & 中断是采用DMA中断,当DMA第一轮传输结束时,设一个标志位,当标志位为1时,表明第一轮转化和传输完成,此时就可以读取数组中的数据,经过处理就可以通过串口显示出来。
& & void DMAChannel1_IRQHandler(void)
& & ADC_DMA_OK=1;
& & DMA_ClearITPendingBit(DMA1_IT_TC1);
& & }中断函数。
& & 第二个任务大概就这样子
& & 第三个任务:AD以DMA方式采集一路,DMA深度为一级。
& & 这个任务不难,关键要理解到DMA深度,用自己的语言来理解哈DMA深度吧,当ADC以一路采集时,ADC转换完成就自动把转换结果通过DMA传给目的地址,如果传输一次结束DMA就产生中断的话,DMA的深度就为一级,如果连续传输N次,DMA的深度就位N级,当然这个N是又范围的,因为受目的地址的内存大小控制和数据宽度,这个大家应该豆明白的。
& & 这个任务在第一个任务的基础上我通过DMA传输,意思是AD配置没什么区别。DMA配置和第二个任务的区别就是DMA_BufferSize的宽度不同。
& & #define DR_ADDRESS (u32)0x4001244c ADC的地址
& & #define DMA_Count 1 DMA深度,也就是连续传输的次数
& & #define ADC_Channle 1 ADC通道
& & 数据处理和串口通讯这里不重复叙述。DMA中断和任务二的类似。
& & 第四个任务:AD以DMA方式采集四路,每路DMA深度为128级,并滤波,说明滤波原理。
& & 这个任务和是个综合性任务,只要弄懂前面三个任务,难点是再如何滤波,开始的时候我也不知道怎么滤波,同事提醒我才知道怎么滤波的,我大概说哈我的理解,把四路通道采集的数据分别放到四个数组中,然后给他来个排序,降序,升序都行,把首位两个数丢掉,然后加起来求。但是我这里因为DMA的深度为128级,也就是四个通道分别采样了128次,大家都知道,数据越多,求平均值就越准确,所以我就没有采用什么排序法了,直接给他们分别求平均值,具体如下:
& & #define DR_ADDRESS (u32)0x4001244c ADC的地址
& & #define DMA_Count 128 DMA深度,也就是连续传输的次数
& & #define ADC_Channle 4 ADC通道
& & for(i=0;i&(ADC_Channle*DMA_Count);i+=4)
& & Value1[j]=Buf[i+0];
& & Sum1+=Value1[j];
& & Value2[j]=Buf[i+1];
& & Sum2+=Value2[j];
& & Value3[j]=Buf[i+2];
& & Sum3+=Value3[j];
& & Value4[j]=Buf[i+3];
& & Sum4+=Value4[j];
& & Valu1=Sum1/DMA_C
& & Valu2=Sum2/DMA_C
& & Valu3=Sum3/DMA_C
& & Valu4=Sum4/DMA_C
& & Delay(100000);
& & printf("rn当前AD_0值:0x%x,值:%d.%d%dVnr",
& & Valu1,((Valu1*100/00,((Valu1*100/00/100,((Valu1*100/0/10);
& & Delay(100000);
& & printf("rn当前AD_1值:0x%x,电压值:%d.%d%dVnr",
& & Valu2,((Valu2*100/00,((Valu2*100/00/100,((Valu2*100/0/10);
& & Delay(100000);
& & printf("rn当前AD_2值:0x%x,电压值:%d.%d%dVnr",
& & Valu3,((Valu3*100/00,((Valu3*100/00/100,((Valu3*100/0/10);
& & Delay(100000);
& & printf("rn当前AD_3值:0x%x,电压值:%d.%d%dVnr",
& & Valu4,((Valu4*100/00,((Valu4*100/00/100,((Valu4*100/0/10);
& & Delay(100000);
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&查看: 557|回复: 0
关于STM32F0 MCU 多通道ADC的DMA传输话题
整理:MilerShao 某日,一深圳客户在用STM32F0芯片开发新产品,其中用到7个ADC通道,并将AD转换的值通过DMA传输到一个内存数组里。他反映如果单通道ADC并启用DMA,数据传输都很正确,但当启用多通道ADC并启用DMA传输时,发现数据乱了套,结果是第一个数据特别大,后面的数据多数为0。后来通过网上了解到,貌似不少人栽在这里,这里尽力分享交流下。 在聊这个问题前,不妨插入两个小话题。一、记得有一次有个工程师在用STM8S芯片的ADC,跟我说ADC的值当输入电压较低时数据很准很正确,可当输入电压高到一定范围时,数据反而变小,似乎并无章法。查看其代码,其AD使用的是10bit,可他ADC处理函数返回的数据却8bit的。既然这样,当ADC数据大过255时要正确就怪了。 二、还记得某工程师用STM32F1的芯片开发产品时问我,是不是用HSI的话,UART波特率就上不了115200。我告知他一般来说,轻松能上。后来细查其代码,他不知何时把那个存放UART波特率的数据变量定义为16位宽度了,既然这样最高波特率就过不了64K。
好,回到今天的多通道ADC的DMA传输话题。其实,关于stm32 多通道ADC的DMA传输,ST官方在其传统外设固件库或CUBE工程固件库里都有现存的项目工程。两个库的例程我用基于STM32F072的牛客板【NUCLEO】做了测试,都可以正常使用。出现上面工程师提到的问题,是因为其有关数据宽度配置不一致导致的误解和误判。因为反映该问题的客户是基于ST官方的CUBE库做的。这里就基于cube工程示例项目交流。相关工程位置如下:\STM32Cube\Repository\STM32Cube_FW_F0_V1.3.0\Projects\STM32F072RB-Nucleo\Examples\ADC\ADC_Sequencer
例程项目用到3个AD通道。在有关ADC配置的地方,可以看出其ADC转换的数据分辨率为12位,数据右对齐,多通道ADC的扫描方向是从小往大,即FORWARD方向扫描。 从有关DMA配置代码可以看出,DMA拾取、送达两端的数据对齐宽度均为半字即16bit;数据从外设搬到存储器;内存地址递增方式; 从官方例程里可以看到一个3元素的数组用来存储3个AD通道转换值,数组元素的数据宽度为16位,即半字uint16_t 。 #define ADCCONVERTEDVALUES_BUFFER_SIZE ((uint32_t)
3)/* Variable containing ADC conversions results */__IO uint16_t aADCxConvertedValues[ADCCONVERTEDVALUES_BUFFER_SIZE]; 按照上面的条件进行编译调试,查看数组里的转换结果,并无发现异常。既没有第一个数据特别大,也没有后面数据为0的异象。分别是3个16位数据0xb2,0x05e5,每个数组变量对应一个AD通道的转换值。【后面也会用到这几个数据,因为是实时调试截图,数据可能些差异,先行忽略】
如果把上面存放ADC数据的数组变量数据宽度由16位改为32位,即U16改为U32,其它不变,再来看看结果。如下图所示:
呵呵,貌似异象出现了。数组里的数据出现跟第一种情况明显不同的布局,数组第一个数据的确是特别大,数组第2个数据摆放的似乎并非程序猿所希望的。结合上面的测试结果,大致可以看出该数组的第2个数据是处在第3个转换次序的AD通道的转换值,第3个数组数据里空空如也,是0。通过两次实验的比较不难发现,第二种情形下的半字数据,除了0值外,跟第一种情形里的数据是一样的,只是在数组元素的位置有变动。 看到这里估计有人已经明白怎么回事了。DMA传输的数据宽度跟数组定义的存储宽度不一致导致误会。其实各通道ADC的值并没有错【从上面实验也可以看出】,第2种情况只是把两个16位宽的ADC值放到一个32位宽的数组元素里。如果此时简单地把每个数组变量里的数据当做单个通道转换过来的值就是天大的误解了,因为每个数组变量存放的数据跟单个通道的ADC值不存在一一对应关系了。 上面客户的问题就是出在这里。为了避免类似误解和麻烦,DMA配置过程中在定义内存数据对齐宽度时最好与存放AD转换值的存储变量用同类型的数据宽度。细心的人还可以发现,在ST CUBE库例程代码里的DMA相关配置代码后面还特意跟了一句注释:
/* Transfer to memory by half-word to match with buffer variable type: half-word */ 这样做的目的主要是方便后面对ADC转换数据的读取及后续计算,并不是说数组存储变量的数据宽度定义跟DMA传输数据宽度不一致就一定错了。对于DMA而言,它只关心数据要存放的起始地址、自己每次搬运数据的宽度、单轮循环搬运的次数就行。至于缓冲区存放数据的变量类型怎么样它并不关心。下面是我将存放数据的数组变量的数据宽度改为8位、数组元素改为6,其它不动的测试结果。【高位地址对应高位数据字节】 显然,当把数组变量类型定义为U8时,DMA将来自AD转换来的每个16位源数据分别放在2个8位数组变量空间。跟上面第二种情形一样,每个数组变量并不对应一个AD转换值,而是每个AD值分两个数组元素摆放。但从AD变换或DMA传输而言,并没有出错,结果都是正确的。下图是直接给DMA一个目标地址,然后在内存区查看ADC转换出来的数据。【高位地址对应高位数据字节】结果也是正常的。 最后顺便提下,STM32F0的多通道AD扫描有两个方向,一般默认为FORWARD方向,也可以设置为BACKWARD方向。有时忽略了也可能给开发者带来混乱或困惑,因为有时多通道,换个方向后AD值可能跟预估的大相径庭而又无规律。本文中的话题,包括开头中插入的两个话题,看似跟AD/DMA等有关,实质上感觉跟C语言或其它基础更为密切。【抛砖引玉 旨在交流,如有错疏 欢迎赐教】
Powered by后使用快捷导航没有帐号?
查看: 2343|回复: 6
郁闷,ADC都调不出来
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
&&&&我的硬件是这样连接的:PC0-PC4是模拟输入,现在我在这几个输入源上,不管电压怎么变化,我发现ADC出来的数据都是没有改变。&&&&事实上,通道0,1,3的数据都是0x0fff,其它两通道的数据虽然不是0x0fff,但是很明显不是实际的电压值.&&&&/*&Configure&PC.0-PC.4&as&analog&input&--------------*/&&&&GPIO_InitStructure.GPIO_Pin&=&0x001f;&&&&GPIO_InitStructure.GPIO_Mode&=&GPIO_Mode_AIN;&&&&GPIO_Init(GPIOC,&&GPIO_InitStructure);&&&&/*&ADC1&configuration&------------------------------------------------------*/&&&&ADC_InitStructure.ADC_Mode&=&ADC_Mode_I&&&&ADC_InitStructure.ADC_ScanConvMode&=&ENABLE;&&&&ADC_InitStructure.ADC_ContinuousConvMode&=&ENABLE;&&&&ADC_InitStructure.ADC_ExternalTrigConv&=&ADC_ExternalTrigConv_N&&&&ADC_InitStructure.ADC_DataAlign&=&ADC_DataAlign_R&&&&ADC_InitStructure.ADC_NbrOfChannel&=&5;&&&&ADC_Init(ADC1,&&ADC_InitStructure);&&&&/*&ADC1&regular&channels&configuration&*/&&&&&ADC_RegularChannelConfig(ADC1,&ADC_Channel_0,&1,&ADC_SampleTime_239Cycles5);&&&&&&&&ADC_RegularChannelConfig(ADC1,&ADC_Channel_1,&2,&ADC_SampleTime_239Cycles5);&&&&ADC_RegularChannelConfig(ADC1,&ADC_Channel_2,&3,&ADC_SampleTime_239Cycles5);&&&&&&&&ADC_RegularChannelConfig(ADC1,&ADC_Channel_3,&4,&ADC_SampleTime_239Cycles5);&&&&ADC_RegularChannelConfig(ADC1,&ADC_Channel_4,&5,&ADC_SampleTime_239Cycles5);&&&&DMA_DeInit(DMA1_Channel1);&&&&DMA_InitStructure.DMA_PeripheralBaseAddr&=&(uint32_t)ADC1_DR_A&&&&DMA_InitStructure.DMA_MemoryBaseAddr&=&(uint32_t)ADC_ConvertedValueT&&&&DMA_InitStructure.DMA_DIR&=&DMA_DIR_PeripheralSRC;&&&&DMA_InitStructure.DMA_BufferSize&=&40;&&&&DMA_InitStructure.DMA_PeripheralInc&=&DMA_PeripheralInc_D&&&&DMA_InitStructure.DMA_MemoryInc&=&DMA_MemoryInc_E&&&&DMA_InitStructure.DMA_PeripheralDataSize&=&DMA_PeripheralDataSize_HalfW&&&&DMA_InitStructure.DMA_MemoryDataSize&=&DMA_MemoryDataSize_HalfW&&&&DMA_InitStructure.DMA_Mode&=&DMA_Mode_C&&&&DMA_InitStructure.DMA_Priority&=&DMA_Priority_H&&&&DMA_InitStructure.DMA_M2M&=&DMA_M2M_D&&&&DMA_Init(DMA1_Channel1,&&DMA_InitStructure);&&&&ADC_DMACmd(ADC1,&ENABLE);&&&&/*&Enable&ADC1&*/&&&&DMA_Cmd(DMA1_Channel1,&ENABLE);&&&&ADC_Cmd(ADC1,&ENABLE);&&&&/*&Enable&ADC1&reset&calibaration&register&*/&&&&&&&ADC_ResetCalibration(ADC1);&&&&/*&Check&the&end&of&ADC1&reset&calibration&register&*/&&&&while(ADC_GetResetCalibrationStatus(ADC1));&&&&/*&Start&ADC1&calibaration&*/&&&&ADC_StartCalibration(ADC1);&&&&/*&Check&the&end&of&ADC1&calibration&*/&&&&while(ADC_GetCalibrationStatus(ADC1));&&&&ADC_SoftwareStartConvCmd(ADC1,ENABLE);
&&&&&&&&&&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&RCC_APB2PeriphClockCmd,是不是这个函数没有调用,没有启动外设时钟。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&&如果没有启动的话,ad的数据是出不来的。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
时钟已经设置了
&&RCC_HCLKConfig&&&(RCC_SYSCLK_Div1);&&&/*&HCLK&&&=&SYSCLK&&*/&&RCC_PCLK2Config&&(RCC_HCLK_Div1);&&&&&/*&PCLK2&&=&HCLK&&&&*/&&RCC_PCLK1Config&&(RCC_HCLK_Div2);&&&&&/*&PCLK1&&=&HCLK/2&&*/&&RCC_ADCCLKConfig&(RCC_PCLK2_Div8);&&&&/*&ADCCLK&=&PCLK2/8&*/&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE);
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
会不会存在这样的问题?
我用的是STM32F103VC:PC0-PC4可以作为ADC_Channel_0&-&ADC_Channel_4的模拟输入,PA0-PA4也可以作为ADC_Channel_0&-&ADC_Channel_4的模拟输入,所以,它会不会把PA0-PA4作为ADC_Channel_0&-&ADC_Channel_4的模拟输入,而不是我期望的PC0-PC4?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
你搞错了吧?PC0~PC4是ADC输入10~14,PA0~PA4才是ADC输入0~4
注意:STM32F103VC的数据手册中表5有这样的注释&PC0对应ADC123_IN10,这表示ADC1_IN10、ADC2_IN10和ADC3_IN10共用这个引脚。同样PC1对应ADC123_IN11;PC2对应ADC123_IN12;PC3对应ADC123_IN13;PC4对应ADC12_IN14,PC4只对应ADC1和ADC2的模拟输入14,没有对应ADC3。请下载最新的数据手册:
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
真如你所说,谢谢香主
& & & & & & & & & & & & & & & && &
Powered by
逛了这许久,何不进去瞧瞧?STM32F103C8T6详细参数
ARM微控制器 - MCU
数据总线宽度:
最大时钟频率:
程序存储器大小:
数据 RAM 大小:
ADC分辨率:
工作电源电压:
2 V to 3.6 V
数据 Ram 类型:
CAN, I2C, SPI, USART, USB
ADC通道数量:
输入/输出端数量:
计时器/计数器数量:
电源电压-最大:
电源电压-最小:
最大工作温度:
最小工作温度:
包装数量:
STM32F103C8T6高速外部时钟源交流时间图
ADC(模数转换器)
两个12位模拟数字转换器是嵌入STM32F103xx性能设备和每个ADC 16外部渠道,在singleshot执行转换或扫描模式,在扫描模式中,选择组执行自动转换的模拟输入。
额外的逻辑函数嵌入到ADC接口允许:
.同时样本并持有
.交叉取样维持
ADC可以由DMA控制。
模拟看门狗功能允许非常精确转换电压的监测,部分或全部选定的渠道,一个中断时产生电压转换在设定阈值,事件生成的通用定时器(TIMx)和先进控制计时器(TIM1)可以连接到内部ADC开始触发,注入触发和DMA分别触发,允许应用程序同步A
/ D转换和定时器。
温度传感器
温度传感器必须产生一个随温度线性变化的电压,之间的转换范围是2 V & VDDA & 3.6 V .温度传感器内部连接到ADC12_IN16输入通道用于将传感器的输出电压到一个数字值。
STM32F103C8T6尺寸规格
推荐电子产品资料
推荐代理商
深圳市德逸创科技有限公司}

我要回帖

更多关于 stm32f103 dma 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信