在线时间1 小时
UID3471704
ST金币13
蝴蝶豆0
注册时间2018-9-5
该用户从未签到
新手上路
- 最后登录
- 2020-10-27
|
问题是这样的:
定义了一个数组,内容为PWM波的占空比对应的脉冲数,本人利用DMA通道将数组传输至TIM1的CCR,TIM1设置为PWM输出,从而改变PWM波的脉冲比,发现传输至TIM1的CCR,TIM1的CH1一直输出高电平,而不是占空比变化的PWM波。而传输至TIM2或TIM3等通用定时器的CH口,PWM波的输出及占空比均正常。
下面是传输至TIM1的代码:
#include "stm32f10x.h"
u16 buf1[20] = {5,14,22,30,37,44,49,53,56,57,57,56,53,49,44,37,30,22,14,5};
void DMA_Configuration(void)
{
DMA_InitTypeDef D;
//????????90???
DMA_DeInit(DMA1_Channel2); //DMA1_3?????
D.DMA_PeripheralBaseAddr = (u32)0x40000034; //DMA???? TIM3_CCR1_Address TIM3-1£º40000434 TIM1-1£º40012C34 TIM1-2£º40012C38
D.DMA_MemoryBaseAddr = (u32)buf1; //DMA???? TIM2-1£º40000034 TIM3-2:40000438
D.DMA_DIR = DMA_DIR_PeripheralDST; //DST????????????,SRC??????
D.DMA_BufferSize = 20; //DMA????
D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //??????????
D.DMA_MemoryInc = DMA_MemoryInc_Enable; //??????????
D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //????16bit
D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //????16bit
D.DMA_Mode = DMA_Mode_Circular; //???????
D.DMA_Priority = DMA_Priority_High; //DMA??????
D.DMA_M2M = DMA_M2M_Disable; //??????????
DMA_Init(DMA1_Channel2, &D); //???DMA1
DMA_Cmd(DMA1_Channel2, ENABLE); //DMA1_3??
}
static void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE); //TIM3??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE); //PA?PB??
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//GPIOA ??: TIM3 channel 1 ? 2 ????
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // ??????
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_0 | GPIO_Pin_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
SystemInit();//???????72MHz
GPIO_Config(); //????
DMA_Configuration(); //??DMA
//?????
TIM_TimeBaseStructure.TIM_Period = 71; //?????0???999,??1000?,???????
TIM_TimeBaseStructure.TIM_Prescaler = 0; //?????:????,??36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //????????:???
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //??????
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//PWM??1????
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //???PWM??1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = buf1[0]; //?????,???????????,??????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //?????????CCR1_Val?????
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //????1
TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE); //TIM3 DMA????,?:TIM3_Update????DMA???DMA1_chanel3
// TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE); //TIM3 DMA????,?:TIM3_CC1????DMA???DMA1_chanel6
TIM_Cmd(TIM2, ENABLE); //TIM3??
//TIM_CtrlPWMOutputs(TIM3, ENABLE); //PWM??
while (1)
{}
}
|
|