OpenEdv-开源电子网

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

STM32测试程序 ADC+DMA+串口发送。全代码奉献(操作寄存器)

[复制链接]

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-10-20 14:39:40 | 显示全部楼层 |阅读模式

在参考网站上的例子(那个例子定义的数组为U8,这个很头痛)和自己的努力终于完成了ADC+DMA+串口发送的测试程序。这个在我的项目的用到的。现在和大家分享我的成果。其实这个论坛上也有这样的例子,只是都是不全的,也没有很强的针对性。不过他们已经完成了一些参数的设计,所以值得参考,我自己的程序是针对ADC+DMA+串口发送而设计,对初学者来说会很有帮助。本程序在ALIENTEK MiniSTM32开发板上验证。参考本论坛的资料

#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h"

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

//#define DMA1_MEM_ADD    (u32)ADC_Buf
//#define DMA1_MEM_SIZE    (u32)sizeof(ADC_Buf)
u16 ADC_Buf[512];

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  USART_Initaize(u32 pclk2,u32 bound);
void  Uart1_PutChar(u8 ch);
void Uart1_PutString(u8 *Buf, u8 Len);

//主函数的内容:
int main(void)
{    
 u16 times=0;
 u16 t;
 u32 temp =0;
 u16 adcx;
 u8 table[5];
 u8 *p;
 p= table;
 Stm32_Clock_Init(9);//88M
 delay_init(72);     //延时初始化
 USART_Initaize(72,9600); //设置波特率
 adc_init();
   while (1)
    {
     if(DMA1->ISR&(1<<1)) //传输完成了
  { 
   times++;    
   for(t=0;t<5;t++)
   {   
    temp = temp + ADC_Buf[t];
   }
   temp = temp /5;
   adcx=temp*330/4096;;    
   table[0]=adcx / 100 + 0x30;
   table[1]='.';
   table[2]=adcx % 100/10 + 0x30;
   table[3]= adcx %10 + 0x30;
   table[4]='V';
   Uart1_PutString(p,5);
   Uart1_PutString("\r\n",2);
   temp =0;
   DMA1->IFCR|=1<<1;
   MYDMA_GOnes(DMA1_Channel1);
  }
                  
    } 
              
 } 
   
void  adc_init(void)
{    
 RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 
 GPIOA->CRL&=0XFFFFFFF0;//PA.0 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&=0xFFF0FFFF;//1个转换在规则序列中  
 ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0
 ADC1->SQR3|=0;    
 ADC1->SMPR2|=0X07;     //通道0的转换时间为:239.5+12.5个ADC时钟周期    
 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); //等待校准结束
 //该位由软件设置以开始校准,并在校准结束时由硬件清除    
 ADC1->CR2|=1<<8;    //开启ADC DMA转换

 MYDMA_Config(DMA1_Channel1);//配置DMA通道1
 MYDMA_Enable(DMA1_Channel1);//开启DMA通道1 
 ADC1->CR2|=1<<0;    //开启AD转换   
}

//获得ADC值
u16 get_adc(void)   
{     
 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->CPAR=ADC1_DR_Address;//DMA1 外设地址 ADC1_DR_Address
 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|=0<<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; //非存储器到存储器模式   
}
//开启 DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
 DMA_CHx->CCR|=1<<0;  //开启DMA传输
}   
//开启一次DMA传输
//单次DMA转换之后,必须把DMA关闭,再次启动,才能实现第二次DMA传输!!!
void MYDMA_GOnes(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传输
}

void  USART_Initaize(u32 pclk2,u32 bound)
{
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB2ENR|=1<<14;  //使能串口时钟
 GPIOA->CRH&=0XFFFFF00F;
 GPIOA->CRH|=0X000008B0;//IO状态设置
   
 RCC->APB2RSTR|=1<<14;   //复位串口1
 RCC->APB2RSTR&=~(1<<14);//停止复位       
 //波特率设置
  USART1->BRR=mantissa; // 波特率设置 
 USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX    //如果使能了接收
 //使能接收中断
 USART1->CR1|=1<<8;    //PE中断使能
 USART1->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级
#endif
}
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++);
 }
}

 

 


 



 

ADC+DMA+串口.rar

483.13 KB, 下载次数: 5283

