久芯网

同时使用两个定时器TIM1和TIM2,TIM1用PWM波,TIM2改变占空比,先初始化TIM2,当且仅当响应优先级为3时,无法产生呼吸灯是为什么?

avatar 寂铭轩 提问时间: 2023-08-02 22:28:47 / 未解决
![PWM波输出呼吸灯.zip](data/attachment/forum/?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "PWM波输出呼吸灯.zip")
6个回答
  • avatar 寂铭轩
    最佳答案
    回答时间: 2023-08-02 22:59:33
    寂铭轩 发表于 2022-4-3 22:06

    include "stm32f10x.h"

    include "led.h"

    include "timer.h"

    [md]主函数

  • avatar 寂铭轩
    最佳答案
    回答时间: 2023-08-02 23:24:38
    寂铭轩 发表于 2022-4-3 22:06

    include "timer.h"

    include "stm32f10x.h"

    include "led.h"

    [md]定时器设置函数

  • avatar 寂铭轩
    回答时间: 2023-08-02 23:45:08

    include "stm32f10x.h" include "led.h" include "timer.h" include "delay.h" u16 flag=1; u16 ledpwmpare=0; int main() { //GPIO_InitTypeDef GPIO_Initstring2; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); delay_init(); led_Init(); timer_Init(99,7199);//定时器2初始化 (99+1)*0.1ms=1ms timer1_PWM_Init(899,1);// // GPIO_Initstring2.GPIO_Mode=GPIO_Mode_Out_PP; // GPIO_Initstring2.GPIO_Pin=GPIO_Pin_3; // GPIO_Initstring2.GPIO_Speed=GPIO_Speed_50MHz; // GPIO_Init(GPIOA,&GPIO_Initstring2); // PAout(3)=0; //GPIOA PA3 输出 50MHZ while(1) { delay_ms(3); if(flag)ledpwmpare++; else ledpwmpare--; if(ledpwmpare>300)flag=0; if(ledpwmpare==0)flag=1; TIM_SetCompare1(TIM1,ledpwmpare); } } void TIM3_IRQHandler(void)//定时器2的中断服务函数 { if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) { // PAout(3)=!PAout(3);//电平翻转 // if(flag)ledpwmpare++; // else ledpwmpare--; // // if(ledpwmpare>300)flag=0; // if(ledpwmpare==0)flag=1; // // TIM_SetCompare1(TIM1,ledpwmpare); //TIM_SetCompare1(TIM1,450); TIM_ClearITPendingBit(TIM3,TIM_IT_Update); } }

  • avatar 寂铭轩
    回答时间: 2023-08-03 00:06:55

    include "timer.h" include "stm32f10x.h" include "led.h" void timer_Init(u16 arr,u16 psc)//arr是重装载值 psc是预分频系数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstring1; NVIC_InitTypeDef NVIC_Initstring; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能APB1时钟 TIM_TimeBaseInitstring1.TIM_Period=arr; TIM_TimeBaseInitstring1.TIM_Prescaler=psc; TIM_TimeBaseInitstring1.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitstring1.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstring1); //初始化定时器 配置arr重装载值 配置psc预分频系数 NVIC_Initstring.NVIC_IRQChannel=TIM3_IRQn; NVIC_Initstring.NVIC_IRQChannelCmd=ENABLE; NVIC_Initstring.NVIC_IRQChannelPreemptionPriority=1;//0抢占 NVIC_Initstring.NVIC_IRQChannelSubPriority=3;//3响应 NVIC_Init(&NVIC_Initstring); //初始化中断优先级 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启定时器中断 TIM_Cmd(TIM3,ENABLE); //使能定时器 } void timer1_PWM_Init(u16 arr,u16 psc)//arr是重装载值 psc是预分配系数 { GPIO_InitTypeDef GPIO_Initstring; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstring; TIM_OCInitTypeDef TIM_OCInitstring; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能APB2时钟 TIM1挂在APB2下 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA LED0 GPIOA GPIO_Initstring.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_Initstring.GPIO_Pin=GPIO_Pin_8; GPIO_Initstring.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(GPIOA,&GPIO_Initstring); //配置PA8 复用推挽 TIM_TimeBaseInitstring.TIM_Period=arr; TIM_TimeBaseInitstring.TIM_Prescaler=psc; TIM_TimeBaseInitstring.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitstring.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitstring); //初始化定时器 arr为重装载值 psc为分频系数 模式为向上计数模式 TIM_OCInitstring.TIM_OCMode=TIM_OCMode_PWM2;//模式2 cnt大于比较值为高 TIM_OCInitstring.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能 TIM_OCInitstring.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitstring.TIM_Pulse=0;//比较值初始化为0 TIM_OC1Init(TIM1,&TIM_OCInitstring); //初始化定时器1的通道1 模式2 cnt大于比较值为高 输出使能 有效为高 TIM_CtrlPWMOutputs(TIM1,ENABLE); //初始化主输出使能 //定时器1是高级计时器 所以说需要主输出使能 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH1预装载使能 TIM_ARRPreloadConfig(TIM1,ENABLE); //使能预装载寄存器 TIM_Cmd(TIM1,ENABLE); //使能定时器1 }

  • avatar 寂铭轩
    回答时间: 2023-08-03 00:27:14
    寂铭轩 发表于 2022-4-3 22:06

    include "stm32f10x.h"

    include "led.h"

    include "timer.h"

    [md]主函数

  • avatar 鹿森
    回答时间: 2023-08-03 00:52:30

    学习一下!

会员中心 微信客服
客服
回到顶部