新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2016-7-26
- 在线时间
- 2 小时
|
新手求救,如何用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; //¸′óÃíÆíìêä3ö
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;//éèÖÃSPWM2¨μÄÖüÆú 10k 10k/200=50hz
TIM_TimeBaseStructure.TIM_Prescaler = 1;//éèÖÃÔ¤·ÖÆμ
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//éèÖÃê±Öó·ÖÆμÏμêy£¬2»·ÖÆμ
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //ÏòéϼÆêy
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //ÖØ¸′¼Æêy
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //3õê¼»ˉ¶¨ê±Æ÷3
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//¿aÆô WMêä3öÄ£ê½1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// »¥21êä3öμ½¶Ôó|òy½Å
TIM_OCInitStructure.TIM_Pulse =0; //é趨3õê¼Õ¼¿Õ±è
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//¸ßμçÆ½ÅD¶¨
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //ê1ÄüTIM3μÄí¨μà1oíí¨μà2
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE); //ê1ÄüTIM3
TIM_CtrlPWMOutputs(TIM3, ENABLE);
}
void TIM_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ê1ÄüDMA′«êä
DMA_DeInit(DMA1_Channel5); //½«DMAμÄí¨μà1¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
DMA_InitStructure.DMA_PeripheralBaseAddr = TIM1_CCR1_Address; //DMAíaéè»ùμØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&sinTable; //DMAÄú′æ»ùμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //êy¾Y′«êä·½Ïò£¬′óÄú′æ¶áè¡·¢Ëíμ½íaéè
DMA_InitStructure.DMA_BufferSize = tableSize; //DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμØÖ·¼Ä′æÆ÷2»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //1¤×÷ÔúÕy3£Ä£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMAí¨μà xóμóDÖDóÅÏè¼¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
DMA_Init(DMA1_Channel5, &DMA_InitStructure); //¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μàUSART1_Tx_DMA_ChannelËù±êê¶μļÄ′æÆ÷
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]
|
|