代碼:
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_key.h"
void Tim3_Int_Init(u16 arr,u16 psc);
void TIM3_IRQHandler(void);
int x = 1;
int mode = 0;
int change = 0;
int y = 1;
/**
* @brief 主函數
* @param 無
* @retval 無
*/
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
while (1)
{
if (mode==1 && change==0)
{
Tim3_Int_Init(4999, 7199);
change = 1;
}
else if (mode==2 && change==0)
{
Tim3_Int_Init(7199, 9999);
change = 1;
}
TIM3_IRQHandler();
if( Key_Scan(KEY2_GPIO_PORT,KEY2_GPIO_PIN) == KEY_ON )
{
mode += 1;
change = 0;
if (mode >= 5)
{
mode = 1;
}
}
if( Key_Scan(KEY1_GPIO_PORT,KEY1_GPIO_PIN) == KEY_ON )
{
y += 1;
LED1_ON;
}
}
}
void Tim3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//配置定時器時鐘
NVIC_InitTypeDef NVIC_InitStruct;//配置中斷控制器
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定時器時鐘
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//設置時鐘分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//設置為向上計數模式
TIM_TimeBaseInitStruct.TIM_Period = arr;//設置在下一個更新時間裝入活動的自動重裝載寄存器周期的值
TIM_TimeBaseInitStruct.TIM_Prescaler = psc;//預分頻值
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);//初始化
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3中斷,允許更新中斷
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&NVIC_InitStruct);//NVIC
TIM_Cmd(TIM3,ENABLE);//使能TIM3
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == 1)//檢查TIM3更新中斷發生與否
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中斷標志
x += 1;
switch(mode)
{
case 1:
if (x==1)
{
LED3_OFF;
LED1_ON;
}
else if (x==2)
{
LED1_OFF;
LED2_ON;
}
else if (x==3)
{
LED2_OFF;
LED3_ON;
x = 0;
}
break;
case 2:
if (x==1)
{
LED2_OFF;
LED3_OFF;
LED1_ON;
}
else if (x==2)
{
LED2_ON;
LED3_ON;
x = 0;
}
break;
case 3:
if (y==1)
{
LED3_OFF;
LED1_ON;
}
else if (y==2)
{
LED1_OFF;
LED2_ON;
}
else if (y==3)
{
LED2_OFF;
LED3_ON;
y = 1;
}
break;
default:
break;
}
}
}
|