完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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){}//死循环以始终能检测到中断 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1909 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1678 浏览 1 评论
1172 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
771 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1732 浏览 2 评论
1973浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
807浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
257浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
625浏览 3评论
634浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-24 19:31 , Processed in 0.660477 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号