利用正点原子stm32mini板实现计时器秒表功能,时、分、秒、毫秒,WK_UP开始计时,KEY1下一次计时,KEY0暂停计时
1、在定时器定义好需要记录的时间,使用定时器3中断完成定时60s
volatile u32 sec=0;
#define MAXN 1000 //设置秒表记录的最大次数
//数字钟的时,分、秒
u8 hour = 0, minute = 0, second = 0, count = 0, t = 0,actCount;
u8 timeRec[3][MAXN]; //记录5个时间的时分秒 timeRec[0][count]表示时,timeRec[1][count]表示分,timeRec[2][count]表示秒
u16 ms=0;
u8 n=1;
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx
}
2、按键初始化函数,之后在定义开发板上的k1、k2、k3按键的按键处理函数
void KEY_Init(void) //IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}
3、lcd代码可以直接移植过来,这里不做展示
4、主函数自己设计好lcd显示,while循环处理好逻辑思路,开始、暂停、下一次计时等
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
KEY_Init();
TIM3_Int_Init(100,7199);//10Khz的计数频率, 计数到100 表示 10ms
while(1)
{
hour=0, minute=0, second=0, ms=0;
key=KEY_Scan(0); //得到键值
if(key)
{
switch(key)
{
case WKUP_PRES: //开始
hour=timeSFM[0];
minute=timeSFM[1];
second=timeSFM[2];
ms=timeSFM[3];
while(1)
{
LCD_miaobiao();
delay_ms(10);//消抖
t=KEY_Scan(0);
if(t==KEY1_PRES)//下一次重计时
{
second = 0;
minute = 0;
hour = 0;
ms=0;
n++;
y+=40;
LCD_miaobiao();
}
else if(t==KEY0_PRES)//暂停
{
timeSFM[0]=hour;
timeSFM[1]=minute;
timeSFM[2]=second;
timeSFM[3]=ms;
LCD_ShowxNum(70,y,timeSFM[0],2,16,0x80);
LCD_ShowString(90,y,200,2,16,"-");
LCD_ShowxNum(103,y,timeSFM[1],2,16,0x80);
LCD_ShowString(123,y,200,2,16,"-");
LCD_ShowxNum(136,y,timeSFM[2],2,16,0x80);
LCD_ShowString(156,y,200,2,16,"-");
LCD_ShowxNum(169,y,timeSFM[3],2,16,0x80);
break;
}
//break ;
}
break;
}
}//else delay_ms(10);
}
}
其他可自行拓展
附上源码:https://pan.baidu.com/s/1NUk3LNTfpOFReirQNf7D2w
提取码:wvm0