OpenEdv-开源电子网

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

STM32 DAC无正弦波波形输出

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
发表于 2012-12-5 16:16:32 | 显示全部楼层 |阅读模式

 在mini开发板上通过DMA DAC 实现正弦波输出,下载程序后用示波器量PA4无任何波形。

程序如下:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define DAC_DHR12RD_Address      0x40007420
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
u16 Sine12bit[32] = {2047 , 2447 , 2831 , 3185 , 3498 , 3750 , 3939 ,4056 , 4095 ,
      4056 , 3939 , 3750 , 3495 , 3185 , 2831 , 2447 , 2047 , 1647,
      1263 , 909  , 599  , 344  , 155  , 38   , 0    , 38   , 155,
      344  , 599  , 909  , 1263 , 1647};
u32 DualSine12bit[32];
u8  Idx = 0;
/* Private function prototypes -----------------------------------------------*/
void GPIO_Config(void);
void TIM6_Config(void);
void DMA_Config(void);
void DAC_Config(void);
void NVIC_Config(void);
/* Private functions ---------------------------------------------------------*/

void  Delay (u32 nCount)
{
  for(; nCount != 0; nCount--);
}


/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
 SystemInit();
 GPIO_Config();
 TIM6_Config();
 DAC_Config();
 DMA_Config();
 NVIC_Config();
    /* Infinite loop */
    while (1)
 {
  GPIO_ResetBits(GPIOA , GPIO_Pin_8);
  Delay(3000000);
  GPIO_SetBits(GPIOA , GPIO_Pin_8);
  Delay(3000000);    
    }
}


void GPIO_Config(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO , ENABLE);
      
 /**
  * LED1 -> PB8 , LED2 -> PB9 , LED3 -> PE0 , LED4 -> PE1
  */ 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);      
}

void TIM6_Config(void)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6 , ENABLE);   
    TIM_TimeBaseStructure.TIM_Period =0x19;   
    TIM_TimeBaseStructure.TIM_Prescaler = 0;   
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

 TIM_ARRPreloadConfig(TIM6 , ENABLE);

    /* TIM6 TRGO selection */
    TIM_SelectOutputTrigger(TIM6 , TIM_TRGOSource_Update);

 TIM_ITConfig(TIM6 , TIM_IT_Update , ENABLE);
}

void DAC_Config(void)
{
 DAC_InitTypeDef DAC_InitStructure;

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC , ENABLE);

   DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
   DAC_InitStructure.DAC_WaveGeneration =DAC_WaveGeneration_None ;  //DAC_WaveGeneration_None
   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
   DAC_Init(DAC_Channel_1, &DAC_InitStructure);
 
 for (Idx = 0; Idx < 32; Idx++)
   {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
   } 
}

void DMA_Config(void)
{
 DMA_InitTypeDef DMA_InitStructure;
 
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
 RCC->AHBENR |= 1<1; //开启DMA2时钟

 Delay(10);
   
   DMA_DeInit(DMA2_Channel3);   
   DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
   DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
   DMA_InitStructure.DMA_BufferSize = 32;  
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);

 DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);
 
 DMA_Cmd(DMA2_Channel3, ENABLE);
  
 DAC_Cmd(DAC_Channel_1, ENABLE);

 DAC_DMACmd(DAC_Channel_1, ENABLE);

 TIM_Cmd(TIM6, ENABLE);
}

void NVIC_Config(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
 
 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
 /* EnableDMA Channel1 Interrupt */
 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel3_IRQn ;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
 
 NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn ;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);  
}

void DMA2_Channel3_IRQHandler(void)
{
 DMA_ClearITPendingBit(DMA2_IT_TC3);
}

void TIM6_IRQHandler(void)
{
 TIM_ClearITPendingBit(TIM6 , TIM_IT_Update);
// DAC_SetChannel1Data(DAC_Align_12b_R , 1600);
}

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

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
 楼主| 发表于 2012-12-5 16:18:56 | 显示全部楼层
 自己顶一下,高手帮忙看看。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
 楼主| 发表于 2012-12-5 16:47:28 | 显示全部楼层
严重怀疑是DMA没有工作,原子大哥或高手帮我找找原因,谢谢了!
回复 支持 反对

使用道具 举报

头像被屏蔽

82

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2011-11-14
在线时间
33 小时
发表于 2012-12-5 17:05:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
 楼主| 发表于 2012-12-5 17:12:13 | 显示全部楼层
 我讲MINI上的STM32F103RB换成STM32F103RC了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

头像被屏蔽

263

主题

455

帖子

1

精华

禁止访问

积分
1212
金钱
1212
注册时间
2011-9-25
在线时间
12 小时
发表于 2012-12-5 19:36:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
 楼主| 发表于 2012-12-6 10:15:36 | 显示全部楼层
我自己动手在mini板上焊接了STM32F103RC芯片,这个是大容量的,有DAC。
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-12-5
在线时间
5 小时
 楼主| 发表于 2012-12-6 14:56:45 | 显示全部楼层
问题的原因是局部变量导致的。
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_WaveGeneration_None;
官方例程是在主程序中初始化DAC的,没有上面的一句程序。
我是将DAC的初始化作为程序调用,也没有上面的一句,仿真的时候,发现局部变量DAC_LFSRUnmask_TriangleAmplitude 是乱的。
初学者的一个教训。供大家参考。
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-12
在线时间
3 小时
发表于 2013-2-28 10:13:39 | 显示全部楼层
回复【9楼】andyheba:
问题的原因是局部变量导致的。 DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_WaveGeneration_None; 官方例程是在主程序中初始化DAC的,没有上面的一句程序。 我是将DAC的初始化作为程序调用,也没有上面的一句,仿真的时候,发现局部变量DAC_LFSRUnmask_TriangleAmplitude 是乱的。 初学者的一个教训。供大家参考。
---------------------------------
楼主你好,我详细看完了你的帖子,我恰好在做DAC模块,对于你8楼的回复,有个错误。
DAC_LFSRUnmask_TriangleAmplitude 和 DAC_WaveGeneration_None不是配套的;
DAC_LFSRUnmask_TriangleAmplitude 是三角波振幅配置,其参数是:

DAC_TriangleAmplitude_4095或者DAC_LFSRUnmask_Bits11_0

DAC_WaveGeneration_None是DAC_WaveGeneration 的配置参数。

同时,感谢因为你的帖子我找到了自己配置时的错误。
我一直以为这个参数DAC_LFSRUnmask_TriangleAmplitude是用来给三角波或者噪声波配置用的,配置正弦波的时候,由于没找到合适的资料是修改别人的例程学习,一直没有添加导致无波形生成。
目前处于stm32学习中,初学者水平,来论坛的目的就是找资料学习。希望遇到高手指点~~~
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-5-29
在线时间
0 小时
发表于 2013-6-14 16:07:33 | 显示全部楼层
http://www.amobbs.com/thread-5512335-1-1.html这里有例程,我已经试验过啦,没有问题,LZ可以改一下!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-7-31
在线时间
0 小时
发表于 2013-8-20 11:41:53 | 显示全部楼层
回复【11楼】yanwuhen620:
---------------------------------
没有阿莫的账号、、、、
除非你是我,才可与我常在。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-14 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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