初级会员

- 积分
- 65
- 金钱
- 65
- 注册时间
- 2020-5-6
- 在线时间
- 43 小时
|
10金钱
老哥们,我现在在做一个普通IO口模拟PWM输出控制LED的呼吸灯,现在LED灯一直常亮,没找到具体的原因。求指点
u8 dir = 1;
u8 ledpwmval;
int ledpwmcount;
u8 timecount;
void TIM4_IRQHandler(void)//200us
{
printf("TIM4.......\n");
if(TIM_GetITStatus(TIM4,TIM_FLAG_Update))
{
if(++timecount > 100)
{
timecount = 0;
if((dir==1)&&(ledpwmcount<=799))
{
ledpwmcount++;
if(ledpwmcount > 799)
{
ledpwmcount =799;
dir = 0;
}
}
if((dir==0)&&(ledpwmcount>0))
{
ledpwmcount--;
if(ledpwmcount == 0)
{
ledpwmcount = 0;
dir = 1;
}
}
ledpwmval = ledpwmcount;
}
if(ledpwmval>0)
{
GPIO_ResetBits(GPIOC,LED0);
ledpwmval--;
}
else
GPIO_SetBits(GPIOC,LED0);
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
}
定时器4部分
void TIM4_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
NVIC_InitTypeDef NVIC_InitStructture;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
TIM_TimeBaseInitStrue.TIM_Period = arr;
TIM_TimeBaseInitStrue.TIM_Prescaler = psc;
TIM_TimeBaseInitStrue.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInitStrue.TIM_ClockDivision =0;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
NVIC_InitStructture.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructture.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructture.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructture.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructture);
TIM_Cmd(TIM4,ENABLE);
}
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
TIM_OCInitTypeDef TIM_OCInitTypeStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = LED0; // ¶Ë¿úÅäÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿úËù¶èÎa50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure);
TIM_TimeBaseInitStrue.TIM_Period = arr;
TIM_TimeBaseInitStrue.TIM_Prescaler = psc;
TIM_TimeBaseInitStrue.TIM_CounterMode =TIM_CounterMode_Up;
TIM_TimeBaseInitStrue.TIM_ClockDivision =0;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue);
TIM_OCInitTypeStrue.TIM_OCMode =TIM_OCMode_PWM2;
TIM_OCInitTypeStrue.TIM_OCNPolarity =TIM_OCPolarity_High;
TIM_OCInitTypeStrue.TIM_OutputState =TIM_OutputState_Enable;
TIM_OC3Init(TIM4, &TIM_OCInitTypeStrue);
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
TIM_Cmd(TIM4,ENABLE);
}
|
最佳答案
查看完整内容[请看2#楼]
u8 dir = 1,flag;
u16 timecount,timecount_all;
#define led_all 200 //周期
s16 led_low=-20; //低(-20使得低灭彻底)
s16 led_high=led_all;//高
void TIM4_IRQHandler(void)//TIM4_Int_Init(19,71); 20us(稍微修改变呼吸频率)
{
if(TIM_GetITStatus(TIM4,TIM_FLAG_Update))
{
timecount++;
timecount_all++;
if(timecount>=led_low & flag==0)//低
{
...
|