STM32
直播中

维生素B2

13年用户 1093经验值
私信 关注
[问答]

如何利用STM32定时器中断来在TFTLCD屏幕上显示动态时间呢

STM32有哪些通用定时器?
如何利用STM32定时器中断来在TFTLCD屏幕上显示动态时间呢?

回帖(1)

吴秀英

2021-11-17 10:47:41
  STM32定时器中断
  STM32有很多通用定时器:以这四个为例,TIM1、TIM2、TIM3、TIM4;使用TIM1需要使能APB2时钟,使用TIM2-4需要使能APB1时钟。
  与外部中断不同,使用定时器中断需要初始化其相应的时钟,包括自动重装载值、预分频值、计数模式等,之后再使能指定的TIMx中断。
  然后再初始化中断优先级分组,之后再写中断服务函数。
  STM32TFTLCD
  TFTLCD的配置驱动以及初始化较多,也没必要深入研究,可以直接使用板子,对于初学者来说主要是会用里面的函数。
  以下例子是利用定时器中断来在TFTLCD屏幕上显示动态时间。
  定时器中断初始化
  #include “timer.h”//timer.c文件
  #include “led.h”
  #include “lcd.h”
  //定时器中断初始化
  //arr自动重装载值
  //psc预分频值
  //这里使用的是TIM3
  void TIM3_Int_Init(u16 arr,u16 psc)
  {
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//时钟使能
  TIM_TimeBaseStructure.TIM_Period = arr; //计数到10000
  TIM_TimeBaseStructure.TIM_Prescaler =psc; //72000000/7200=10k,即10k的计数频率
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式设置为向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据设置的参数进行初始化
  TIM_ITConfig( //使能定时器中断
  TIM3, //TIM2
  TIM_IT_Update ,
  ENABLE //ʹÄÜ
  );
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//使用TIM3中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//设置子优先级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  NVIC_Init(&NVIC_InitStructure); //根据设置的参数进行初始化
  TIM_Cmd(TIM3, ENABLE); //使能TIM3外设
  }
  extern u8 h,m,s;//因为用到了主函数定义的静态变量,在这里使用,所以要加关键字extern
  //进入中断就在TFTLCD屏上显示时间
  void TIM3_IRQHandler(void) //中断服务函数
  {
  if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//检查TIM3中断是否发生
  {
  LCD_ShowNum(30,64,h,2,24);//显示数字
  LCD_ShowNum(66,64,m,2,24);
  LCD_ShowNum(102,64,s,2,24);
  s++;//秒钟加一
  if(s == 60){
  s = 0;
  m++;
  if(m == 60){
  m = 0;
  h++;
  if(h == 24)
  h = 0;
  }
  }
  }
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除中断标志位
  }
  #ifndef __TIMER_H//timer.h文件
  #define __TIMER_H
  #include “sys.h”
  void TIM3_Int_Init(u16 arr,u16 psc);
  #endif
  TFTLCD初始化
  LED初始化
  LED的亮灭可以巧妙得用来判断程序大致哪里出错了,需要以后得实践经验兰感受
  #include “led2.h”//led.c文件
  #include “stm32f10x.h”
  void Init_LED(void)
  {
  GPIO_InitTypeDef str;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOD
  str.GPIO_Mode = GPIO_Mode_Out_PP;//设置输出模式
  str.GPIO_Pin = GPIO_Pin_2;//设置引脚编号
  str.GPIO_Speed = GPIO_Speed_50MHz;//设置翻转速度
  GPIO_Init(GPIOD,&str);//初始化PD2引脚
  GPIO_SetBits(GPIOD,GPIO_Pin_2);//将PD2引脚设置为高电平
  str.GPIO_Mode = GPIO_Mode_Out_PP;
  str.GPIO_Pin = GPIO_Pin_8;
  str.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&str);
  GPIO_SetBits(GPIOA,GPIO_Pin_8);
  }
  #ifndef __LED_H//led.h文件
  #define __LED_H
  #include “sys.h”
  #define LED0 PAout(8) // PA8,设置PA8引脚的电平状态0和1
  #define LED1 PDout(2) // PD2
  void Init_LED(void);
  #endif
  主函数
  #include “led.h”
  #include “delay.h”
  #include “sys.h”
  #include “usart.h”
  #include “lcd.h”
  #include “timer.h”
  u8 h,m,s;
  int main(void)
  {
  h = 10;//小时
  s = 57;//秒
  m = 58;//分钟
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组
  TIM3_Int_Init(9999,7199);//计数时间为1s,即1s进入一次中断,执行中断服务函数
  delay_init();
  uart_init(9600);//串口初始化
  LED_Init();
  LCD_Init();
  POINT_COLOR=RED;//设置字体颜色为红色
  LCD_ShowString(30,40,200,24,24,“TheTimeIs:”);//显示部分
  LCD_ShowString(30,64,200,24,24,“ : : ”);
  LCD_ShowNum(30,64,h,2,24);
  LCD_ShowNum(66,64,m,2,24);
  LCD_ShowNum(102,64,s,2,24);
  while(1){}//死循环以始终能检测到中断
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分