智能车制作

 找回密码
 注册

扫一扫,访问微社区

STM32论坛
查看: 8525|回复: 4
打印 上一主题 下一主题

STM32F4演示例程之DMA模式下ADC转换

[复制链接]

489

主题

1691

帖子

1

精华

管理员

网站创始人&站长

Rank: 11Rank: 11Rank: 11Rank: 11

积分
85949

特殊贡献奖章资源大师奖章论坛骨干奖章推广达人奖章优秀版主奖章热心会员奖章论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

QQ
威望
57001
贡献
17378
兑换币
13146
注册时间
2007-6-8
在线时间
5785 小时
跳转到指定楼层
1#
发表于 2012-5-20 23:46:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

/************************************
    标题:ADC
    软件平台:IAR for ARM6.21
    硬件平台:stm32f4-discovery
    主频:168M
    author:小船
    data:2012-02-16
*************************************/
#include <stm32f4xx.h>
#include "MyDebugger.h"
__IO uint16_t ADCConvertedVault[10000];
char TXbuffer[] = "PC1输入电压为:x.xxxV\n\r";
void ADC_IO_Config(void);
void ADC_DMA_Config(void);
void ADC_Common_Config(void);
void ADC3_IN11_Config(void);
void ADC2_IN11_Config(void);
void ADC1_IN11_Config(void);
void main ()
{   
  SCB->AIRCR = 0x05AF0000 | 0x400;  //中断优先级分组 抢占:响应=3:1

  ADC_IO_Config();
  ADC_DMA_Config();
  
  ADC_Common_Config();
  
  ADC3_IN11_Config();
  ADC2_IN11_Config();
  ADC1_IN11_Config();
  
  ADC3->CR2 |= (1<<0);   //开启ADC3转换
  ADC2->CR2 |= (1<<0);   //开启ADC2转换
  ADC1->CR2 |= (1<<0);   //开启ADC1转换
   
  ADC1->CR2 |= (1<<30); //触发转换开始
  
  MyDebugger_Init();
  while(1)
  {
  };
}
void ADC_Common_Config(void)
{
  RCC->APB2ENR |= ( (1<<8) | (1<<9) | (1<<10) ); //使能ADC时钟
  ADC->CCR &= 0x00000000;
  
  /*
  DMA模式1
  最后一次ADC转换后发出dma请求
  交错模式
  2次采样之间的延迟5个周期
  */
  ADC->CCR |= ( 0x00004000 | (1<<13) | 0x00000017 | 0x00000000);
   
}
/***ADC1设置***/
void ADC1_IN11_Config(void)
{   
  ADC1->SQR1 = 0x00000000;//转换一个通道
  ADC1->SQR3 = 0x0000000B;//第一个通道为ADC1_in11
  ADC1->CR1 &= 0x00000000;
  ADC1->CR2 &= 0x00000000;  
  ADC1->CR2 |= (1<<1);  //连续转换
  ADC1->CR2 |= (1<<9); //最后一次ADC转换后发出dma请求
  ADC1->CR2 |= (1<<8);//ADC dma发送模式使能
}
/***ADC2设置***/
void ADC2_IN11_Config(void)
{   
  ADC2->SQR1 = 0x00000000;//转换一个通道
  ADC2->SQR3 = 0x0000000B;//第一个通道为ADC1_in11
  ADC2->CR1 &= 0x00000000;
  ADC2->CR2 &= 0x00000000;  
  ADC2->CR2 |= (1<<1);  //连续转换
  ADC2->CR2 |= (1<<9); //最后一次ADC转换后发出dma请求
}
/***ADC3设置***/
void ADC3_IN11_Config(void)
{   
  ADC3->SQR1 = 0x00000000;//转换一个通道
  ADC3->SQR3 = 0x0000000B;//第一个通道为ADC3_in11
  ADC3->CR1 &= 0x00000000;
  ADC3->CR2 &= 0x00000000;  
  ADC3->CR2 |= (1<<1);  //连续转换
  ADC3->CR2 |= (1<<9); //最后一次ADC转换后发出dma请求
}
/***GPIO设置***/
void ADC_IO_Config(void)
{
  RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟
  GPIOC->MODER &= 0xfffffff3;//PC1模拟模式
  GPIOC->MODER |= 0x0000000C;
  GPIOC->PUPDR &= 0xfffffff3;//无上拉无下拉  
}
/***DMA设置***/
void ADC_DMA_Config(void)
{   
  RCC->AHB1ENR |= (1<<22); //使能DMA2时钟
  ADC3->CR2 &= ~(1<<8);//ADC3 dma发送模式除能
  DMA2_Stream0->CR &= 0xFFFFFFFE; //除能DMA2_Stream0
  while(DMA2_Stream0->CR & 0x00000001);//确保DMA可以被设置
  DMA2->LIFCR |= 0x0000003D;//传送前清空DMA2_Stream0所有中断标志
  DMA2_Stream0->PAR = (uint32_t)&ADC->CDR;//设置外设地址
  DMA2_Stream0->M0AR = (uint32_t)ADCConvertedVault; //设置内存地址
  DMA2_Stream0->CR |= 0x0002800;//16位数据
  DMA2_Stream0->NDTR = 10000; //设置dma传输数据的数量
  /*
    设置dma2通道0,即ADC1
    优先级Medium
    传输方向外设到内存
    内存递增模式
    循环模式
    传输完成中断
  */
  DMA2_Stream0->CR |= ( 0x00000000 | 0x00010000 | 0x0
                        | (1<<10) | (1<<8) | (1<<4) );
  
  NVIC->IP[56] = 0xB0;
  NVIC->ISER[1] |= (1<<(56-32));
  
  DMA2_Stream0->CR |= 1; //DMA2数据流0使能
}
void DMA2_Stream0_IRQHandler (void)
{
  uint32_t i;
  uint32_t Average;
  if(DMA2->LISR & 0x00000010)
  {
      DMA2->LIFCR |= 0x00000010;
      for(i = 0; i < 10000; i++)  // 对一万个数据取平均值
        Average += ADCConvertedVault;
      Average *= 3;
      Average /= 40960;
      TXbuffer[14] = ( Average / 1000 ) % 10 + 0x30;//转换成ASCII码
      TXbuffer[16] = ( Average / 100 ) % 10 + 0x30;
      TXbuffer[17] = ( Average / 10 ) % 10 + 0x30;
      TXbuffer[18] = Average % 10 + 0x30;
      MyDebugger_Message(TXbuffer, sizeof(TXbuffer)/sizeof(char));  
  }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

31

主题

1010

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4800

热心会员奖章优秀会员奖章活跃会员奖章论坛元老奖章

威望
3250
贡献
986
兑换币
110
注册时间
2012-2-11
在线时间
282 小时
2#
发表于 2012-5-21 12:51:47 | 只看该作者
沙发,嘿嘿顶,正打算学32 的
回复 支持 反对

使用道具 举报

15

主题

483

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5170
QQ
威望
1635
贡献
3057
兑换币
215
注册时间
2011-4-6
在线时间
239 小时
3#
发表于 2012-5-22 13:19:29 | 只看该作者
顶一个
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
116
威望
94
贡献
22
兑换币
0
注册时间
2012-8-6
在线时间
0 小时
毕业学校
北航
4#
发表于 2012-8-6 14:13:57 | 只看该作者
楼主调试成功没?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

注册会员

Rank: 2

积分
190
威望
124
贡献
54
兑换币
2
注册时间
2012-8-28
在线时间
6 小时
毕业学校
jiangsuruagao
5#
发表于 2012-9-9 11:00:15 | 只看该作者
可以说说DMA普通模式下,DMA关闭后的再次重启吗,我做了好多试验不能成功
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2025-1-12 13:35 , Processed in 0.196724 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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