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