STM32实验1:定时器中断同时产生两路不同频率的信号
来源:互联网 发布:mac os 10.12.6怎么样 编辑:程序博客网 时间:2024/05/24 01:45
STM32实验1:定时器中断同时产生两路不同频率的信号
一、实验目的
使用STM32同时产生两路不同频率的信号,并通过观察开发板两个LED闪烁快慢的现象,以及在MDK5中软件仿真逻辑分析中查看波形,体现两路信号频率的不同。
二、实验原理
通过定时器中断配置,定时器3每600ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁);定时器4每200ms中断一次,然后中断服务函数中控制LED实现LED0状态取反(闪烁)。
本实验用到的硬件资源有:
1) 指示灯 LED0 和 LED1
2) 定时器 TIM3,TIM4
TIM3,TIM4属于 STM32 的内部资源,只需要软件设置即可正常工作。
1、通用定时器电路框图
2、计数器模式
采用向上计数
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
3、信号周期计算(定时器溢出时间)
TIM3 的时钟为 72 M,再根据我们设计的 arr 和 psc的值, 就可以计算中断时间了。公式如下:
Tout= ((arr +1)*(psc+1)) /Tclk;
其中:
Tclk :TIM3 的输入时钟频率 (单位为 Mhz)。
Tout :TIM3 溢出时间(单位为 us)。
4、定时器中断实现步骤
(1) 能定时器时钟。
RCC_APB1PeriphClockCmd();
(2) 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
(3) 开启定时器中断,配置NVIC。
void TIM_ITConfig();
NVIC_Init();
(4) 使能定时器。
TIM_Cmd();
(5) 编写中断服务函数。
TIMx_IRQHandler();
三、实验代码
timer.c
#include "timer.h"#include "led.h"//通用定时器3中断初始化//这里时钟选择为APB1的2倍,而APB1为36M//arr:自动重装值。//psc:时钟预分频数//这里使用的是定时器3!void TIM3_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 //定时器TIM3初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 //中断优先级NVIC设置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx }//定时器3中断服务程序void TIM3_IRQHandler(void) //TIM3中断{ if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志 LED1=!LED1; }}//这里使用的是定时器4!void TIM4_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能 //定时器TIM4初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断 //中断优先级NVIC设置 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寄存器 TIM_Cmd(TIM4, ENABLE); //使能TIMx }//定时器4中断服务程序void TIM4_IRQHandler(void) //TIM4中断{ if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查TIM4更新中断发生与否 { TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中断标志 LED0=!LED0; }}
main.c
#include "led.h"#include "delay.h"#include "key.h"#include "sys.h"#include "usart.h"#include "timer.h" int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 TIM3_Int_Init(5999,7199);//10Khz的计数频率,计数到6000为600ms TIM4_Int_Init(1999,7199);//10Khz的计数频率,计数到2000为200ms while(1) { } }
四、结果分析
1、MDK5的软件仿真中的逻辑分析
波形对应LED说明如下
2、开发板现象
如图
LED0红色灯闪的更快,差不多是红色灯闪3次,绿色灯闪1次。
这与软件仿真相符。
- STM32实验1:定时器中断同时产生两路不同频率的信号
- STM32一定时器产生不同频率的PWM
- STM32一定时器产生不同频率的PWM
- 使用STM32的单个普通定时器产生4路不同频率的方波
- STM32 定时器(二)——定时器产生不同频率的PWM
- stm32定时器中断实验
- STM32学习-定时器中断实验
- STM32定时器中断实验-TIM3
- STM32的定时器中断
- MSP430用按键中断控制定时器产生持续 1s 的周期信号
- STM32单片机学习(5) 定时器中断实验
- STM32 TIM测 输入信号的 频率
- 怎么用STM32配置产生PWM(一个定时器用输出比较方式产生不同频率的PWM)
- 产生多路不同频率方波
- 产生多路不同频率方波
- 产生多路不同频率方波
- avr串口通信和定时器产生矛盾(两种中断方法声明的异同)
- STM32 普通定时器(TIM3)中断 实现流水灯实验
- 求最大公约数和最小公倍数的常用解法
- jar与zip有什么区别?
- GoogLeNet网络结构学习
- windows ping 虚拟机linux系统出现请求超时
- CDocTemplate::GetDocString
- STM32实验1:定时器中断同时产生两路不同频率的信号
- 数据库的视图与索引——自学篇
- Android开源项目LoopViewPage使用
- sql server 2012导出mdb文件或者.accdb文件扩展名
- c++学习之类的组合、聚合
- ContextMenu菜单详解
- Spring自动装配
- keepalived + redis高可用方案
- Unity(2017版本)嵌入现有iOS工程