|
轉(zhuǎn)一個(gè)帖子,以供參考
1.DMA配置
void DMA_Configuration(void)
{
DMA_InitTypeDef D;
DMA_DeInit(DMA1_Channel3); //DMA1_3通道初始化U
D.DMA_PeripheralBaseAddr =(u32)&TIM3->CCR1; //DMA外設(shè)基址 TIM3_CCR1_Address
D.DMA_MemoryBaseAddr = (u32)buf; //DMA內(nèi)存基址
D.DMA_DIR = DMA_DIR_PeripheralDST; //DST外設(shè)作為數(shù)據(jù)傳送目的地址,SRC則作為源地址
D.DMA_BufferSize = 4; //DMA緩存大小
D.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設(shè)地址寄存器不增加
D.DMA_MemoryInc = DMA_MemoryInc_Enable; //內(nèi)存地址寄存器不增加
D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外存字寬16bit
D.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //內(nèi)存字寬16bit
D.DMA_Mode = DMA_Mode_Normal; //工作在循環(huán)模式
//D.DMA_Mode =DMA_Mode_Circular;
D.DMA_Priority = DMA_Priority_High; //DMA置為高優(yōu)先級
D.DMA_M2M = DMA_M2M_Disable; //不置為內(nèi)存到內(nèi)存?zhèn)鬏?br />
DMA_Init(DMA1_Channel3, &D); //初始化DMA1
DMA_Cmd(DMA1_Channel3, ENABLE); //DMA1_3使能
}
2.定時(shí)器PWM輸出配置
u16 buf[4] = {200,400,600,800};
static void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //TIM3鐘源
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE); //GPIOA 配置: TIM3 channel 1 和 2 推挽復(fù)用
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM3_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//定時(shí)器設(shè)置
TIM_TimeBaseStructure.TIM_Period = 999;
//當(dāng)定時(shí)器從0計(jì)數(shù)到999,即為1000次,為一個(gè)定時(shí)周期
TIM_TimeBaseStructure.TIM_Prescaler = 0; //設(shè)置預(yù)分頻:不預(yù)分頻,即為36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分頻系數(shù):不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計(jì)數(shù)模式
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//PWM通道1模式設(shè)置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置為PWM模式1
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = buf[0];
//設(shè)置跳變值,當(dāng)計(jì)數(shù)器計(jì)數(shù)到這個(gè)值時(shí),電平發(fā)生跳變
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//當(dāng)定時(shí)器計(jì)數(shù)值小于CCR1_Val時(shí)為高電平
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_Cmd(TIM3, ENABLE); //TIM3使能
TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
//TIM3 DMA請求使能,注:TIM3_Update請求對應(yīng)DMA通道為DMA1_chanel3
}
3.主函數(shù)
extern u16 buf[4];
int main()
{
GPIO_Config(); //配置端口
TIM3_Init();
DMA_Configuration(); //配置DMA
}
可以看到PA6輸出低電平占200,400,600,800的脈沖,若D.DMA_Mode=DMA_Mode_Circularl; 則200,400,600,800的脈沖循環(huán)出現(xiàn)。
TIM_DMACmd(TIM3, TIM_DMA_Update,ENABLE);TIM_DMA_Update對應(yīng)通道3,剛開始設(shè)置TIM_DMA_CC1對應(yīng)通道6無法實(shí)現(xiàn)本現(xiàn)象,原因未知。
|
評分
-
查看全部評分
|