新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2022-6-8
- 在线时间
- 0 小时
|
1金钱
定时器1生成pwm的代码已经测试没问题,但是用DMA传输CCR的值总是卡在标志位检测。不知道是不是DMA的配置出了问题。DMA配置
void DMA_Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
// 开启DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(MTM_DMA_CHANNEL);
// 设置DMA源地址:外设数据寄存器地址*/
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&CCRx);
// 内存地址(要传输的变量的指针)
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) (&led);
// 方向:从内存到外设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设为目标地址 从flash到tim_ccr
// 传输大小
DMA_InitStructure.DMA_BufferSize = 1; //传输次数
// 外设地址自增
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
// 内存地址自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
// 外设数据单位
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
// 内存数据单位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
// DMA模式,一次或者循环模式
// DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
// 优先级:中
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
// 禁止内存到内存的传输
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
// 配置DMA通道
DMA_Init(MTM_DMA_CHANNEL, &DMA_InitStructure);
// 清除标志位
DMA_ClearFlag(DMA1_FLAG_TC5);
// 使能DMA
DMA_Cmd (DMA1_Channel5,ENABLE);
}
主函数
extern u16 led;
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
TIM1_PWM_Init();//不分频。PWM频率=72000/(899+1)=80Khz
while(1)
{
delay_ms(10);
if(dir)
led0pwmval++;
else
led0pwmval--;
led = led0pwmval;
if(led0pwmval>300)
dir=0;
if(led0pwmval==0)
dir=1;
}
}
定时器部分代码
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_DMACmd(TIM1,TIM_DMA_Update,ENABLE);
TIM_Cmd(TIM1, ENABLE); //使能TIM1
|
|