功能要求:
(1)按下复位键后,数码管中间的横线(小灯)以一秒的速度呼吸三次,然后熄灭;
(2)小灯熄灭后按下UP键可以增加灯的亮度,按下的次数越多小灯越亮,达到最大亮度后,随着按键按下小灯亮度逐渐变暗;
(3)只能使用一个定时器。
开发板:STM32-PZ6806L
实现代码:
#include "stm32f10x.h"
#include "GPIOLIKE51.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"uint16_t i=0;
uint8_t j;//函数声明
void TIM3_Config();
void PWM_Config();
void GPIO_Config();
void delay(uint32_t n);
void GPIO_Config_UP();
void EXTI_Congig_UP();int main(void)
{TIM3_Config();PWM_Config();GPIO_Config();GPIO_Config_UP();EXTI_Congig_UP();while(1){}
}//KEY_UP
void EXTI_Congig_UP(){EXTI_InitTypeDef a;NVIC_InitTypeDef b;a.EXTI_Line=EXTI_Line0;a.EXTI_LineCmd=ENABLE;a.EXTI_Mode=EXTI_Mode_Interrupt;a.EXTI_Trigger=EXTI_Trigger_Rising;EXTI_Init(&a);b.NVIC_IRQChannel=EXTI0_IRQn;b.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&b);
}//KEY_LEFT的中断服务函数
void EXTI0_IRQHandler(){if(i<=0){j++;i=0;}if(i>=1000){j++;i=1000;}if(j%2==1){i+=50;delay(10000);TIM_SetCompare1(TIM3,i);}else{i-=50;delay(10000);TIM_SetCompare1(TIM3,i);}EXTI_ClearFlag(EXTI_Line0); //清除中断标志位EXTI_ClearITPendingBit(EXTI_Line0);//更新中断标志位
}//延时函数
void delay(uint32_t n){for(;n!=0;n--);
}//定时器TIM3配置
void TIM3_Config(){TIM_TimeBaseInitTypeDef a;NVIC_InitTypeDef b;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);a.TIM_ClockDivision=TIM_CKD_DIV1;a.TIM_CounterMode=TIM_CounterMode_Up;//定时1msa.TIM_Period=1000-1;a.TIM_Prescaler=72-1;b.NVIC_IRQChannel=TIM3_IRQn;b.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&b);TIM_TimeBaseInit(TIM3,&a);TIM_Cmd(TIM3,ENABLE);//启动定时器TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//配置中断
}
//TIM3中断服务函数
void TIM3_IRQHandler(){if(j<7){if(i<=0||i>=1000){j++;}if(j%2==0){i-=2;TIM_SetCompare1(TIM3,i);}else{i+=2;TIM_SetCompare1(TIM3,i);}}else{TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//关闭中断}TIM_ClearFlag(TIM3,TIM3_IRQn);TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
//PWM波配置
void PWM_Config(){TIM_OCInitTypeDef a;a.TIM_OCMode=TIM_OCMode_PWM1;a.TIM_OutputState=ENABLE;TIM_OC1Init(TIM3,&a);
}
//GPIO_C6配置
void GPIO_Config(){GPIO_InitTypeDef a;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//接口需要启用第二功能(输出PWM波),需要配置AFIOa.GPIO_Mode=GPIO_Mode_AF_PP;a.GPIO_Pin=GPIO_Pin_6;a.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&a);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//完全重映像
}void GPIO_Config_UP(){GPIO_InitTypeDef a;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//接口需要启用第二功能(作为外部中断的输入),需要配置AFIOa.GPIO_Mode=GPIO_Mode_IPD;a.GPIO_Pin=GPIO_Pin_0;a.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&a);
}
本文发布于:2024-01-30 14:20:02,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659560520614.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |