OpenEdv-开源电子网

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

新手求救,如何用DMA输出SPWM波,为何模拟无波形

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-7-26
在线时间
2 小时
发表于 2016-7-26 14:05:47 | 显示全部楼层 |阅读模式
新手求救,如何用DMA输出SPWM波,为何模拟无波形,程序如下,求大神
单片机为F103ZET6[mw_shl_code=cpp,true]#include "stm32f10x.h"
#include "timer.h"
#include "key.h"
#include "delay.h"
#include "dma.h"

int main(void)
{

  sin_Generation();       
  TIM34_GPIO_Config();
        TIM3_PWMInit();
        TIM_DMA_Configuration();
       
  while (1)
{
         
}
}[/mw_shl_code][mw_shl_code=cpp,true]#include "timer.h"
#include "led.h"
#include "usart.h"
#include "math.h"

#define PI  3.14159
#define TIM1_CCR1_Address    0x40000434
#define tableSize 256

u16 sinTable[tableSize];

void sin_Generation (void)
{
        u16 n;
        for(n=0;n<tableSize;n++)
        {
                sinTable[n] = (sin(2*PI*n/tableSize)+1)*2047;       
        }       
}

void TIM34_GPIO_Config()
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB2Periph_AFIO, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void TIM3_PWMInit(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef     TIM_OCInitStructure;
       
         TIM_TimeBaseStructure.TIM_Period = 3599;//éè&#214;&#195;SPWM2¨μ&#196;&#214;ü&#198;ú  10k  10k/200=50hz
   TIM_TimeBaseStructure.TIM_Prescaler = 1;//éè&#214;&#195;&#212;¤·&#214;&#198;μ
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//éè&#214;&#195;ê±&#214;ó·&#214;&#198;μ&#207;μêy£&#172;2&#187;·&#214;&#198;μ
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //&#207;òé&#207;&#188;&#198;êy
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;                //&#214;&#216;&#184;′&#188;&#198;êy
   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                 //3&#245;ê&#188;&#187;ˉ&#182;¨ê±&#198;÷3
        

        
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//&#191;a&#198;&#244WMê&#228;3&#246;&#196;£ê&#189;1
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// &#187;¥21ê&#228;3&#246;μ&#189;&#182;&#212;ó|òy&#189;&#197;
   TIM_OCInitStructure.TIM_Pulse =0;     //éè&#182;¨3&#245;ê&#188;&#213;&#188;&#191;&#213;±è
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//&#184;&#223;μ&#231;&#198;&#189;&#197;D&#182;¨
   
         TIM_OC1Init(TIM3, &TIM_OCInitStructure); //ê1&#196;üTIM3μ&#196;í¨μà1oíí¨μà2      
        

   
         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);       
               
         TIM_Cmd(TIM3, ENABLE);                   //ê1&#196;üTIM3

         
         TIM_CtrlPWMOutputs(TIM3, ENABLE);  
}

void TIM_DMA_Configuration(void)
{
        DMA_InitTypeDef DMA_InitStructure;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //ê1&#196;üDMA′&#171;ê&#228;
       
  DMA_DeInit(DMA1_Channel5);   //&#189;&#171;DMAμ&#196;í¨μà1&#188;&#196;′&#230;&#198;÷&#214;&#216;éè&#206;aè±ê&#161;&#214;μ


        DMA_InitStructure.DMA_PeripheralBaseAddr = TIM1_CCR1_Address;  //DMAíaéè&#187;ùμ&#216;&#214;·
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&sinTable;  //DMA&#196;ú′&#230;&#187;ùμ&#216;&#214;·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //êy&#190;Y′&#171;ê&#228;·&#189;&#207;ò£&#172;′ó&#196;ú′&#230;&#182;áè&#161;·¢&#203;íμ&#189;íaéè
        DMA_InitStructure.DMA_BufferSize = tableSize;  //DMAí¨μàμ&#196;DMA&#187;o′&#230;μ&#196;′óD&#161;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //íaéèμ&#216;&#214;·&#188;&#196;′&#230;&#198;÷2&#187;±&#228;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //&#196;ú′&#230;μ&#216;&#214;·&#188;&#196;′&#230;&#198;÷μY&#212;&#246;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  //êy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //êy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //1¤×÷&#212;ú&#213;y3£&#196;£ê&#189;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMAí¨μà xóμóD&#214;Dó&#197;&#207;è&#188;&#182;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMAí¨μàx&#195;&#187;óDéè&#214;&#195;&#206;a&#196;ú′&#230;μ&#189;&#196;ú′&#230;′&#171;ê&#228;
       
        DMA_Init(DMA1_Channel5, &DMA_InitStructure);  //&#184;ù&#190;YDMA_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉDMAμ&#196;í¨μàUSART1_Tx_DMA_Channel&#203;ù±êê&#182;μ&#196;&#188;&#196;′&#230;&#198;÷
       
  DMA_ClearFlag( DMA1_IT_TC5 );
  DMA_ITConfig( DMA1_Channel5, DMA_IT_TC, ENABLE );
       
        DMA_Cmd(DMA1_Channel5, ENABLE);  

  TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
       
}[/mw_shl_code]
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 04:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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