打印
[STM32F1]

STM32F103系列,系统上电复位之后,有关DMA+DAC问题求解

[复制链接]
4450|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
244753440|  楼主 | 2014-10-20 14:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  如题,STM32F103ZET6芯片,编写了关于DAC+DMA程序输出正弦波,系统上电复位之后,程序能够运行,但是程序无法实现DMA数据传输,我在那儿用了一个while循环,所以一直处于等待状态,如果此时我执行按键复位,下次程序可以正常执行。求解   在线等
沙发
想做大牛的小马| | 2014-10-20 15:24 | 只看该作者
使能DMA之前,加一些等待看看呢~

使用特权

评论回复
板凳
244753440|  楼主 | 2014-10-20 15:26 | 只看该作者
也不行  本身是加了等待的  但是就是在上电复位之后  
if(DMA_GetFlagStatus(DMA2_FLAG_TC4)!=RESET) 进行判断,但是始终没有中断产生

使用特权

评论回复
地板
想做大牛的小马| | 2014-10-20 16:01 | 只看该作者
感觉像是初始化部分的问题。。。。

使用特权

评论回复
5
mmuuss586| | 2014-10-20 18:38 | 只看该作者
可以把程序贴上来看看;

使用特权

评论回复
6
smallskiff| | 2014-10-20 20:54 | 只看该作者
多半是程序的问题,你把程序贴出来,上面几位熟悉ST的高手会解答的:D

使用特权

评论回复
7
244753440|  楼主 | 2014-10-21 09:20 | 只看该作者
好的  等一下  昨天下班回去 家里电脑没有程序  今天上班了  现在贴上来 大家帮我看一下
下面的程序是DAC_Channel_2通道使能和引脚初始化
void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef  DAC_InitStructure;

  /* ʹÄÜGPIOAʱÖÓ */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       
       
        /* ʹÄÜDACʱÖÓ */       
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
       
  /* DACµÄGPIOÅäÖã¬Ä£ÄâÊäÈë */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
  /* ÅäÖÃDAC ͨµÀ1 */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T7_TRGO;                                                //ʹÓÃTIM7×÷Ϊ´¥·¢Ô´
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;        //²»Ê¹Óò¨Ðη¢ÉúÆ÷
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;        //²»Ê¹ÓÃDACÊä³ö»º³å

  /* ÅäÖÃDAC ͨµÀ2 */
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);

  /* ʹÄÜͨµÀ2 ÓÉPA5Êä³ö */
  DAC_Cmd(DAC_Channel_2, ENABLE);

  /* ʹÄÜDACµÄDMAÇëÇó */
  DAC_DMACmd(DAC_Channel_2, ENABLE);
}
下面的是 TIM7定时器初始化函数
void DAC_TIM_Config(void)
{
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
       
        /* ʹÄÜTIM2ʱÖÓ */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
       
  /* TIM7»ù±¾¶¨Ê±Æ÷ÅäÖà */
// TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 20;                                                                               //¶¨Ê±ÖÜÆÚ 20(0)  
  TIM_TimeBaseStructure.TIM_Prescaler = 8;                                                               //Ô¤·ÖƵ£¬²»·ÖƵ 8(0)
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                                                    //ʱÖÓ·ÖƵϵÊý
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //ÏòÉϼÆÊýģʽ
  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);

  /* ÅäÖÃTIM7´¥·¢Ô´ */
  TIM_SelectOutputTrigger(TIM7, TIM_TRGOSource_Update);

        /* ʹÄÜTIM7 */
  TIM_Cmd(TIM7, ENABLE);
}
接下来是DAC_DMA通道参数设置
void DAC_DMA_Config_1(void)
{       
        DMA_InitTypeDef  DMA_InitStructure;

        /* ʹÄÜDMA2ʱÖÓ */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

        /* ÅäÖÃDMA2 */
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;                                        //ÍâÉèÊý¾ÝµØÖ·
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit_1;                        //ÄÚ´æÊý¾ÝµØÖ· DualSine12bit
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                                                                        //Êý¾Ý´«Êä·½ÏòÄÚ´æÖÁÍâÉè
  DMA_InitStructure.DMA_BufferSize = 64;                                                                                                                                        //»º´æ´óСΪ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_Circular;                                                                                                        //Ñ­»·Ä£Ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;                                                                                        //¸ßDMAͨµÀÓÅÏȼ¶
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                                                                                                //·ÇÄÚ´æÖÁÄÚ´æģʽ       

  DMA_Init(DMA2_Channel4, &DMA_InitStructure);
       
  /* ʹÄÜDMA2-14ͨµÀ */
  DMA_Cmd(DMA2_Channel4, ENABLE);
}
上面的三段程序都是有关初始化的部分程序,当然也有发送数据的右对齐处理,上面没有贴出。
我在主函数中调用初始化函数之后,上电复位之后,等待 DMA TC标志置位不能成功,但是此时如果能够按键复位一下,程序能够正常执行。就是想知道这个问题的原因。
第一次发帖,不太熟悉这个方式。各位高手请帮忙看一下,如果有什么关于代码的疑问的,我可以继续贴出来。
@smallskiff @mmuuss586 @想做大牛的小马  

使用特权

评论回复
8
smallskiff| | 2014-10-21 14:39 | 只看该作者
外设初始化中加入RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE),试试看

使用特权

评论回复
9
244753440|  楼主 | 2014-10-21 15:36 | 只看该作者
smallskiff 发表于 2014-10-21 14:39
外设初始化中加入RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE),试试看

不是这个的问题  我的程序 是 在首次上电复位之后 一直处于等待DMA发送完成标志位置位 if(DMA_GetFlagStatus(DMA2_FLAG_TC4)!=RESET)   会一直死在这儿,但是我再进行一下按键复位的话,程序就可以正常执行了。我就是想不明白这个问题  所以想知道具体的原因的

使用特权

评论回复
10
smallskiff| | 2014-10-22 22:35 | 只看该作者
用过ADC+DMA,没用过DAC+DMA;从你的程序上看,需要在程序中某一处写DualSine12bit_1来完成DAC的更新操作,是在哪里完成更新的呢? if(DMA_GetFlagStatus(DMA2_FLAG_TC4)!=RESET)是个判断语句,是不会卡死的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

66

帖子

0

粉丝