写一个stm32oled实时显示时间的代码
时间: 2023-10-12 16:05:11 浏览: 104
STM32:RTC实时时钟-OLED手表日历
以下是基于stm32f1芯片的stm32 oled实时显示时间的代码,可以供您参考:
```
#include "stm32f10x.h"
#include "delay.h"
#include "OLED.h"
void TIM2_IRQHandler(void) //定义定时器中断服务函数
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) //判断是否发生定时中断
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
OLED_ShowTime(); //显示当前时间
}
}
void init_TIM2(void) //初始化定时器2
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
TIM_TimeBaseStructure.TIM_Period = 999; //定时器周期为1ms, 定时时间为1000ms
TIM_TimeBaseStructure.TIM_Prescaler = 7199; //时钟预分频数为7199+1
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器计数方式为向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //允许更新中断
TIM_Cmd(TIM2, ENABLE); //使能定时器2
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2
OLED_Init(); //初始化OLED
init_TIM2(); //初始化定时器2
while(1)
{
//其他代码
}
}
```
在代码中,我们定义了一个定时器中断服务函数TIM2_IRQHandler(),用来在定时中断时更新OLED显示时间。在主函数中,我们先初始化OLED和定时器2,之后进入死循环,此时定时器2会不断运行,不断产生中断,而在定时器中断服务函数中,会不断更新显示时间。需要注意的是,由于是实时显示时间,因此定时器的计时周期应该尽量小,例如在本例中,我们将周期定为1ms,以达到尽量实时显示的效果。
阅读全文