你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用STM32F207的DMA+DAC+TIM6输出正玄波有问题,请大神帮忙解决...

[复制链接]
风905067 提问时间:2017-5-25 17:27 /
请高手帮我看看,我想用STM32F207的DMA+DAC+TIM6输出正玄波,现在遇到问题,不知道哪里不对,总是没有预期结果出来。有知道的请加我微信:18123784178,谢谢。代码如下:



#define                DAC1_DMA_ADDR                                                        0x40007408     //这个是DMA初始化要用的外设地址。是DAC_DHR12R1的地址


以下数组为余弦函数的数据 ,标题写的正玄波,不严谨,这里关系不大。

uc32 DAC_cosTAB[] = {
  4000        ,3998        ,3990        ,3978        ,3962        ,3940        ,3914        ,3883        ,
  3848        ,3808        ,3764        ,3715        ,3663        ,3606        ,3546        ,3482        ,
        3414        ,3343        ,3269        ,3191        ,3111        ,3028        ,2943        ,2855        ,
        2765        ,2674        ,2581        ,2486        ,2390        ,2293        ,2196        ,2098        ,
        2000        ,1902        ,1804        ,1707        ,1610        ,1514        ,1419        ,1326        ,
        1235        ,1145        ,1057        ,972        ,889        , 809        ,731        ,657        ,
         586        ,518        ,454        ,394        ,337        ,285        , 236        ,192        ,
         152        ,117        , 86        ,  60        , 38        , 22        , 10        ,         2        ,
           0        ,  2        , 10        , 22        , 38        , 60        , 86        ,117        ,
         152        ,192        ,236        ,285        ,337        ,394        ,454        ,518        ,
   586        ,657        ,731        ,809        ,889        ,972        ,1057        ,1145        ,
        1235        ,1326        ,1419        ,1514        ,1610        ,1707        ,1804        ,1902        ,
        2000        ,2098        ,2196        ,2293        ,2390        ,2486        ,2581        ,2674        ,
        2765        ,2855        ,2943        ,3028        ,3111        ,3191        ,3269        ,3343        ,
        3414        ,3482        ,3546        ,3606        ,3663        ,3715        ,3764        ,3808        ,
        3848        ,3883        ,3914        ,3940        ,3962        ,3978        ,3990        ,3998        ,
        4000       
};  


说明:管脚时钟,TIM时钟,DMA时钟都已经开了。

引脚配置代码段如下:
GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;       
  GPIO_Init(GPIOA, &GPIO_InitStructure);       



DMA的配置如下:
void DAC_DMA_Config(void)
{
  DMA_InitTypeDef         DMA_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
  DMA_DeInit(DMA1_Stream5);

  //DMA_StructInit( &DMA_InitStructure);      
       
  DMA_InitStructure.DMA_Channel = DMA_Channel_7;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DMA_ADDR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)DAC_cosTAB;
       
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = 128;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;// DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;       
       
  DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
       
  DMA_Init(DMA1_Stream5, &DMA_InitStructure);
  DMA_Cmd(DMA1_Stream5, ENABLE);
        //DMA_ITConfig(DMA1_Stream5, DMA_IT_TC|DMA_IT_TE,ENABLE);
}
DAC的配置如下:

void DAC_Configuration(void)
{  
        DAC_InitTypeDef DAC_InitStructure;
  DAC_DeInit();  
        DAC_StructInit(&DAC_InitStructure);
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//²»²úÉú²¨ÐÎ
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //²»Ê¹ÄÜÊä³ö»º´æ
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//DAC´¥·¢Æ÷Ϊ¶¨Ê±Æ÷6´¥·¢

        DAC_Init(DAC_Channel_1, &DAC_InitStructure);      //
        DAC_Cmd(DAC_Channel_1, ENABLE);                   //
        DAC_DMACmd(DAC_Channel_1, ENABLE);                //
               
}
TIM6的配置如下:

