实验2定时器中断及产生PWM实验一、实验目的1.学习STM32微控制器通用定时器的编程方法。2.熟练使用标准外围固件库编程,实现开发板上的LED灯按照一定规律“亮、灭”。3.输出PWM信号,控制LED灯明暗变化二、实验原理1.STM32通用定时器简介STM32F1的通用定时器是一个通过可编程预分频器(PSC)驱动的16位自动装载计数器(CNT)构成。STM32的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)等。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。通用定时器框图:内部时种(CK_NT)米自RCC的TIMCLKETR限性择,迈TIlM池触发润租R至其它定时器控制器IROFDAC/ADCITRImR2ITR3欢翻复位、使递、内工/内下、数rDT12FP2自动重装费寄存器停止,请除或向上向下U-dXCK_CNT+J.CNT计数器CC1CPS入滤波器颂分线OCIREF输花THED插花比较女爱mMX_CH控制和动沿检测器TRC-TIMX_CH1ccalC2T12FP14IC2S2DC编出OC2mMx_CH2输入洗波器预分频器TIMk_CH2海获/比牧2奇存器112FP2和达沿抢到器4TRCCa国分装OFA哺/比较3寄存器JTIMX_CHSTIMx_CH3T13FP控制和边治检测器OCNOC4IC4PSV~T14FP3IC4国T14输入减波器TIMx_CH4预分频器插获/比较4寄存器JTIMx_CH4T14FP42和边沿检测器工TDORea根据控制位的设定,在U事件时传送预加载寄存器的内容至工作寄存器注:事件中断和DMA输出STM3F1的通用TIMx(TIM2、TIM3、TIM4和TIM5)定时器功能包括:1)16位向上、向下、向上/向下自动装载计数器(TIMxCNT)。2)16位可编程(可以实时修改)预分频器(TIMxPSC),计数器时钟频率的分频系数为1~65535之间的任意数值。3)4个独立通道(TIMx_CH1~4),这些通道可以用来作为:A:输入捕获
实验 2 定时器中断及产生 PWM 实验 一、实验目的 1. 学习 STM32 微控制器通用定时器的编程方法。 2. 熟练使用标准外围固件库编程, 实现开发板上的 LED灯按照一定规律“亮、灭”。 3. 输出 PWM 信号,控制 LED 灯明暗变化 二、实验原理 1.STM32 通用定时器简介 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载 计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输 入捕获)或者产生输出波形(输出比较和 PWM)等。使用定时器预分频器和 RCC 时钟控制 器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 通用定时器框图: STM3F1 的通用 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)可使用外部信号(TIMxETR)控制定时器和定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。5)如下事件发生时产生中断/DMA:A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)C.输入捕获D.输出比较E.支持针对定位的增量(正交)编码器和霍尔传感器电路F触发输入作为外部时钟或者按周期的电流管理2.PWM简介脉冲宽度调制(PWM),是英文"PulseWidthModulation的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。本次实验要利用TIM3的CH2输出PWM来控制DSO的亮度。PWM的工作过程:CNTARRCCRx1tt2t3t67it4t5tli1110逻辑0三、实验内容1.使用STM32标准固件库V3.5编写程序,通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED,实现LED1状态取反(闪烁),在主函数用LEDO的翻转来提示程序正在运行,每200ms翻转一次。2.使用STM32标准固件库V3.5编写程序,使用STM32的TIM3来产生PWM输出来控制DSO的亮度。DSO不停的由暗变到亮,然后又从亮变到暗。每个过程持续时间大概为3秒钟左右。四、实验设备1.硬件部分:PC计算机(宿主机)、STM32F103开发板。2.软件部分:PC机WINDOWS系统、MDKKEIL软件。五、实验步骤
B.输出比较 C.PWM 生成(边缘或中间对齐模式) D.单脉冲模式输出 4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控 制另外一个定时器)的同步电路。 5)如下事件发生时产生中断/DMA: A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) C.输入捕获 D.输出比较 E.支持针对定位的增量(正交)编码器和霍尔传感器电路 F.触发输入作为外部时钟或者按周期的电流管理 2.PWM 简介 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲 宽度的控制。本次实验要利用 TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度。 PWM 的工作过程: 三、实验内容 1.使用 STM32 标准固件库 V3.5 编写程序,通过定时器中断配置,每 500ms 中断一 次,然后中断服务函数中控制 LED,实现 LED1 状态取反(闪烁),在主函数用 LED0 的翻转来提示程序正在运行,每 200ms 翻转一次。 2. 使用 STM32 标准固件库 V3.5 编写程序,使用 STM32 的 TIM3 来产生 PWM 输出 来控制 DS0 的亮度。DS0 不停的由暗变到亮,然后又从亮变到暗。每个过程持续时间大概 为 3 秒钟左右。 四、实验设备 1. 硬件部分:PC 计算机(宿主机)、STM32F103 开发板。 2. 软件部分:PC 机 WINDOWS 系统、MDK KEIL 软件。 五、实验步骤
1.定时器中断实验我们将向大家介绍如何使用STM32F1的通用定时器,STM32F1的定时器功能十分强大,有TIME1和TIME8等高级定时器,也有TIME2~TIME5等通用定时器,还有TIME6和TIME7等基本定时器。我们将利用TIM3的定时器中断来控制DS1的翻转,在主函数用DSO的翻转来提示程序正在运行。a)硬件设计本实验用到的硬件资源有:1)指示灯DSO和DS1:2)定时器TIM3。DSO和DS1的电路连接原理图如图所示。而TIM3属于STM32的内部资源,只需要软件设置即可正常工作。LEDOPB5135PB5/2C1SMBAI/SPI3MOSI/I2S3SDPE5LED]PE5/TRACED2/FSMCA21VCC3.3LEDOR15DSOED1510LEDIR19DS1ED1510b)软件实现参考例程:time.c文件代码:#include"timer.h"#include"led.h"/通用定时器3中断初始化/这里时钟选择为APB1的2倍,而APB1为36M/arr:自动重装值。/psc:时钟预分频数//这里使用的是定时器3void TIM3IntInit(ul6arr,ul6psc)TIMTimeBaselnitTypeDefTIM TimeBaseStructureNVICInitTypeDefNVIC InitStructureRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE),//①时钟TIM3使能//定时器TIM3初始化TIM TimeBaseStructure.TIM Period=arr:/设置自动重装载寄存器周期的值1设置时钟频率除数的预分频值TIMTimeBaseStructure.TIMPrescaler=psc:TIMTimeBaseStructureTIMClockDivision=TIMCKDDIVlU设置时钟分害割TIMTimeBaseStructure.TIMCounterMode=TIM_CounterMode_Up;I/TIM向上计数TIMTimeBaselnit(TIM3,&TIMTimeBaseStructure))I/②初始化TIM3TIM_ITConfig(TIM3TIMITUpdateENABLE)/③允许更新中断
1. 定时器中断实验 我们将向大家介绍如何使用 STM32F1 的通用定时器,STM32F1 的定时器功能十分强 大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。我们将利用 TIM3 的定时器中断来控制 DS1 的翻转,在主函数用 DS0 的翻转来提示程序正在运行。 a) 硬件设计 本实验用到的硬件资源有: 1)指示灯 DS0 和 DS1; 2)定时器 TIM3。 DS0 和 DS1 的电路连接原理图如图所示。而 TIM3 属于 STM32 的内部资源,只需 要软件设置即可正常工作。 b) 软件实现 参考例程: time.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 使能 //定时器 TIM3 初始化 TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计 数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //②初始化 TIM3 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //③允许更新中断
//中断优先级NVIC设置/TIM3中断NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0,II先占优先级0级II从优先级3级NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;NVICInitStructure.NVICIRQChannelCmd=ENABLE,//IRQ通道被使能NVICInit(&NVICInitStructure);II④初始化NVIC寄存器TIM Cmd(TIM3,ENABLE);/使能TIM3///定时器3中断服务程序6ITIM3中断voidTIM3 IRQHandler(void)if(TIM_GetITStatus(TIM3,TIMITUpdate)!=RESET)/更新中断发生与否1TIMClearITPendingBit(TIM3,TIMITUpdate),I/清除更新中断标志LEDI=ILEDI;11该文件下包含一个中断服务函数和一个定时器3中断初始化函数,中断服务函数比较简单,在每次中断后,判断TIM3的中断类型,如果中断类型正确(溢出中断),则执行LED1(DS1)的取反。TIM3_Int_InitO)函数的2个参数用来设置TIM3的溢出时间。系统初始化的时候在默认的系统初始化函数Systemlnit函数里面已经初始化APB1的时钟为2分频,所以APB1的时钟为36M,而从STM32的内部时钟树图得知:当APB1的时钟分频数为1的时候,TIM2~7的时钟为APB1的时钟,而如果APB1的时钟分频数不为1,那么TIM2~7的时钟频率将为APB1时钟的两倍。因此,TIM3的时钟为72M,再根据我们设计的arr和psc的值,就可以计算中断时间了。计算公式如下:Tout= (arr+1)*(psc+1))/Tclk其中:Tclk:TIM3的输入时钟频率(单位为Mhz)Tout:TIM3溢出时间(单位为us)timer.h文件代码:#ifndef_TIMER_H#define_TIMER_H#include"sys.h"voidTIM3_Int_Init(ul6arr,ul6psc);#endif主程序main.c:#include"led.h"#include"delay.h"#include"sys.h"#include"usart.h
//中断优先级 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); //⑤使能 TIM3 } //定时器 3 中断服务程序⑥ void TIM3_IRQHandler(void) //TIM3 中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除更新中断标志 LED1=!LED1; } } 该文件下包含一个中断服务函数和一个定时器 3 中断初始化函数,中断服务函数比 较简单,在每次中断后,判断 TIM3 的中断类型,如果中断类型正确(溢出中断),则执 行 LED1(DS1)的取反。 TIM3_Int_Init()函数的 2 个参数用来设置 TIM3 的溢出时间。系统初始化的时候在 默认的系统初始化函数 SystemInit 函数里面已经初始化 APB1 的时钟为 2 分频,所以 APB1 的时钟为 36M,而从 STM32 的内部时钟树图得知:当 APB1 的时钟分频数为 1 的 时候,TIM2~7 的时钟为 APB1 的时钟,而如果 APB1 的时钟分频数不为 1,那么 TIM2~7 的时钟频率将为 APB1 时钟的两倍。因此,TIM3 的时钟为 72M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下: Tout= ((arr+1)*(psc+1))/Tclk 其中: Tclk:TIM3 的输入时钟频率(单位为 Mhz) Tout:TIM3 溢出时间(单位为 us) timer.h 文件代码: #ifndef _TIMER_H #define _TIMER_H #include "sys.h" void TIM3_Int_Init(u16 arr,u16 psc); #endif 主程序 main.c: #include "led.h" #include "delay.h" #include "sys.h" #include "usart.h
#include"timer.h"int main(void)1delay_ init),1延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)://设置NVIC中断分组2uartinit(115200);//串口初始化波特率为115200LED_InitO;I/LED端口初始化TIM3IntInit(49997199)://10Khz的计数频率,计数到5000为500mswhile(1)LEDO-ILEDO:delay ms(200),事此段代码对TIM3进行初始化之后,进入死循环等待TIM3溢出中断,当TIM3CNT的值等于TIM3ARR的值的时候,就会产生TIM3的更新中断,然后在中断里面取反LED1,TIM3CNT再从0开始计数。根据上面的公式,我们可以算出中断溢出时间为500ms,即Tout=(4999+1)*(7199+1)/72=500000us=500ms。c)编译并下载按Build编译工程,编译成功后显示没有错误和警告,并且在OBJ目录下面生成了hex文件(TIMER.hex)。将USB转MINIUSB线一端连接计算机,一端连接开发板USB232端口(USB转串口),打开开发板电源开关,开发板上PWR指示灯会亮,表示电源接通。打开上位机软件flymcu,点击菜单栏的搜索串口,自动找到CH340虚拟串口,波特率设置为460800,然后选择上一步编译生成的Hex文件(TIMER.hex),并进行如图7所示设置后,点击“开始编程”下载代码到开发板,即可看到程序运行的结果(如参考例程实验现象为:DS0不停闪烁,每40Oms闪烁一次,DS1也不停闪烁,但是闪烁时间较DSO慢,1s一次)。FlyMcuVo.188--单片机在线编程专家--www.mcuisp.comOX系统(X)帮助(M)Language搜素串(V)Port:COM3bps:76800www.mcuisp.com编程器W))关于(Z)..联机下载时的程序文件:C:/Users/Administrator/Desktop(Template|OBJ|Template.hex编程前重装文件手持万用编程器STMISP免费STMIAPNXPISPEP968RS232林吧【编程后执行开始编程(P)便用Ram连续烧录模式读器件信息(R)读FLASH清除芯片(2)选项字节区:编程到FLASH时写选项字节设定选项字节等-DTR的低电平复位,RTS高电平进BootLoader
#include "timer.h" int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2 uart_init(115200); //串口初始化波特率为 115200 LED_Init(); //LED 端口初始化 TIM3_Int_Init(4999,7199); //10Khz 的计数频率,计数到 5000 为 500ms while(1) { LED0=!LED0; delay_ms(200); } } 此段代码对 TIM3 进行初始化之后,进入死循环等待 TIM3 溢出中断,当 TIM3_CNT 的值等于 TIM3_ARR 的值的时候,就会产生 TIM3 的更新中断,然后在中断里面取反 LED1,TIM3_CNT 再从 0 开始计数。根据上面的公式,我们可以算出中断溢出时间为 500ms,即 Tout= ((4999+1)*( 7199+1))/72=500000us=500ms。 c) 编译并下载 按 Build 编译工程,编译成功后显示没有错误和警告,并且在 OBJ 目录下面生成 了 hex 文件(TIMER.hex)。 将 USB 转 MINIUSB 线一端连接计算机,一端连接开发板 USB_232 端口(USB 转 串口),打开开发板电源开关,开发板上 PWR 指示灯会亮,表示电源接通。 打开上位机软件 flymcu,点击菜单栏的搜索串口,自动找到 CH340 虚拟串口,波 特率设置为 460800,然后选择上一步编译生成的 Hex 文件(TIMER.hex),并进行如图 7 所示设置后,点击“开始编程”下载代码到开发板,即可看到程序运行的结果(如参 考例程实验现象为:DS0 不停闪烁,每 400ms 闪烁一次,DS1 也不停闪烁,但是闪烁时 间较 DS0 慢,1s 一次)