新手入门
- 积分
- 4
- 金钱
- 4
- 注册时间
- 2021-2-17
- 在线时间
- 1 小时
|
1金钱
本帖最后由 qq807665216 于 2021-6-3 09:41 编辑
F407定时器 period(周期)为0,中断服务函数不执行。
- void TIM8_PWM_Init(u32 arr,u32 psc) // 定时器8初始化函数
- {
- //此部分需手动修改IO口设置
-
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE); //TIM8时钟使能
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //使能GPIOC时钟
-
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8); //GPIOC6复用为定时器8 OC1
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8); //GPIOC7复用为定时器8 OC2
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_TIM8); //GPIOC8复用为定时器8 OC3
- GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_TIM8); //GPIOC9复用为定时器8 OC4
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; // GPIOC6/7/8/9
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
- GPIO_Init(GPIOC,&GPIO_InitStructure); //初始化PC6 7 8 9
-
- TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
- TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
- TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
- TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数器
-
- TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStructure);//初始化定时器8
-
- //初始化TIM8 Channel PWM模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
- TIM_OCInitStructure.TIM_Pulse = 0;
- TIM_OC1Init(TIM8, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM8
- TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR1上的预装载寄存器
- TIM_CtrlPWMOutputs(TIM8, ENABLE);
-
- TIM_OC2Init(TIM8, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM8
- TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR1上的预装载寄存器
- TIM_CtrlPWMOutputs(TIM8, ENABLE);
-
- TIM_OC3Init(TIM8, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM8
- TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR1上的预装载寄存器
- TIM_CtrlPWMOutputs(TIM8, ENABLE);
-
- TIM_OC4Init(TIM8, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM8
- TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); //使能TIM8在CCR1上的预装载寄存器
- TIM_CtrlPWMOutputs(TIM8, ENABLE);
-
- TIM_ARRPreloadConfig(TIM8,ENABLE); //ARPE使能
-
-
- TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable); //主从模式使能
- TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update); //更新时间为触发输出
- TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE); //允许定时器8更新中断
-
- NVIC_InitStructure.NVIC_IRQChannel=TIM8_UP_TIM13_IRQn; //定时器8中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x05; //抢占优先级5
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //子优先级0
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- TIM_Cmd(TIM8,ENABLE); //使能定时器8
- }
复制代码- void TIM4_config(u32 PulseNum)//定时器4初始化函数
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- TIM_TimeBaseStructure.TIM_Period = PulseNum-1; //定时器4的周期
- TIM_TimeBaseStructure.TIM_Prescaler =0; //预分频系数 (不分频)
- TIM_TimeBaseStructure.TIM_ClockDivision = 0; //
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化TIM4
-
- TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); //设置主从模式
- TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_External1); //TIM_SlaveMode_External1:所选触发器(TRGI)时钟计数器的上升边缘
- TIM_SelectInputTrigger(TIM4, TIM_TS_ITR3); //选择输入触发器源
- TIM_ITRxExternalClockConfig(TIM4,TIM_TS_ITR3);
- TIM_ARRPreloadConfig(TIM4,DISABLE);
- TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //使能TIM4的update中断
-
-
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //选择定时器4中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x05; //抢占优先级为5
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; //响应优先级为0
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能定时器4中断
- NVIC_Init(&NVIC_InitStructure); //定时器4中断初始化
- TIM_Cmd(TIM4,ENABLE); //使能定时器4
- }
复制代码 主要的功能是:TIM8作为主定时器 输出PWM波,TIM4作为从定时器为主定时器(TIM8)计数
使用的是FreeRTOS,在TIM4触发中断后,TIM4的中断服务函数发送二值信号量,任务接收到二值信号量对TIM8的ARR和CCR1寄存器、TIM4的ARR寄存器重新赋值
达到输出一定数量的PWM波的效果
问题:如果计数一个PWM波,需要将TIM4的ARR赋0(赋1的话是计算2个PWM波),如果将ARR赋0的话,TIM4的中断没有被执行
|
|