///////////////////////////    TIM6用作DAC的触发   配置如下    //////////////////////////////////////////////////////////////////////////////
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);     
TIM_TimeBaseStructure.TIM_Period = 50;                                     //
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;         
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;      
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);      
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);       
TIM_Cmd(TIM6, ENABLE);  
/////////////////////////////////////////////////////////////////////////////////////////////////////////


请高手帮我看看,我想用STM32F207的DMA+DAC+TIM6输出正玄波,现在遇到问题,不知道哪里不对,总是没有预期结果出来。有知道的请加我微信:18123784178,谢谢。



收藏 评论17 发布时间:2017-5-25 17:27

举报

17个回答
风905067 回答时间:2017-5-27 11:14:48
问题解决了,其实我的那个程序是可以的,就是一个小地方没有搞对,谢谢你的帮助。我知道问题在哪里了 。谢谢!!!谢谢谢!!!!!!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

wambob 回答时间:2017-5-25 18:01:04
本帖最后由 wambob 于 2017-5-25 18:49 编辑

你是用CubeMX建的工程吗
另外你这个余弦波数组是怎么的算出来的。

主函数中开启定时器,定时器预装值要跟你的余弦波采样率相匹配,这样DAC才能还原出你的波形。开启DMA传输,设置DMA传输完成回调函数,在循环中检测标志,检测到标志时,重置数组指针。
peter001 回答时间:2017-5-25 18:27:23
现在出来的波形是什么
wenyangzeng 回答时间:2017-5-25 20:15:11
楼主使能了DMA中断,但未见到DMA中断处理函数,程序会跑飞的。
风905067 回答时间:2017-5-26 08:17:25
wambob 发表于 2017-5-25 18:01
你是用CubeMX建的工程吗
另外你这个余弦波数组是怎么的算出来的。

我是用的keil建工程的,数组数据没有问题的,我在单独DAC的情况下,可以看到标准的余弦波。这个数组决定的波形的幅值,跟频率没有关系,都是这些数据,我在单DAC的情况下,能输出5K以下的任意频率余弦波型。后面的DMA的问题,我再仔细看看,DMA我不太会用。谢谢,谢谢 ,谢谢
风905067 回答时间:2017-5-26 08:19:40
peter001 发表于 2017-5-25 18:27
现在出来的波形是什么

现在出来的波形是不对的,幅值和波形都不对,就是波浪线,像是三角波 和正玄波的还有很多很多的毛刺。还不受控,就是改变数据,波形也是那个样子。
风905067 回答时间:2017-5-26 08:21:10
wenyangzeng 发表于 2017-5-25 20:15
楼主使能了DMA中断,但未见到DMA中断处理函数,程序会跑飞的。

中断函数有的,忘记贴上来了,只是中断函数里没有任何处理。程序应该没有跑飞的。函数如下:
void DMA1_Stream5_IRQHandler(void)
{
        if( DMA1->HISR & ( DMA_FLAG_TCIF7|DMA_FLAG_HTIF7|DMA_FLAG_TEIF7|DMA_FLAG_DMEIF7|DMA_FLAG_FEIF7 ) )
        {
                DMA1->HIFCR = (uint32_t)((DMA_FLAG_TCIF7|DMA_FLAG_HTIF7|DMA_FLAG_TEIF7|DMA_FLAG_DMEIF7|DMA_FLAG_FEIF7) & 0x0F7D0F7D );

        }
}
风905067 回答时间:2017-5-26 08:45:13
wambob 发表于 2017-5-25 18:01
你是用CubeMX建的工程吗
另外你这个余弦波数组是怎么的算出来的。

DMA我用的是循环模式,还需要重置数组指针吗?
风905067 回答时间:2017-5-26 10:16:14
有大神来帮帮我吗?
wambob 回答时间:2017-5-26 14:24:43
风905067 发表于 2017-5-26 08:45
DMA我用的是循环模式,还需要重置数组指针吗?

DMA循环只是说DMA循环,不没有指定DMA的数据地址。数据DMA到DAC完了后,需要重置数据指针
12下一页
关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版