赞
踩
功能要求:
(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; //定时1ms a.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波),需要配置AFIO a.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); //接口需要启用第二功能(作为外部中断的输入),需要配置AFIO a.GPIO_Mode=GPIO_Mode_IPD; a.GPIO_Pin=GPIO_Pin_0; a.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&a); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。