stm32f407的ad问题

[复制链接]
 楼主| chinanet 发表于 2013-10-9 20:17 | 显示全部楼层 |阅读模式
请问各位大人们,stm32f4系列怎么用dma和ad做到多路采集?现在参考网上的程序做到了单路的采集,要如何修改呢?求各位大神们指点,小白我感激不尽。

  1. void ADC3_IN11_Config(void)
  2. {
  3.     /***GPIO设置***/
  4.   RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟
  5.   GPIOC->MODER &= 0xfffffff3;//PC1模拟模式
  6.   GPIOC->MODER |= 0x0000000C;

  7.   GPIOC->PUPDR &= 0xfffffff3;//无上拉无下拉   

  8.   /***DMA设置***/
  9.   RCC->AHB1ENR |= (1<<22); //使能DMA2时钟
  10.   ADC3->CR2 &= ~(1<<8);//ADC3 dma发送模式除能
  11.   DMA2_Stream0->CR &= 0xFFFFFFFE; //除能DMA2_Stream0
  12.   while(DMA2_Stream0->CR & 0x00000001);//确保DMA可以被设置
  13.   DMA2->LIFCR |= 0x0000003D;//传送前清空DMA1_Stream5所有中断标志
  14.   DMA2_Stream0->PAR = (uint32_t)&ADC3->DR;//设置外设地址
  15.   DMA2_Stream0->M0AR = (uint32_t)ADC3ConvertedVault; //设置内存地址
  16.   DMA2_Stream0->CR |= 0x0002800;//16位数据
  17.   DMA2_Stream0->NDTR = 10000; //设置dma传输数据的数量
  18.   /*
  19.     设置dma2通道2,即ADC3
  20.     优先级Medium
  21.     传输方向外设到内存
  22.     内存递增模式
  23.     循环模式
  24.     传输完成中断
  25.   */
  26.   DMA2_Stream0->CR |= ( 0x04000000 | 0x00010000 | 0x0
  27.                         | (1<<10) | (1<<8) | (1<<4) );
  28.   
  29.   NVIC->IP[56] = 0xB0;
  30.   NVIC->ISER[1] |= (1<<(56-32));
  31.   
  32.   DMA2_Stream0->CR |= 1; //DMA2数据流0使能
  33.   
  34.   /***ADC3设置***/
  35.   RCC->APB2ENR |= (1<<10); //使能ADC3时钟
  36.   ADC3->SQR1 = 0x00000000;//转换一个通道
  37.   ADC3->SQR3 = 0x0000000B;//第一个通道为ADC3_in11
  38.   ADC3->CR1 &= 0x00000000;
  39.   ADC3->CR2 &= 0x00000000;  
  40.   ADC3->CR2 |= (1<<1);  //连续转换
  41.   ADC3->CR2 |= (1<<9); //最后一次ADC转换后发出dma请求
  42.   ADC3->CR2 |= (1<<0);   //开启AD转换
  43.   
  44.   ADC3->CR2 |= (1<<8);//ADC dma发送模式使能
  45.   
  46.   ADC3->CR2 |= (1<<30); //规则通道转换开始
  47. }

  48. void DMA2_Stream0_IRQHandler (void)
  49. {
  50.   uint32_t i;
  51.   uint32_t Average = 0;
  52.   if(DMA2->LISR & 0x00000010)
  53.   {
  54.       DMA2->LIFCR |= 0x00000010;
  55.       for(i = 0; i < 10000; i++)  // 对一万个数据取平均值
  56.         Average += ADC3ConvertedVault[i];
  57.       Average *= 3.3;
  58.       Average /= 40950;
  59.       TXbuffer[0] = ( Average / 1000 ) % 10 + 0x30;//转换成ASCII码
  60.       TXbuffer[2] = ( Average / 100 ) % 10 + 0x30;
  61.       TXbuffer[3] = ( Average / 10 ) % 10 + 0x30;
  62.       TXbuffer[4] = Average % 10 + 0x30;
  63.                         LCD_DispStr(100, 100, TXbuffer, &tFont);
  64.   }
  65. }
airwill 发表于 2013-10-10 07:01 | 显示全部楼层
采用规则采样就可以了, 具体地可以找个例程。
 楼主| chinanet 发表于 2013-10-15 21:30 | 显示全部楼层
本帖最后由 chinanet 于 2013-10-15 22:16 编辑

谢谢斑竹,解决了!
杨开路 发表于 2014-4-17 16:22 | 显示全部楼层
楼主, ADC转化除了应用DMA的中断, ADC自己有没有转化的中断库函数???  也就是ADC中断??
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部