?成功只是最后一小步的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-16 22:15:01 | 显示全部楼层
回复【10楼】冰是睡着的水:
---------------------------------
有个简单的办法:
#define USART1_DR_Base  0x40013804   
#define ADC1_DR_Address 0x4001244C //0x40012400+0x4C 
可以写成:
&USART1->DR;
&ADC1->DR;
这样就直接获得了地址了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2011-10-13
在线时间
1 小时
发表于 2012-10-10 18:47:48 | 显示全部楼层
回复【36楼】skyliuhuan:
---------------------------------
应该不会啊,就是设置这两条啊 !
 
 GPIOA->CRL&=0XFFFFFF0F;//PA.1 anolog输入    
 ADC1->SQR3&=0XFFFFFFE0;//规则序列1=通道0 
 ADC1->SQR3|=3;     
 ADC1->SMPR2|=0X00;     //通道0的转换时间为:239.5+12.5个ADC时钟周期     

回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

2

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2011-10-17
在线时间
0 小时
发表于 2011-11-8 10:29:29 | 显示全部楼层
  感谢楼主,收藏了
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2011-8-23
在线时间
0 小时
发表于 2011-11-8 16:45:40 | 显示全部楼层
楼主很给力啊,很感谢楼主,学习中!!!!
回复 支持 反对

使用道具 举报

267

主题

376

帖子

0

精华

QQ游客

积分
1079
金钱
1079
注册时间
2012-2-23
在线时间
12 小时
发表于 2012-2-23 17:24:22 | 显示全部楼层
   请问为什么这个程序每次下到板子上要复位后才能正常工作呢?
   我把 “DMA_CHx->CCR|=0<<5;  //非循环模式” 改成 “DMA_CHx->CCR|=1<<5;  //循环模式 ”后,在主函数中注释掉最后一句“MYDMA_GOnes(DMA1_Channel1);”,程序也正常运行!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-2-27
在线时间
0 小时
发表于 2012-2-27 11:31:50 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
u16 get_adc(void)在哪里被调用了????
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2012-2-27
在线时间
0 小时
发表于 2012-2-27 11:32:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
u16 get_adc(void)在哪里被调用了????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-27 12:45:47 | 显示全部楼层
ctrl+f
回复 支持 反对

使用道具 举报

2

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2011-12-28
在线时间
59 小时
发表于 2012-2-28 11:28:40 | 显示全部楼层
好资料啊!谢谢啦!
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-16 21:33:48 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
#define USART1_DR_Base  0x40013804  
#define ADC1_DR_Address 0x4001244C //0x40012400+0x4C
怎样得到外设地址的?、我找了很久都没有找到。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-16 22:17:23 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子哥在程序里面怎么找不到,算不到0x4001244C //0x40012400+0x4C    0x40013804这些值的,还有程序怎样到电压值的
回复【楼主位】suqingxiao: 
--------------------------------- 
u16 get_adc(void)在哪里被调用了????
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-16 22:26:17 | 显示全部楼层
这个查找一下就可以了
如果找不到,说明没有用到这个函数.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2196
金钱
2196
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-3-16 23:05:24 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-17 00:35:51 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
回复【13楼】正点原子:
---------------------------------
外设地址我找到了,但是没有用到u16 get_adc(void)程序怎么会得到电压值,难道在
   for(t=0;t<5;t++)
   {   
     temp = temp + ADC_Buf[t];
   } 
   temp = temp /5;
看了很久看不懂这个地方。。请教原子哥。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-17 02:05:39 | 显示全部楼层
回复【15楼】冰是睡着的水:
---------------------------------
用了DMA...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-17 10:25:33 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------嗯嗯,谢谢原子哥。原子哥就是大方,昨天的三个问题都解决了。。顶这个论坛。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-17 11:14:32 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-17 22:07:55 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
for(t=0;t<5;t++)
   {   
    temp = temp + ADC_Buf[t];
   } 
   temp = temp /5;
上面为什么要算5次在起平均值,,
   adcx=temp*330/4096;;    
   table[0]=adcx / 100 + 0x30;
   table[1]='.';
   table[2]=adcx % 100/10 + 0x30;
  table[2]= adcx %10 + 0x30;
   table[4]='V';
还有table[0] table[2]  table[2] 后面要加上0x30   难道是DMA_CH1->CPAR  地址偏移0x30
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-18 00:59:03 | 显示全部楼层
回复【19楼】冰是睡着的水:
---------------------------------
1,均值滤波.
2,ASCII的0的内码,就是0X30.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-18 01:29:15 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
   for(t=0;t<5;t++)
   {   
    temp = temp + ADC_Buf[t];
   } 
   temp = temp /5;
