你那个问题解决了没啊,就是stm32单片机用DMA的AD转换,在电脑上显示的都是0

【问题汇总】关于STM32的ADC/DAC问题 - STM32/STM8技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
【问题汇总】关于STM32的ADC/DAC问题
<em id="authorposton14-3-14 09:30:28
1、STM32的DAC转换是什么开始的呢?
问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢?
答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。
2、STM32的DAC输出电压
问:DAC的输出电压是如何调节的呢,输入的数字量和输出的电压怎么不成比例呢,输出电压不符合数据手册上提供的公式(DAC输出 = VREF X DOR / 4095),求高人指点,程序如下:
#include &stm32f10x_lib.h&
#define DAC_DHR8R1_Address 0x
DAC_InitTypeDef DAC_InitS
DMA_InitTypeDef DMA_InitS
ErrorStatus HSEStartUpS
uc8 Escalator8bit[50] = {0x0, 0x33, 0x66, 0x99, 0xcc, 0xff};
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void Delay(vu32 nCount);
int main(void)
#ifdef DEBUG
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
TIM_PrescalerConfig(TIM6, 0xF, TIM_PSCReloadMode_Update);
TIM_SetAutoreload(TIM6, 0xFF);
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_N
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_D
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_A
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 6;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_B
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_B
DMA_InitStructure.DMA_Mode = DMA_Mode_C
DMA_InitStructure.DMA_Priority = DMA_Priority_H
DMA_InitStructure.DMA_M2M = DMA_M2M_D
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel3, ENABLE);
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_DMACmd(DAC_Channel_1, ENABLE);
TIM_Cmd(TIM6, ENABLE);
void RCC_Configuration(void)
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() != 0x08)
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
void GPIO_Configuration(void)
GPIO_InitTypeDef GPIO_InitS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
void NVIC_Configuration(void)
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
void Delay(vu32 nCount)
for(; nCount != 0; nCount--);
输出电压为什么不是0~3.3V呢?
答1:(u32)&Escalator8你把这个里面的数据强制转换为32位,也就是0x0, 0x33, 0x66, 0x99转换为一个32位的数据,你这样做是不对的。你应该定义一个16位的数组,然后VREF X DOR / 4095算出DOR的值,DOR的值不能超过4095.
答2:DAC_OutputBuffer - 输出缓存 使能再试试
3、关于STM32F103RE的DAC
问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢?
答:有2个,这个你可以到引脚图上面看到。
4、STM32F107的DAC例程都用TIMx更新启动DMA2
问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?
答:不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.
5、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
问:STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
答:一共有16个痛多的ADC,外置式是什么类型连接的?
答:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
答:用其他3个IO做片选就可以
6、STM32F2 ADC
问:STM32F系列单片机中ADC的每个通道的采用周期都是可配置的,我想问一下采样周期配置的越大转换出来的值越精确吗?比如STM32F2处理器的ADC采用周期可以是3、15、28、56、84、112、144、480.还有就是ADC中分为规则组和注入组,这两种模式在使用上有什么本质的不同吗?
答:ADC采用周期越大采集间隔越长,这个值越小采集越精确。 规则组 此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(n&=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的DISCNUM[2:0]位给出。 一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。 举例: n=3,被转换的通道 = 0、1、2、3、6、7、9、10 第一次触发:转换的序列为 0、1、2 第二次触发:转换的序列为 3、6、7 第三次触发:转换的序列为 9、10,并产生EOC事件 第四次触发:转换的序列 0、1、2 注入组 此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。 一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。 例子: n=1,被转换的通道 = 1、2、3 第一次触发:通道1被转换 第二次触发:通道2被转换 第三次触发:通道3被转换,并且产生EOC和JEOC事件 第四次触发:通道1被转换
答:非常感谢您的回答。其实我想问的是采样时间越大采样值就越精确吗?ADC采样周期可以是3、15、28、56、84、112、144、480. 最小的采样时间是3个ADCCLK,最大的是480个ADCCLK,这个值是越大越好吗?
答:ADC采用周期越大采集间隔越长,这个值越小采集越精确。
7、STM32 ADC操作模式有哪些?
问:STM32 ADC操作模式有哪些?
答:单次转换模式:转换一次则停止连续转换模式:转换完一次后即开始下一次转换扫描模式:扫描一组模拟通道间断模式:每触发一次,转换序列中n个通道多种触发方式
8、STM32的内部温度传感器通过哪个AD采集?
答:STM32集成了片上的温度传感器,可以用来测量芯片内部的温度; STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量;测量范围–40~125℃,精度 ± 1.5℃。
9、STM32 CPU温度数值如何计算?
答:ADC转换结束以后,读取ADC_DR寄存器中的结果,通过下面的公式计算 T(℃) = V25 – VSENSE/ Avg_Slope + 25 V25:温度传感器在25℃时的输出电压,典型值1.43 V VSENSE:温度传感器的当前输出电压,与ADC_DR寄存器中的结果ADC_ConvertedValue之间的转换关系为: VSENSE = ADC_ConvertedValue * Vdd / Vdd_convert_value(0xFFF) Avg_Slope:温度传感器输出电压和温度的关联参数,典型值4.3 mV/℃ 转换程序 Vtemp_sensor = ADC_ConvertedValue * Vdd / Vdd_convert_ Current_Temp = (V25 - Vtemp_sensor)/Avg_Slope + 25;
10、使用ADC时的注意事项是什么?
答:1、外部电路的等效输入阻抗要匹配,采样速度越快,输入阻抗越小。STM32数据手册上有对照表; 2、只有在100脚和144脚的产品上才有VREF+和VREF-引出管脚。在其它产品封装中, VREF+在芯片内部与VDDA相连, VREF-在芯片内部与VSSA相连; 3、电路设计时,在VREF+和VDDA上一定要有良好的滤波,使用高质量的滤波电容且一定要尽量靠近芯片的管脚。
11、关于STM32 双ADC 同步注入模式
问:我想用TIM控制双ADC同步采样6路信号,因为听说DMA方式会有错位的BUG,所以想用双ADC同步注入方式采样。但是看了手册后有以下几个疑惑
1. ADC_InitStructure.ADC_Mode = ADC_Mode_InjecS
如果我设置了同步注入模式,可是触发方式选择什么呢。能否简单的说明下同步注入
模式的初始化配置流程。
2. 在数据手册上只有ADC1有注入数据寄存器,而ADC2是没有的。但是在库函数中发现有
ADC_GetInjectedConversionValue这样一个函数,用这个是否能读出ADC2注入
组的数据呢?
答1:选择自动注入就可以,注意不可能同时使用自动注入和间断模式。 2、此模式转换一个注入通道组。外部触发来自ADC1的注入组多路开关(由ADC1_CR2寄存器的JEXTSEL[2:0]选择),它同时给ADC2提供同步触发。
12、ADC 定时器触发
问:按()程序初始化后,只能触发一次,转换完数据都自动复制到ADC_CvtValue中了。不能连续转换。不知啥原因?
答1: ADC_DMARequestModeConfig(ADC1,ADC_DMAMode_Circular); 就好了。如果还有问题的话你看看 ChannelN 值是多少? ADC_CvtV 是数组?还有你开了中断!要清除标志位!
13、STM32 DAC 库函数问题
问:在函数DAC_SetChannel1Data(u32 DAC_Align, u16 Data)中,第二个参数u16 Data是什么意思,怎么使用?
答:DATA就是你要发送的数据,也就是DAC输出的电压值
14、一个关于STM32F103VCT6 ADC的线性度的测试
问:本人同事最近做的项目,发现 STM32F103VCT6 ADC 测试出现了一个现象,线性度不好, 使用外部2.5V基准,调整10K电位器, ADC转换在 40 三个点线性度很不好, 电压变化20mv,这三个点才会发生跳变,跳变不是ADC码+-1,而是加减了几十个ADCbit,我认为不是STM32内部的硬件问题,而是应用问题,不知道有人遇到过这种情况没有? 从二进制码来看,这三个数的第八位都是0
贴一张STM32 ADC性能参数图,按理说STM32的ADC不至于我测试的这么差呀,是我们使用有问题吗?
答:ADC测试的时候尽量保证电压的稳定,最好用放大器来将其分压,而电阻分压在温度、电流、电压不同的情况下会有偏差。
15、STM32的DAC转换是什么开始的呢?
问:STM32的DAC转换是什么开始的呢?如何利用DAC输出一个脉宽的控的单脉冲呢?
答:DAC是通过写入DAC输出寄存器开始的。另外,如果想要脉冲,使用TIM功能。
16、关于STM32F103RE的DAC个数问题
问:关于STM32F103RE中有几个DAC呢?是只有一个DAC(包括两个通道)还是有两个呢?
答:有2个,这个你可以到引脚图上面看到。
17、STM32F107的DAC例程都用TIMx更新启动DMA2
问:STM32F107的DAC例程都用TIMx更新启动DMA2,没有不用TIMx启动DMA2自动把数据传送DAC的DHRxx寄存器里面?该如何设置呢?
最佳答案:
不用TIM只能自己写时间判断了.可以在while()里面写一个计数器的处理或者延时的处理.
18、STM32如何与多个多通道ADC AD790进行配置
问:STM32F107VCT6如何与多个多通道ADC AD790进行SPI连接配置?谢谢各位大侠们
最佳答案:
通过AD790本身的控制,可以通过硬件来设置硬件地址。你可以详细乐队AD790的资料。
19、STM32F107可以带多个外置式ADC吗?如果可以最多可以带多少个?
问:外置式ADC型号是AD7490的 16通道,SPI接口。因为总共有38路模拟量的,我想用三个外置ADC。另外我想问一下是不是可以只用一个SPI接口就可以连接三个外置ADC呢?如果可以怎么做片选呢?万分感谢!
答:用其他3个IO做片选就可以
20、STM32F2 ADC
问:采样时间越大采样值就越精确吗?ADC采样周期可以是3、15、28、56、84、112、144、480. 最小的采样时间是3个ADCCLK,最大的是480个ADCCLK,这个值是越大越好吗?
答:ADC采用周期越大采集间隔越长,这个值越小采集越精确。 规则组 此模式通过设置ADC_CR1寄存器上的DISCEN位激活。它可以用来执行一个短序列的n次转换(n&=8),此转换是ADC_SQRx寄存器所选择的转换序列的一部分。数值n由ADC_CR1寄存器的DISCNUM[2:0]位给出。 一个外部触发信号可以启动ADC_SQRx寄存器中描述的下一轮n次转换,直到此序列所有的转换完成为止。总的序列长度由ADC_SQR1寄存器的L[3:0]定义。 举例: n=3,被转换的通道 = 0、1、2、3、6、7、9、10 第一次触发:转换的序列为 0、1、2 第二次触发:转换的序列为 3、6、7 第三次触发:转换的序列为 9、10,并产生EOC事件 第四次触发:转换的序列 0、1、2 注入组 此模式通过设置ADC_CR1寄存器的JDISCEN位激活。在一个外部触发事件后,该模式按通道顺序逐个转换ADC_JSQR寄存器中选择的序列。 一个外部触发信号可以启动ADC_JSQR寄存器选择的下一个通道序列的转换,直到序列中所有的转换完成为止。总的序列长度由ADC_JSQR寄存器的JL[1:0]位定义。 例子: n=1,被转换的通道 = 1、2、3 第一次触发:通道1被转换 第二次触发:通道2被转换 第三次触发:通道3被转换,并且产生EOC和JEOC事件 第四次触发:通道1被转换
21、STM32的双ADC操作模式有哪些?
问:STM32的双ADC操作模式有哪些?
最佳答案:
快速交替模式:在一个通道上以连续方式的快速交替模式
慢速交替模式:在一个通道上以连续方式的快速交替模式
交替触发模式:
同步模式:
快速交替模式:在一个通道上以连续方式的快速交替模式
慢速交替模式:在一个通道上以连续方式的快速交替模式
交替触发模式:
多谢楼主分享&&先收藏了
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
我顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司stm32设置ADC1 8通道顺序DMA采样,中断无法进入(检查好几遍了,难道真的是人品问题??) - amoBBS 阿莫电子论坛 - Powered by Discuz!
amoBBS 阿莫电子论坛
标题: stm32设置ADC1 8通道顺序DMA采样,中断无法进入(检查好几遍了,难道真的是人品问题??)
作者: lianglong& & 时间:
标题: stm32设置ADC1 8通道顺序DMA采样,中断无法进入(检查好几遍了,难道真的是人品问题??)系统设置函数:包含 时钟设置、GPIO设置、DMA设置、ADC设置
void SystemInit (void)
&&ErrorStatus HSEStartUpS
&&GPIO_InitTypeDef&&GPIO_InitS
&&DMA_InitTypeDef&&DMA_InitS
&&ADC_InitTypeDef&&ADC_InitS
& & //使能外部晶振
& & RCC_HSEConfig(RCC_HSE_ON);
& & //等待外部晶振稳定
& & HSEStartUpStatus = RCC_WaitForHSEStartUp();
& & //如果外部晶振启动成功,则进行下一步操作
& & if(HSEStartUpStatus==SUCCESS)
& && &&&//设置HCLK(AHB时钟)=SYSCLK
& && &&&RCC_HCLKConfig(RCC_SYSCLK_Div1);
& && &&&//PCLK1(APB1) = HCLK/2
& && &&&RCC_PCLK1Config(RCC_HCLK_Div2);
& && &&&//PCLK2(APB2) = HCLK
& && &&&RCC_PCLK2Config(RCC_HCLK_Div1);
& && &&&//设置ADC时钟频率
& && &&&RCC_ADCCLKConfig(RCC_PCLK2_Div6);
& && &&&//FLASH时序控制
& && &&&//推荐值:SYSCLK = 0~24MHz& &Latency=0
& && &&&//& && &&&SYSCLK = 24~48MHz Latency=1
& && &&&//& && &&&SYSCLK = 48~72MHz Latency=2
& && &&&FLASH_SetLatency(FLASH_Latency_2);
& && &&&//开启FLASH预取指功能
& && &&&FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
& && &&&//PLL设置 SYSCLK/1 * 9 = 8*1*9 = 72MHz
& && &&&RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
& && &&&//启动PLL
& && &&&RCC_PLLCmd(ENABLE);
& && &&&//等待PLL稳定
& && &&&while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
& && &&&//系统时钟SYSCLK来自PLL输出
& && &&&RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
& && &&&//切换时钟后等待系统时钟稳定
& && &&&while(RCC_GetSYSCLKSource()!=0x08);
//下面是给各模块开启时钟
& & //启动GPIO
/*& & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | \
& && && && && && && && && &RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,\
& && && && && && && && && &ENABLE);&&*/
& & //启动AFIO
& & RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
& & //启动USART1
//& & RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
& & //启动DMA时钟
& & RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
& & //启动ADC1时钟
& & RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//******************IO输出模式配置*****************************************************
&&/* Enable USB_DISCONNECT GPIO clock
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT, ENABLE);
&&//Configure USB pull-up pin& &GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
&&GPIO_InitStructure.GPIO_Pin = USB_DISCONNECT_PIN;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
&&GPIO_Init(USB_DISCONNECT, &GPIO_InitStructure);&&//配置usbIO
&&//*****A端口配置**AD通道输入
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO, ENABLE); //72Mhz
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
&&GPIO_Init(GPIOA, &GPIO_InitStructure);&&
&&//*****C端口配置**AD通道输入
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO, ENABLE); //72Mhz
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
&&GPIO_Init(GPIOC, &GPIO_InitStructure);
&&//闪烁灯的管脚设置&&
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//开GPIOC时钟
&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
&&GPIO_Init(GPIOE, &GPIO_InitStructure);
&&/* DMA1 channel1 configuration ----------------------------------------------*/
&&DMA_DeInit(DMA1_Channel1);
&&//启动DMA时钟
&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
&&DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A
&&//外设地址?
&&DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_RCVT
&&//内存地址?
&&DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
&&//dma传输方向单向?
&&DMA_InitStructure.DMA_BufferSize = 160;
&&//设置DMA在传输时缓冲区的长度 word
&&DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D
&&//设置DMA的外设递增模式,一个外设?
&&DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E
&&//设置DMA的内存递增模式,?
&&DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW
&&//外设数据字长16bit
&&DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
&&//内存数据字长?
&&DMA_InitStructure.DMA_Mode = DMA_Mode_N&&
&&//DMA_InitStructure.DMA_Mode = DMA_Mode_C
&&//设置DMA的传输模式:连续不断的循环模式?
&&DMA_InitStructure.DMA_Priority = DMA_Priority_H
&&//Medium 设置DMA的优先级别?
&&DMA_InitStructure.DMA_M2M = DMA_M2M_D
&&//设置DMA的2个memory中的变量互相访问?
&&DMA_Init(DMA1_Channel1, &DMA_InitStructure);
&&/* Enable DMA1 channel1 */
&&/* Enable DMA1 channel1 */
&&DMA_Cmd(DMA1_Channel1, ENABLE);
& & /* Enable DMA Channel1 complete transfer interrupt */ //liang
&&DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //开传输完中断
&&//AD设置
& &/* ADC1 configuration ------------------------------------------------------*/
//&&ADC_DeInit(ADC1);
&&//启动ADC1时钟
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
&&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 = 8;
//用于转换的通道数?
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_10, 5, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 6, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 7, ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 8, ADC_SampleTime_239Cycles5);
/* Enable ADC1 DMA [使能ADC1 DMA]*/
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 [使能ADC1]*/
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));
/* Start ADC1 Software Conversion */
作者: lianglong& & 时间:
DMA中断函数:
void DMAChannel1_IRQHandler(void)& &&&//改成void DMA1Channel1_IRQHandler(void) 也可以通过编译,奇怪啊
flare_lighting(20);& && && && && && & //状态灯的闪烁,表示进入了中断程序
DMA_ClearITPendingBit(DMA1_IT_TC1);
DMA_ClearFlag(DMA1_FLAG_TC1);
作者: lianglong& & 时间:
中断设置函数如下所示:
void NVIC_Configuration(void)
&&NVIC_InitTypeDef&&NVIC_InitS
&&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);& &
&&/* Enable the dma Interrupts liang */
&&// clear IT flag first
&&DMA_ClearFlag(DMA1_FLAG_TC1);
&&NVIC_InitStructure.NVIC_IRQChannel = DMAChannel1_IRQC
&&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
&&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
&&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&&NVIC_Init(&NVIC_InitStructure);
作者: lianglong& & 时间:
主函数如下所示:
int main(void)
&&//在模块设置开始前初始化中断系统
//&&NVIC_DeInit();& && && && && && & //中断函数的默认初始化在编译的时候显示undefined 果然怪异
&&NVIC_Configuration();
&&SystemInit();
&&ADC_SoftwareStartConvCmd(ADC1, ENABLE);
&&while (1);
程序编译没有错误,只有 function&SetSysClock& was declared but never referenced、和 function &SetSysClockTo72& was
declared but never referenced 两个警告( 时钟已经在void SystemInit (void)里设置好了 )
作者: shaidn& & 时间:
作者: hdj2000002& & 时间:
stm32的ADC的DMA模式好像有问题,原先准备用DMA传输,但不行,后来直接用ADC的中断源了
作者: lianglong& & 时间:
整好了,原来是DMA中断函数命名错误(库的版本问题), 害的老子找了好几天&&(敏感词0245)!!
作者: moyuker& & 时间:
我也遇到跟楼主一样的问题。
原来有IAR的工程,现在改用MDK,并且采用06/13/2008版本V2.0.1的FWLib库。
但是中断向量描述文件没有用最新的版本,而是用了之前的旧版本,导致stm32f10x_it.c与stm32f10x.s 2个文件中断服务函数名称不一致,结果程序崩溃,根本无法运行,更别说进中断了。
作者: robingbing& & 时间:
看了,学习一下,谢谢楼主。
作者: yangzhong& & 时间:
回复【6楼】lianglong&&
-----------------------------------------------------------------------
多谢分享经验, 我靠, 我也卡在这里1天半时间。 看到你的回帖,也搞好了。
作者: onwatchor& & 时间:
之前用多通道ADC,忘记延时一段时间等待ADC转化完成,卡住了。现在正想用DMA来弄……
作者: dkdachong& & 时间:
使用DMA传输,但不使能中断,数据不依然能存储到ADC_RCVTab【】中,直接对该数组操作即可,我这想法没问题吧!?
作者: weilaiweilai& & 时间:
怎么解决的??能分享下不??我也遇到同样的问题。。。
作者: gotofly100& & 时间:
dkdachong 发表于
使用DMA传输,但不使能中断,数据不依然能存储到ADC_RCVTab【】中,直接对该数组操作即可,我这想法没问题 ...
就是啊,开个存储空间,要用就直接去取数好了,还是最实时的,为什么要去中断来中断去的?我就是这样做的,有什么问题吗?
作者: Making& & 时间:
mark,,,,,,,,,
作者: xssr123& & 时间:
谢谢,正需要这些知识
作者: zhuifenga& & 时间:
gotofly100 发表于
就是啊,开个存储空间,要用就直接去取数好了,还是最实时的,为什么要去中断来中断去的?我就是这样做的 ...
使用中断是为了实时响应,在任务比较多的时候你使用查询的方式去查AD值,肯定不行嘛!
作者: zyz9074& & 时间:
多谢楼主分享&&今天也犯了这个错!!
作者: 1米49& & 时间:
多谢多谢啊
欢迎光临 amoBBS 阿莫电子论坛 (https://www.amobbs.com/)
Powered by Discuz! X3.4}

我要回帖

更多关于 stm32单片机 的文章

更多推荐

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

点击添加站长微信