stm32-定时器中断
2017-03-05 21:11
183 查看
由于现在是在学用库函数操作,我的目标是知道用到的每个函数的作用,需要的时候可以加以更改使用,所以关键是要怎么知道stm32各函数的作用
虽然从名字上也能知道个大概,但是细节还是要查stm32参考手册,准确的说是技术参考手册(主要讲如何使用),另有数据手册(注重数据的描述如内存,电压电流等)
至于怎么查 这个估计需要经验,我的一点心得是:在代码里右键 点go to definition。。。想办法找到这个代码具体操作的是哪个寄存器的哪一位,再去手册看这个位的作用。
下面两张图主要是说明定时器时钟来源
以下为代码
最后 注意
NVIc里的寄存器如iser是在这里面才找得到描述
虽然从名字上也能知道个大概,但是细节还是要查stm32参考手册,准确的说是技术参考手册(主要讲如何使用),另有数据手册(注重数据的描述如内存,电压电流等)
至于怎么查 这个估计需要经验,我的一点心得是:在代码里右键 点go to definition。。。想办法找到这个代码具体操作的是哪个寄存器的哪一位,再去手册看这个位的作用。
下面两张图主要是说明定时器时钟来源
以下为代码
#include "timer.h" #include "led.h" //中断管理函数主要在misc里定义 //通用定时器中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数,psc接收的是TIMx_clk,是apb1倍频后再根据psc分频 //这里使用的是定时器3! 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; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms,就是设定中断发生周期 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim 时钟分割定义的是在定时器时钟频率(CK_INT)与数字滤波器(ETR,TIx)使用的采样 //频率之间的分频比例。数字滤波器(ETR,TIx)是为了将ETR进来的分频后的信号滤波,保证通过信号频率不超过某个限定。当fCK_INT=72MHz时,选择fDTS=fCK_INT/2=36MHz, //采样频率fSAMPLING=fDTS/2=18MHz且N=6,则频率高于3MHz的信号将被这个滤波器滤除,有效地屏蔽了高于3MHz的干扰。fDTS=fCK_INT/2=36MHz这里的2就是可以设置的 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig( //使能或者失能指定的TIM中断 TIM3, //TIM2 TIM_IT_Update ,//中断类型,如更新中断(就是cnt到了arr就重装),触发中断,输入捕获中断 ENABLE //TIMx_DIER寄存器,应该是dma或时钟专用的开关 ); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //指明中断名称 在stm32f10x.h中定义 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级,即抢占优先级,是对抢占时的优先级的划分,高优先级能打断低优先级,能有嵌套关系 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级,相同抢占优先级时,不能相互打断,但同时发生时根据响应优先级来决定谁先,且不能有嵌套关系,另外两个优先级都相同时谁先就谁先执行 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能,操作ISER寄存器,这是在NVIC中断控制器中允许 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设,开启定时器 TIMx_CR1寄存器 } void TIM3_IRQHandler(void) //TIM3中断 名字在startup中定义 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 ,判断中断类型(此处是更新中断) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 LED1=!LED1; } }
#include "led.h" #include "delay.h" #include "sys.h" #include "timer.h" //ALIENTEK Mini STM32开发板范例代码7 //定时器中断实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2,分组x,则x位抢占优先级,(4-x)位响应优先级 LED_Init(); //初始化与LED连接的硬件接口 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms 72mhz/7200=10000hz while(1) { LED0=!LED0; delay_ms(200); } }
最后 注意
NVIc里的寄存器如iser是在这里面才找得到描述
相关文章推荐
- STM32实验1:定时器中断同时产生两路不同频率的信号
- 原子战舰STM32——定时器捕获中断库函数程序中中断处理函数说明
- STM32定时器中断实验-TIM3
- STM32定时器中断关于何时清除中断的总结
- STM32 定时器中断
- STM32串口采样与仪表步进电机控制程序(主程序与串口程序,需用正点原子定时器中断实验程序模板)
- 解决STM32开启定时器时立即进入一次中断程序问题
- stm32之定时器中断
- STM32单片机学习(5) 定时器中断实验
- STM32学习笔记——定时器中断(向原子哥学习)
- stm32通用定时器中断问题
- stm32定时器中断
- STM32外部中断及定时器编程示例
- Stm32定时器中断触发AD采样
- STM32的定时器中断
- cortex_m3_stm32嵌入式学习笔记(八):定时器中断实验(定时器的更新中断)
- STM32学习笔记6-定时器中断
- [转]STM32学习笔记6-定时器中断
- stm32通用定时器进入不了中断
- <抄>STM32 定时器有时一开启就进中断的问题