完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
实验工具:MDK5,STM32F103ZET6开发板
使用固件库编程 这次学习定时器的中断,还是利用定时器4,CH2通道。因为都是利用定时器,所以和PWM的程序有很多相似之处,因此在PWM的程序中进行修改即可。 首先需要先了解一下32的定时器; STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。 STM3 的通用 TIMx (TIM2、 TIM3、 TIM4 和 TIM5)定时器功能包括: 1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。 2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。 3) 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: A.输入捕获 B.输出比较 C. PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 E.支持针对定位的增量(正交)编码器和霍尔传感器电路 F.触发输入作为外部时钟或者按周期的电流管理 今天我们用的就是第五种中的更新(溢出)中断, 首先是中断相关的设置 Timer.c #include “Timer.h” #include “led.h” #include “sys.h” void Tim4_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; // 初始化结构体 NVIC_InitTypeDef NVIC_InitStructure; //中断 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能时钟 //相关配置 TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //a number between 0x0000 and 0xFFFF TIM_TimeBaseInitStruct.TIM_Period = arr; //a number between 0x0000 and 0xFFFF TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct); //使能指定的TIM中断 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 //打开定时器 TIM_Cmd(TIM4,ENABLE); } void TIM4_IRQHandler(void) //TIM4中断 { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断标志位:TIM 中断源 LED1=!LED1; } } 新增加的是中断的相关配置,具体可以查看 NVIC_InitTypeDef, 而 ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t)函数则是用来读取中断的类型(比如我们设置的溢出中断),并判断是否发生中断。 void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT) 该函数的作用是,清除定时器 TIMx 的中断 TIM_IT 标志位。 通过上面简单的几步我们就配置好了定时器的中断, 然后我们去设置一下LED相关的配置 #include “led.h” void LED_Init(void) { GPIO_InitTypeDef GPIO_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//定时器时钟使能 GPIO_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_Initstruct.GPIO_Pin=GPIO_Pin_13; //设置引脚 GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;//设置速度 GPIO_Init(GPIOD,&GPIO_Initstruct); } main.c 如果你调试时一直显示 …USERmain.c(13): warning: #223-D: function “xxxx” declared implicitly 尽管你已经添加了相关的xxx.h头文件,不妨试试添加 extern声明一下函数 ,说不定会有惊喜。 只做参考使用,如有不当之处敬请指出。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 08:01 , Processed in 0.732735 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号