OpenEdv-开源电子网

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

用STM32传递ADC的值莫名其妙的丢了8位

[复制链接]

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-10-24
在线时间
0 小时
发表于 2013-10-24 12:57:53 | 显示全部楼层 |阅读模式

不知怎么搞得数据就是丢了八位,用单步调试显示正常的数据是0xfff,而DMA传回的却是0Xff,调了很久都没跳出,大伙帮忙看下啊


#include "stm32f10x.h"
#include "delay.h"
#include "lcd.h"
//定义下面的两个值进行对照比较的
unsigned int AD_Data;//DMA传回的值
unsigned int DATT;//直接读ADC寄存器的值
void GPIO_Configuration(void) //GPIO配置函数
{
 GPIO_InitTypeDef GPIO_Struct;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOD,ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//打开DMA的时钟,使能DMA传输
 
 GPIO_Struct.GPIO_Pin=GPIO_Pin_All;
 GPIO_Struct.GPIO_Speed=GPIO_Speed_50MHz;
 GPIO_Struct.GPIO_Mode=GPIO_Mode_Out_PP;
 GPIO_Init(GPIOE,&GPIO_Struct);
 GPIO_Init(GPIOD,&GPIO_Struct);

 GPIO_Struct.GPIO_Pin=GPIO_Pin_1;
 GPIO_Struct.GPIO_Mode=GPIO_Mode_AIN;
 GPIO_Init(GPIOA,&GPIO_Struct);
}
void ADC_Configuration(void) //ADC配置函数
{
 ADC_InitTypeDef ADC_Structure;

 ADC_Structure.ADC_Mode=ADC_Mode_Independent;//独立模式
 ADC_Structure.ADC_ScanConvMode=DISABLE;//单通道模式
 ADC_Structure.ADC_ContinuousConvMode=ENABLE;//循环转换
 ADC_Structure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//由软件促发
 ADC_Structure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
 ADC_Structure.ADC_NbrOfChannel=1;//通道数

 ADC_Init(ADC1, &ADC_Structure);
 
 RCC_ADCCLKConfig(RCC_PCLK2_Div6);//六分频
 
 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道1,规则采样顺序值为1,采样时间为239.5周期
 ADC_DMACmd(ADC1,ENABLE);//使能ADC的DMA请求
 ADC_Cmd(ADC1,ENABLE);//使能ADC1
 ADC_ResetCalibration(ADC1);//使能复位校准,重置ADC1的校准寄存器
 while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束,获取ADC1重置校准寄存器的状态,设置状态则等待
 ADC_StartCalibration(ADC1); //开始ADC的校准状态
 while(ADC_GetCalibrationStatus(ADC1));//等待校准完成         
 ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能 
}
void DMA_Configuration(void) //DMA配置函数
{
 DMA_InitTypeDef DMA_Stucture;
 DMA_DeInit(DMA1_Channel1);//设置缺省值
 DMA_Stucture.DMA_PeripheralBaseAddr=0x4001244C;//外设基地址ADC1
 DMA_Stucture.DMA_MemoryBaseAddr=(u32)&AD_Data;//内存地址
 DMA_Stucture.DMA_DIR=DMA_DIR_PeripheralSRC;
 DMA_Stucture.DMA_BufferSize=1;
 DMA_Stucture.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设地址不变
 DMA_Stucture.DMA_MemoryInc=DMA_PeripheralInc_Disable;//内存地址不变
 DMA_Stucture.DMA_PeripheralDataSize=DMA_MemoryDataSize_HalfWord; //外设数据为16位
 DMA_Stucture.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//从外设读到内存的数据的长度为两个字节16位
 DMA_Stucture.DMA_Mode=DMA_Mode_Circular;
 DMA_Stucture.DMA_Priority=DMA_Priority_High;//通道1DMA优先级为高等
 DMA_Stucture.DMA_M2M=DMA_M2M_Disable;//禁止由内存到内存的数据传输

 DMA_Init(DMA1_Channel1,&DMA_Stucture);
 DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA
}

int main(void)
{
 unsigned int date;
 u8 AD=0;
 u8 str[]="The Voltage is :";
 float temp;
 GPIO_Configuration();
 ADC_Configuration();
 DMA_Configuration();
 
 LCD_Init();   //tft初始化
 LCD_CS_Off;  //打开片选使能 
 Clear_Screen(Black); //清屏


 while(1)
 { 
  while(1)
  {
   if(DMA_GetFlagStatus(DMA1_FLAG_TC1)==SET) //判断通道1传输完成
   {
    DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道1传输完成标志
    break;
   }
  } 
  temp=(float)AD_Data*(3.3/4096);//读用DMA传回的数,也就是AD_Data数值是少了八位
  AD=(int)(temp*10+0.5);
  Draw_ASCII(40,110,(AD/10+48),White,Black);//显示函数
  Draw_ASCII(56,110,(AD%10+48),White,Black);//显示函数
  
  DATT=ADC1->DR;//不用DMA直接读ADC的寄存器,也就是 DATT数值是正确的
  temp=(double)DATT*(3.3/4096);
  AD=(int)(temp*10+0.5);
  Draw_ASCII(40,130,(AD/10+48),White,Black);//显示函数
  Draw_ASCII(56,130,(AD%10+48),White,Black);//显示函数
  delay_ms(300);
 }
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-24 23:56:43 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-10-24
在线时间
0 小时
 楼主| 发表于 2013-10-25 08:56:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
多谢原子哥,我也怀疑只能8位传输。可要怎样才能把12位的ADC值传回去呢?因为DMA返回的都是实时值,移位不好移。困扰一周了
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-10-24
在线时间
0 小时
 楼主| 发表于 2013-10-26 16:06:40 | 显示全部楼层
我以为我的开发板坏了,拿了块战舰的开发板还是一样,泪奔了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 21:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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