初级会员

- 积分
- 178
- 金钱
- 178
- 注册时间
- 2020-6-21
- 在线时间
- 70 小时
|
1金钱
我只是把所有的TIM2改成了TIM3,中断还是能进去,但是输出的脉冲不对。
pwm.c
- #include "pwm.h"
- #include "usart.h"
- extern u8 ask_cycle_flag;
- extern u8 first_loop_flag;
- void TIM1_configtest(vu16 temp)
- {
- GPIO_InitTypeDef GPIO_InitStructure; //GPIO设置,创建结构体
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器设置结构体
- TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波对应设置结构体
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //开启时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM1_CH4 PA11
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- // TIM1->ARR = temp;
- TIM_TimeBaseStructure.TIM_Prescaler =7200-1; //设置用来作为TIMx时钟频率除数的预分频值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS= Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数,一定要=0!!!
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //装载
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
-
- // TIM1->CCR1 = (temp/2);
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //装载通道1,PA8
- TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
- TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
- TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能或者失能 TIMx 在 ARR 上的预装载寄存器
- }
- void TIM1_config()
- {
- GPIO_InitTypeDef GPIO_InitStructure; //GPIO设置,创建结构体
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器设置结构体
- TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波对应设置结构体
- // NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //开启时钟
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM1_CH4 PA11
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
- GPIO_Init(GPIOA,&GPIO_InitStructure);
-
- TIM_TimeBaseStructure.TIM_Prescaler =7200; //设置用来作为TIMx时钟频率除数的预分频值
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS= Tck_tim
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数,一定要=0!!!
- TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //装载
-
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- //设置待装入捕获寄存器的脉冲值
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性
-
- TIM_OC1Init(TIM1, &TIM_OCInitStructure); //装载通道1,PA8
-
- TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
- //设置或者重置 TIMx 主/从模式
- //TIMx: x 可以是 2, 3 或者 4,来选择 TIM 外设
- //TIM_MasterSlaveMode:定时器主/从模式,TIM 主/从模式使能
-
- TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
- //选择 TIMx 触发输出模式
- //TIMx: x 可以是 2, 3 或者 4,来选择 TIM 外设
- //TIM_TRGOSource:触发输出模式
- //TIM_TRGOSource_Update:使用更新事件作为触发输出(TRGO)
-
-
- // TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能或者失能 TIMx 在 CCR3 上的预装载寄存器
- // TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能或者失能 TIMx 在 CCR3 上的预装载寄存器
- TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能或者失能 TIMx 在 ARR 上的预装载寄存器
- //允许或禁止在定时器工作时向ARR的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值
-
- //打开中断
- // TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
- // NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
- // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- // NVIC_Init(&NVIC_InitStructure);
- }
-
- /***定时器2从模式***/
- void TIM3_config(u32 PulseNum)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //对应结构体声明
- NVIC_InitTypeDef NVIC_InitStructure; //NVIC 对应结构体声明
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
-
- TIM_TimeBaseStructure.TIM_Period = PulseNum;
- TIM_TimeBaseStructure.TIM_Prescaler =0;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
-
- TIM_SelectInputTrigger(TIM3,TIM_TS_ITR0);//选择 TIMx 输入触发源,TIM 内部触发 0
- TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1 );// 等同 TIM2->SMCR|=0x07 //设置从模式寄存器
- // TIM2->SMCR|=0x07; //设置从模式寄存器
- TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE); //
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- //入口设定函数
- void Pulse_output(u32 Cycle,u32 DutyCycle,u32 PulseNum)
- {
- u32 ccr1;
- u32 arr; //7200预分频,72Mhz时钟,所以是10 000hz
- arr=(10000/Cycle);
- ccr1 =(arr*DutyCycle/100);
- TIM_Cmd(TIM3,DISABLE);
- TIM3_config(PulseNum);//装载
- TIM1_config();
- // TIM1_configtest(Cycle);
- TIM1->ARR = arr;
- TIM1->CCR1 = ccr1;
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx 的中断待处理位
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
- TIM_Cmd(TIM3, ENABLE);//使能
- TIM_Cmd(TIM1, ENABLE);//使能
- TIM_CtrlPWMOutputs(TIM1, ENABLE); //高级定时器一定要加上,主输出使能
- }
-
- //中断处理函数
- void TIM3_IRQHandler(void)
- {
- if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) // TIM_IT_CC1
- {
- TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位
- TIM_CtrlPWMOutputs(TIM1, DISABLE); //主输出失能
- TIM_Cmd(TIM1, DISABLE); // 关闭定时器
- TIM_Cmd(TIM3, DISABLE); // 关闭定时器
- TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
- printf("\r\n脉冲发送完成:\r\n");
- }
- }
复制代码
|
|