OpenEdv-开源电子网

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

三路adc采集串口通信,程序如下,为何没有数据打印出来在电脑上。编译结果无误。

[复制链接]

4

主题

7

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-3-21 20:12:40 | 显示全部楼层 |阅读模式
#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"

#define USART1_DR_Base  0x40013804  
#define ADC1_DR_Address 0x4001244C //0x40012400+0x4C 




void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx);//配置DMA1_CHx 
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);//使能DMA1_CHx 
void MYDMA_GOnes(DMA_Channel_TypeDef*DMA_CHx); //执行一次DMA    
void  adc_init(void) ;
void  Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);
  u16 ADC_Buf[3];
//主函数的内容: 


int main(void) 
{     
float temp=0;
    u32 adcx,adcx1,adcx2; 
u8 table[6];
u8 *p;
p= table;
Stm32_Clock_Init(9);//88M 
delay_init(72);     //延时初始化  
uart_init(72,9600); 
adc_init(); 
ADC1->CR2|=1<<8;    //开启ADC DMA转换 

MYDMA_Enable(DMA1_Channel1);//开启DMA通道1 
ADC1->CR2|=1<<0;    //开启AD转换  
  while (1) 
    { 
   if(DMA1->ISR&(1<<1)) //传输完成了 
{  
adcx=ADC_Buf[0];
adcx1=ADC_Buf[1];
adcx2=ADC_Buf[2];
temp=(float)adcx*(3.3/4096);
adcx=temp;
temp-=adcx;
temp*=1000;
table[0]=adcx+0x30;
table[1]='.';
table[2]=(int)temp / 100 + 0x30;
table[3]=(int)temp % 100/10 + 0x30;
table[4]=(int)temp %10 + 0x30;
table[5]='V';
printf("CH10 DATA:");
Uart1_PutString(p,6);

temp=(float)adcx1*(3.3/4096);
adcx1=temp;
temp-=adcx1;
temp*=1000;
table[0]=adcx1+0x30;
table[1]='.';
table[2]=(int)temp / 100 + 0x30;
table[3]=(int)temp % 100/10 + 0x30;
table[4]=(int)temp %10 + 0x30;
table[5]='V';
printf("CH8 DATA:");
Uart1_PutString(p,6);

temp=(float)adcx2*(3.3/4096);
adcx2=temp;
temp-=adcx2;
temp*=1000;
table[0]=adcx2+0x30;
table[1]='.';
table[2]=(int)temp / 100 + 0x30;
table[3]=(int)temp % 100/10 + 0x30;
table[4]=(int)temp %10 + 0x30;
table[5]='V';
printf("CH9 DATA:");
Uart1_PutString(p,6);
Uart1_PutString("\r\n",2);
// DMA1->IFCR|=1<<1;
delay_ms(1000);
// MYDMA_Enable(DMA1_Channel1);;
             
    }  
               
 }  
     void  Uart1_PutChar(u8 ch)
{
USART1->DR = (u8) ch;  
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  
}

void Uart1_PutString(u8 *Buf, u8 Len)
{
u8 i;
for(i= 0; i<Len; i++)
{
Uart1_PutChar(*Buf++);
}
}
void  adc_init(void) 
{     
RCC->APB2ENR|=1<<2;    //使能PORTA口时钟  
GPIOA->CRL&=0XF000FFFF;//PA.4,5,6 anolog输入  
//通道10/11设置   
RCC->APB2ENR|=1<<9;    //ADC1时钟使能 
__nop();
__nop();      
RCC->APB2RSTR|=1<<9;   //ADC1复位 
RCC->APB2RSTR&=~(1<<9);//复位结束   
RCC->CFGR|=3<<14;      //SYSCLK/DIV2=88M/8=11Mhz 得到ADC采样率位43.65Khz    
  
ADC1->CR1&=0XF0FFFF;   //独立工作模式 
ADC1->CR1|=1<<8;       //扫描模式    
ADC1->CR2|=1<<1;       //连续转换模式  
ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制 
ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发 
ADC1->CR2&=~(1<<11);   //右对齐 

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=1<<21;     //3个转换在规则序列中 

// ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0 
// ADC1->SQR3|=10; 
ADC1->SQR3&=0XFFFF8000;//规则序列 通道ch
ADC1->SQR3|=0X0000A50A; //10 8  9 
 
ADC1->SMPR1&=0XFFFFFFF8;     //通道10的转换时间为:239.5+12.5个ADC时钟周期 
ADC1->SMPR1|=7<<0;      //通道0  239.5周期,提高采样时间可以提高精确度 
ADC1->SMPR2&=0X00FFFFFF;     //通道89的转换时间为:239.5+12.5个ADC时钟周期 
ADC1->SMPR2|=0xFFFFFFFF;      //通道89  239.5周期,提高采样时间可以提高精确度 
 
ADC1->CR2|=1<<0;       //开启AD转换器,第一次唤醒AD转换器   
ADC1->CR2|=1<<3;       //使能复位校准   
while(ADC1->CR2&1<<3); //等待校准结束    
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。     
ADC1->CR2|=1<<2;       //开启AD校准     
while(ADC1->CR2&1<<2); //等待校准结束 
//该位由软件设置以开始校准,并在校准结束时由硬件清除     
      
}  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
//设置转换序列    
ADC1->SQR3&=0XFFFFFC00;//规则序列1 通道ch
ADC1->SQR3|=0X0000A50A; //10 8  9      
ADC1->CR2|=1<<22;       //启动规则转换通道 
while(!(ADC1->SR&1<<1));//等待转换结束   
return ADC1->DR; //返回adc值

//DMA1的各通道配置 
//DMA_CHxMA1的通道 参考手册 
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx) 
RCC->AHBENR|=1<<0;//开启DMA1时钟 
__nop();                    //等待 DMA1 时钟稳定
    __nop();                    //经测试最少 2 个 nop
    __nop();
DMA_CHx->CMAR=(u32)ADC_Buf ;   //DMA1,ADC 存储器地址 
DMA_CHx->CNDTR=(u32)sizeof(ADC_Buf) ;  //DMA1,传输数据量 
DMA_CHx->CCR=0X00000000;//复位 
DMA_CHx->CCR|=0<<4;  //从外设器件读数据 
DMA_CHx->CCR|=1<<5;  //循环模式 
DMA_CHx->CCR|=0<<6;  //外设地址非增量模式 
DMA_CHx->CCR|=1<<7;  //存储器增量模式 
DMA_CHx->CCR|=1<<8;  //外设数据宽度为16位 
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位 
DMA_CHx->CCR|=1<<13; //高优先级 
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式    
}   
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx) 
{    
DMA_CHx->CCR&=~(1<<0);  //关闭DMA传输 
DMA_CHx->CNDTR=(u32)sizeof(ADC_Buf) ;  //DMA1,传输数据量 
DMA_CHx->CCR|=1<<0;  //开启DMA传输 

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

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-21 21:29:23 | 显示全部楼层
你打印出来的结果是什么,先看是采样问题还是打印问题
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-13 20:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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