STM32定时器中断及TFTLCD显示

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初始化

由于代码量太多,我就贴在这里面:tftlcd.c文件tftlcd.h文件

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){}//死循环以始终能检测到中断
}

发布了36 篇原创文章 · 获赞 9 · 访问量 6170

猜你喜欢

转载自blog.csdn.net/qq_43628761/article/details/103974519