代码
主函数:
#include "mm32g0001.h" //不带延时函数的头文件
#include "stdio.h"
#include <string.h>
#include <key.h>
#include <platform.h>
static uint16_t key_num;
int main(void)
{
KEY_INIT( );
TIMER1_INIT( );
while (1)
{
}
}
key.c:
#include "key.h"
#include "led.h"
static uint8_t key_now_num;
static uint8_t key_formerly_num;
static int times;
void KEY_INIT(void)
{
GPIO_InitTypeDef GPIO_Init_structure;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA,ENABLE);
GPIO_Init_structure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init_structure.GPIO_Pin=GPIO_Pin_2; //key
GPIO_Init_structure.GPIO_Speed=GPIO_Speed_High;
GPIO_Init(GPIOA,&GPIO_Init_structure);
}
void TIMER1_INIT(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1ENR_TIM1, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_Prescaler = 1-1;//(Prescaler + 1) * (Period+1£© = Ãë * ¶¨Ê±Æ÷ʱÖÓÆµÂÊ
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 48000- 1;//48000000/48000=1000
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_Div1;
TIM_TimeBaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStruct);
NVIC_InitTypeDef NVIC_Init_Structure;
NVIC_Init_Structure.NVIC_IRQChannel=TIM1_BRK_UP_TRG_COM_IRQn;
NVIC_Init_Structure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init_Structure.NVIC_IRQChannelPriority=2;
NVIC_Init(&NVIC_Init_Structure);
TIM_ClearFlag(TIM1, TIM_FLAG_Update);
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
}
uint8_t Get_KEY_Num()
{
if(GET_KEY1 == Bit_RESET)
{
return KEY1_NUM;
}
return 0;
}
uint8_t KEY_Main()
{
static uint8_t i,key_num_mode;
key_formerly_num= key_now_num;
key_now_num=Get_KEY_Num();
if(key_formerly_num!=key_now_num && key_now_num==KEY1_NUM)
{
key_num_mode=(key_num_mode+1)%6;
}
switch(key_num_mode)
{
case 0:
GPIO_LED_OFF();
break;
case 1:
GPIO_LED_OPEN();
break;
case 2:
GPIO_LED_OFF();
break;
case 3:
if(times%100==0)
{GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(i & 0x01)); i=~i;times=0;}
break;
case 4:
if (times%500 == 0)
{GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(i & 0x01)); i=~i;times=0;}
break;
case 5:
if (times%1000 == 0)
{GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(i & 0x01)); i=~i;times=0;}
break;
default:
break;
}
return key_num_mode;
}
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
if (RESET != TIM_GetITStatus(TIM1, TIM_IT_Update))
{
KEY_Main();
times++;
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
}
}
key.h:
#ifndef _KEY_H_
#define _KEY_H_
#include "mm32g0001.h"
#define GET_KEY1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)
#define KEY1_NUM 1
void KEY_INIT(void);
void TIMER1_INIT(void);
uint8_t KEY_Main();
#endif /* _MAIN_H_ */
led.c:
#define _GPIO_LED_TOGGLE_C_
#include <stdio.h>
#include "platform.h"
#include "led.h"
void GPIO_LED_Configure(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_SET);
}
void GPIO_IO_Toggle(GPIO_TypeDef *GPIOn, uint16_t PINn)
{
if (Bit_RESET == GPIO_ReadOutputDataBit(GPIOn, PINn))
{
GPIO_SetBits(GPIOn, PINn);
}
else
{
GPIO_ResetBits(GPIOn, PINn);
}
}
void GPIO_LED_Toggle_Sample(void)
{
GPIO_LED_Configure();
while (1)
{
GPIO_IO_Toggle(GPIOA, GPIO_Pin_11);
PLATFORM_DelayMS(500);
}
}
void GPIO_LED_OPEN(void)
{
GPIO_LED_Configure();
GPIO_ResetBits(GPIOA, GPIO_Pin_11);
}
void GPIO_LED_OFF(void)
{
GPIO_LED_Configure();
GPIO_SetBits(GPIOA, GPIO_Pin_11);
}
led.h:
#ifndef _GPIO_LED_TOGGLE_H_
#define _GPIO_LED_TOGGLE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "hal_conf.h"
void GPIO_LED_Configure(void);
void GPIO_LED_Toggle_Sample(void);
void GPIO_LED_OPEN(void);
void GPIO_LED_OFF(void);
#ifdef __cplusplus
}
#endif
#endif /* _GPIO_LED_TOGGLE_H_ */

