OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4956|回复: 8

各位大神,帮忙看看,为什么ADC DMA 串口输出结果全是零啊?

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-3
在线时间
0 小时
发表于 2014-5-3 14:32:03 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]#include "pbdata.h" void RCC_Configuration(void); void GPIO_Configuration(void); void USART_Configuration(void); void NVIC_Configuration(void); void ADC_Configuration(void); void DMA_Configuration(void); u16 ADCData[10]; //u16 ADCData; int fputc(int ch,FILE *f) { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; } int main(void) { u32 ad=0; u8 i=0; RCC_Configuration(); //系统时钟初始化 GPIO_Configuration();//端口初始化 USART_Configuration(); NVIC_Configuration(); DMA_Configuration(); ADC_Configuration(); while(1) { ad=0; for(i=0;i<10;i++) { ad=ADCData; printf("ad=%f\r\n",3.3/4095*ad);//voltage } // ad=ad/50; // printf("ad=%f\r\n",3.3/4095*ad);//voltage // for(i=0;i<2;i++) // { // printf("addr=%u16\r\n",&ADCData); // } delay_ms(1000); delay_ms(1000); delay_ms(1000); } } void RCC_Configuration(void) { SystemInit();//72MHZ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ<14MHZ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //LED GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//tx GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//rx GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_Init(GPIOC,&GPIO_InitStructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate=9600; USART_InitStructure.USART_WordLength=USART_WordLength_8b; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_Parity=USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART1,&USART_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); USART_Cmd(USART1,ENABLE); USART_ClearFlag(USART1,USART_FLAG_TC); } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode=ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode=DISABLE; ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//循环采集 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel=1; ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5); ADC_DMACmd(ADC1,ENABLE);//重要 ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1);//复位ADC while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1,ENABLE); } void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR; DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADCData; DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize=10; DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_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_High; DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; DMA_Init(DMA1_Channel1,&DMA_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE); }[/mw_shl_code]
为什么输出结果以全是零啊,各位大神…………

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-3 15:57:25 | 显示全部楼层
参考下论坛其他网友的代码吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-3
在线时间
0 小时
 楼主| 发表于 2014-5-3 19:05:43 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好的,先谢了
回复 支持 反对

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-4 09:49:23 | 显示全部楼层
DMA_InitStructure.DMA_MemoryInc=DMA_PeripheralInc_Enable;
楼猪仔细检查一下你的168行代码。
#define DMA_PeripheralInc_Enable           ((uint32_t)0x00000040)
#define DMA_MemoryInc_Enable               ((uint32_t)0x00000080)
因为楼猪的笔误,导致了本该在DMA的CCR寄存器的第7位(存储器地址增量模式使能)写1,却错误地将CCR寄存器的第6位(外设地址增量模式使能)写1,导致的直接结果就是 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;
这样楼猪通过DMA读取的就不再是ADC DR寄存器的外设地址,因为外设地址一直在增加。
当然我只是发现了这个问题,具体读取为0的问题是不是这个原因,还需要楼猪进一步验证。
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-4 10:22:27 | 显示全部楼层
回复【4楼】cdshkf:
---------------------------------
请问大神,例程是stm32F103RB的,对哪些部分修改,让它适用于F107VC呢?
回复 支持 反对

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-4 10:45:38 | 显示全部楼层
回复【5楼】chenwangchris:
---------------------------------
我刚在那个帖子里回复你,107是互联型的,由于驱动以太网和USB OTG外设接口需要25MHz或者50MHz的时钟输出,所以STM32F107需要用25MHz的晶振,而103多是8MHz的晶振,移植程序的时候注意将时钟配置修改一下应该就问题不大了。具体修改有大概三个地方:1、stm32f103.h里的一个宏 #define HSE_VALUE    ((uint32_t)8000000) 改成 #define HSE_VALUE    ((uint32_t)25000000)。 2、keil里 option-target标签页下  Xtal处填入25.0 。3、system_stm32f10x.c下将PLL时钟修改一下,这个相对比较麻烦,103的一般是8MHz的晶振,配置成72MHz要9倍频,而107的25MHz,配置成72MHz要先5分频,然后8倍频,然后5分频,然后9倍频到72MHz。
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-4 10:54:11 | 显示全部楼层
回复【6楼】cdshkf:
---------------------------------
万分谢谢,我试试看
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-3
在线时间
0 小时
 楼主| 发表于 2014-5-8 09:36:04 | 显示全部楼层
回复【4楼】cdshkf:
---------------------------------
多谢,我后来发现了就是这个问题……真是郁闷,我是在一个参考手册上看到的原先的赋值,后来看到别人的赋值和我不一样……
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-9-22 10:33:30 | 显示全部楼层
回复【6楼】cdshkf:
---------------------------------
你好,没有五分频这个系数吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-1 01:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表