高级会员
主题
帖子
积分2691
阅读权限30
注册时间2012-10-23
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2012-12-4 10:10
|
显示全部楼层
设计了以下DMA控制PWM输出,但是工作异常,DMA无效,不知何故
/************************
实验目标:
1、在PA_6端口输出PWM,占空比是反复变化的
2、PWM占空比由buf[3]决定,循环改变占空比,即三个占空比不断变换
3、由DMA控制TIM3->CCR1实现占空比循环改变
简易验证:
10k欧限流LED接到PA_6
buf[]置为{950, 500, 100},约应得到500亮度,实得950亮度(很暗),说明DMA异常
buf[]置为{100, 500, 950},约应得到500亮度,实得100亮度(很亮),说明DMA异常
*************************/
#include "stm32f10x.h"
u16 buf[3] = {950, 500, 100};
void DMA_Configuration(void)
{
DMA_InitTypeDef D;
//详见函数库手册第90页解释
DMA_DeInit(DMA1_Channel3); //DMA1_3通道初始化
D.DMA_PeripheralBaseAddr = (u32)0x40000434; //DMA外设基址 TIM3_CCR1_Address
D.DMA_MemoryBaseAddr = (u32)buf; //DMA内存基址
D.DMA_DIR = DMA_DIR_PeripheralDST; //DST外设作为数据传送目的地址,SRC则作为源地址
D.DMA_BufferSize = 3; //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_Channel3, &D); //初始化DMA1
DMA_Cmd(DMA1_Channel3, ENABLE); //DMA1_3使能
}
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); //PA、PB钟源
//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_6;
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 = 999; //当定时器从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(TIM3, &TIM_TimeBaseStructure);
//PWM通道1模式设置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = buf[0]; //设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为高电平
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //使能通道1
TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE); //TIM3 DMA请求使能,注:TIM3_Update请求对应DMA通道为DMA1_chanel3
//TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE); //TIM3 DMA请求使能,注:TIM3_CC1请求对应DMA通道为DMA1_chanel6
TIM_Cmd(TIM3, ENABLE); //TIM3使能
//TIM_CtrlPWMOutputs(TIM3, ENABLE); //PWM输出
while (1){}
} |
|