1.可以理解减少误差是不,如果把t<5改为t<100,那误差就极少了,是不?
2.接上面,但是在这样会不会影响DMA传输的问题?
3.我把0x30不要掉,串口就不会显示数字了,为什么要加上那个值,难道要让上位机识别?
最后3个问题了,原子哥请请教哦。。
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-18 01:43:15 | 显示全部楼层
回复【21楼】冰是睡着的水:
---------------------------------
1,你只采集了5个数据,算一百次无用的.
2,问题同上,采样越多,当然越慢...
3,肯定了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-20 20:08:24 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
原子哥,怎么我想用液晶显示,想显示简单的字符串都是不行,都是白屏,是不是DMA的影响啊。
 delay_init(72);     //延时初始化  
 LCD_Init();
 delay_ms(50);
 OINT_COLOR=RED;
// LCD_Clear(BLUE);
 LCD_ShowString(60,50,"woshizhanghui");
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-20 22:08:32 | 显示全部楼层
回复【23楼】冰是睡着的水:
---------------------------------
直接用我们的例子试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

57

主题

431

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
883
金钱
883
注册时间
2011-12-25
在线时间
12 小时
发表于 2012-3-20 23:23:25 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
试了…可以显示。像我上面显示字符不能显示,显示用的函数都是调用原子哥的。
很喜爱电子行业
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-21 00:15:38 | 显示全部楼层
你这个应该是可以显示的哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-2-23
在线时间
19 小时
发表于 2012-4-10 22:44:36 | 显示全部楼层

 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); //等待校准结束 
 //该位由软件设置以开始校准,并在校准结束时由硬件清除     
 ADC1->CR2|=1<<8;    //开启ADC DMA转换

 MYDMA_Config(DMA1_Channel1);//配置DMA通道1 
 MYDMA_Enable(DMA1_Channel1);//开启DMA通道1  
 ADC1->CR2|=1<<0;    //开启AD转换    

}
问题1 为什么要2次开启AD转换器去掉第二次则不行?


问题2 根据上表,此次使用了ADC1和USART1,为什么只是用了DMA1的通道1为什么不是通道4(还是2和4都要用到)?
问题3 使用了串口一为什么不用使能串口的DMA发送  (USART1->CR3=1<<7)?

心之所向,无惧无悔。
回复 支持 反对

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-2-23
在线时间
19 小时
发表于 2012-4-10 22:46:18 | 显示全部楼层
问题2 根据上表,此次使用了ADC1和USART1,为什么只是用了DMA1的通道1为什么不是通道4(还是1和4都要用到)?
(上面问题2有错!这个为准)
心之所向,无惧无悔。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-11 00:58:12 | 显示全部楼层
回复【28楼】一剑飘飘:
---------------------------------
1,为什么你不自己试试?
2,因为是ADC1的DMA,而不是串口的DMA.
3,为什么使用了串口就一定要使用DMA?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-5-1
在线时间
0 小时
发表于 2012-5-7 17:22:05 | 显示全部楼层
谢谢楼主分享!!!很好很强大
回复 支持 反对

使用道具 举报

0

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2012-4-25
在线时间
10 小时
发表于 2012-9-20 15:28:16 | 显示全部楼层
MARK。。。。。。。。。
QQ:747764222?可接项目 和 毕设等
? 可以出售各种LED灯,以及控制方案。
? ? LED灯已经出口到全球各地,控制方案也很有经验。
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2012-9-19
在线时间
0 小时
发表于 2012-9-20 17:01:26 | 显示全部楼层
 我想请问一下,有没有按照STM32库函数编写的,ADC+DMA+串口发送的程序啊!
回复 支持 反对

使用道具 举报

3

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2012-5-17
在线时间
3 小时
发表于 2012-9-21 12:24:18 | 显示全部楼层
最好加点滤波程序,否则adc转出的电压跳动很大
回复 支持 反对

使用道具 举报

7

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2012-9-25
在线时间
3 小时
发表于 2012-9-29 00:58:27 | 显示全部楼层
希望论坛越来越好,感谢楼主
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2011-10-13
在线时间
1 小时
发表于 2012-10-5 15:13:38 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
楼主,为什么我换了一个通道1,就不行了!
回复 支持 反对

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2011-10-13
在线时间
1 小时
发表于 2012-10-5 15:52:29 | 显示全部楼层
回复【29楼】正点原子:
---------------------------------
原子哥,我那个问题解决了,可以传输不丢数据了,我今天用的ADC1的通道0,可是换成通道1,传输的还是通道0的数据,这是怎么回事?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

96

主题

762

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1228
金钱
1228
注册时间
2012-10-19
在线时间
15 小时
发表于 2013-1-6 09:07:22 | 显示全部楼层
回复【21楼】冰是睡着的水:
---------------------------------
回复【22楼】正点原子:
---------------------------------
for(t=0;t<5;t++)
   {   
    temp = temp + ADC_Buf[t];
   }
采集5次是怎么看的呢?
难道是DMA_CHx->CNDTR=(u32)sizeof(ADC_Buf) ;  //DMA1,传输数据量 ?
那怎么计算的呢?谢谢原子哥,无意中看见这帖子,就研究了下

回复 支持 反对

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2011-2-17
在线时间
7 小时
发表于 2013-1-6 09:36:28 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2012-11-22
在线时间
1 小时
发表于 2013-1-6 22:44:00 | 显示全部楼层
我刚好需要这个,收下了作参考!太感谢楼主了!!
回复 支持 反对

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-7-8
在线时间
6 小时
发表于 2013-7-8 15:47:14 | 显示全部楼层
太感谢啦!!!
QQ:909428831
回复 支持 反对

使用道具 举报

8

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2013-7-13
在线时间
24 小时
发表于 2013-7-20 20:39:06 | 显示全部楼层
学习中!
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-7-20 22:49:38 | 显示全部楼层
收藏
回复 支持 反对

使用道具 举报

14

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2013-7-14
在线时间
0 小时
发表于 2013-7-21 17:57:23 | 显示全部楼层
回复【楼主位】suqingxiao:
--------------------------------为什么我的显示结果不是以字符串的形式,在调试助手里面,而只能是ASCII或16进制显示
回复 支持 反对

使用道具 举报

7

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2011-9-3
在线时间
4 小时
发表于 2013-7-23 13:19:37 | 显示全部楼层
讨论很好的帖子,顶
http://shop60782849.taobao.com/显示屏专卖
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-7-23 15:19:54 | 显示全部楼层
很给力啊。
回复 支持 反对

使用道具 举报

7

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-8-3
在线时间
0 小时
发表于 2013-8-3 21:44:00 | 显示全部楼层
hao
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2013-3-13
在线时间
0 小时
发表于 2013-8-12 16:04:45 | 显示全部楼层
回复【27楼】一剑飘飘:
---------------------------------与26楼的疑问一样,不理解啊
逝者如斯夫不舍昼夜
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2013-3-13
在线时间
0 小时
发表于 2013-8-12 16:15:05 | 显示全部楼层
回复【49楼】624668529:
---------------------------------
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
#include "beep.h"    
#include "key.h"    
#include "exti.h"    
#include "wdg.h"   
#include "timer.h"    
#include "tpad.h"
#include "oled.h"    
#include "lcd.h"
#include "usmart.h"
#include "rtc.h"    
#include "wkup.h"
#include "adc.h"
#include "dma.h"   
//ALIENTEK战舰STM32开发板实验17
//ADC 实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司   
#define ADC1_DR_Address 0x4001244C //0x40012400+0x4C
u16 ADC_Buf[512];  
int main(void)
{
u32 adcx=0;
u16 t;
u16 times=0;
u16 a;
float temp;
   Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600);   //串口初始化为9600
delay_init(72);       //延时初始化 
LED_Init();    //初始化与LED连接的硬件接口
  LCD_Init();     //初始化LCD
usmart_dev.init(72); //初始化USMART

POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");       
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:0.000V");
 
Adc_Init();    //ADC初始化 
a=(u16)sizeof(ADC_Buf) ; 
MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)ADC_Buf,a);//DMA1通道4,外设为串口1,存储器为SendBuff,长度5168.  
MYDMA_Enable(DMA1_Channel1);  
ADC1->CR2|=1<<0;    //开启AD转换
ADC1->CR2|=1<<22;       //启动规则转换通道  

// POINT_COLOR=RED;//设置字体为红色 
// LCD_ShowString(60,50,200,16,16,"WarShip STM32");
// LCD_ShowString(60,70,200,16,16,"ADC TEST");
// LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
// LCD_ShowString(60,110,200,16,16,"2013/6/19");
//显示提示信息
      
while(1)
{
if(DMA1->ISR&(1<<1)) //传输完成了 
{  
times++;   
for(t=0;t<5;t++)
{
adcx = adcx + ADC_Buf[t];

adcx = adcx /5;
LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值
temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
temp-=adcx;
temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80);
//adcx =0;

DMA1->IFCR|=1<<1;
MYDMA_GOnes(DMA1_Channel1);



}
}
逝者如斯夫不舍昼夜
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 04:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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