学习笔记STMF4 TIMER定时器(使用开发板立创天空星STMF4)

目录

                                                #定时器的介绍

             #怎么去理解定时器的预分频系数

        

                                            #使用定时器实现完成触发中断

  #定时器触发中断基本函数配置

#在使用TIMER  触发中断的时候为什么不需要配置EXTI中断这个选项

                                    

                                                #使用定时器完成输出PWM

#PWM基本知识介绍

#函数配置生成PWM


        这个系列所有笔记用来记录,笔者学习过程中,产生的疑惑,个人的理解,同时掺杂着个人理解,希望对各位读者姥爷有帮助,参考文章连接在最后

                                                #定时器的介绍

        这是一张,数据手册里面的定时器框图,里面是定时器这个外设的整体运作模式,比较重要。

         TIMER   定时器  单片机开发的一种常用外设,定时器类型分为   高级定时器  通用定时器  基本定时器  这三种,这里需要注意的是,只有高级定时器,通用定时器,具有四个输出通道,这四个通道对应四个引脚,总的来说就是一个定时器,可以作用四个引脚,让这四个引脚,使用定时器的功能,具体功能注释如下。

                               输入捕获(input captuer)测量输入PWM 频率 间隔  波形

                               输出比较(input compare)用于输出PWM

                               PWM输出(pwm generation) 用于输出PWM,与上者相同

                               单脉冲模式(one-pluse mode output)

        同时这里要注意,基本定时器,没有能力使用以上四个功能,主要用于驱动DAC,可以参考下文数据手册,读者姥爷们,那有的读者姥爷就要问了,定时器不同的类型,到底有什么具体的不同,具体参考中文数据手册,手册连接放在最后

        高/普 定时器,上面这个多功能描述,最为常用的定时器,作用其实是,输出比较输出PWM,定时器触发中断,本篇主要简单介绍,定时器,以及使用STMF4完成举例。

             #定时器预分频系数,周期相关介绍

        

        这一部分其实对应着时基单元,PSC:预分频系数 ,对timer时钟(CK_PSC)进行分频结果为cnt  CNT:计时器时钟(这里注意不是,定时器时钟)ARR:自动重装载值,当CNT的值达到ARR的值就会触发中断,具体计算公式如下

                                                CK_CNT=CK_PSC/(PSC+1)

        这里解释一下为什么PSC要+1,PSC预分频系数 16位寄存器取值0~65535之间,在软件中赋值结构体变量 PSC 后面通常是跟-1的,所以在公式中,给+1了(个人看法)所以就+1,这些东西就是 TIM_TimeBaseInitTypeDef,这个结构体变量需要配置的东西,需要注意的是,ARR就是TIM_Period,也就是自动重装载值,当CNT计数到达,ARR,会重头开始计数。

                                            #使用定时器实现完成触发中断

  #定时器触发中断基本函数配置

        首先,我们来看一下,timer.c文件中的介绍配置流程 ,然后我们按照这个流程进行,函数配置,

void Timer_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//EBABLE TIMER3 ClockTIM_TimeBaseInitTypeDef TimerBaseInitStructure;//配置  timer  struct 变量
TimerBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	
TimerBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;
TimerBaseInitStructure.TIM_Period  = 10000;
TimerBaseInitStructure.TIM_Prescaler  = 8400 - 1; TIM_TimeBaseInit(TIM3, &TimerBaseInitStructure);//初始化  timerNVIC_InitTypeDef NVIC_InitStructure;//配置 inturputer control 管理器
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);//开启  timer3 中断	
TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void)
{if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){ // {}中为中断处理printf("IRQHandler!!!\r\n");// 反转LED灯if( flag == 0 ){GPIO_SetBits(GPIOB, GPIO_Pin_2);flag = 1;}else{GPIO_ResetBits(GPIOB, GPIO_Pin_2);flag = 0;}}TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}

        按照上述流程,这边配置好了,timer的初始化,然后配置,timer3 中断的响应函数,然后下面在配置,一下串口和板载LED

void uart1_init(uint32_t __Baud)
{GPIO_InitTypeDef GPIO_InitStructure;	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//IO口用作串口引脚要配置复用模式GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_9;//TX引脚GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_AF;//IO口用作串口引脚要配置复用模式GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin           = GPIO_Pin_10;//RX引脚GPIO_InitStructure.GPIO_Mode          = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType         = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd          = GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;//定义配置串口的结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启串口1的时钟USART_DeInit(USART1);//大概意思是解除此串口的其他配置USART_StructInit(&USART_InitStructure);USART_InitStructure.USART_BaudRate              = __Baud;//设置波特率USART_InitStructure.USART_WordLength            = USART_WordLength_8b;//字节长度为8bitUSART_InitStructure.USART_StopBits              = USART_StopBits_1;//1个停止位USART_InitStructure.USART_Parity                = USART_Parity_No ;//没有校验位USART_InitStructure.USART_Mode                  = USART_Mode_Rx | USART_Mode_Tx;//将串口配置为收发模式USART_InitStructure.USART_HardwareFlowControl   = USART_HardwareFlowControl_None; //不提供流控 USART_Init(USART1,&USART_InitStructure);//将相关参数初始化给串口1USART_ClearFlag(USART1,USART_FLAG_RXNE);//初始配置时清除接受置位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//初始配置接受中断USART_Cmd(USART1,ENABLE);//开启串口1NVIC_InitTypeDef NVIC_InitStructure;//中断控制结构体变量定义NVIC_InitStructure.NVIC_IRQChannel                    = USART1_IRQn;//中断通道指定为USART1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = 0;//主优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority         = 1;//次优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd                 = ENABLE;//确定使能NVIC_Init(&NVIC_InitStructure);//初始化配置此中断通道}

void LED_GPIO_Init(void)
{//板载LED引脚初始化配置RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}

        这里基本配置完成之后,然后扔到main()里面去调用,然后实验现象是,串口每秒打印IRQHandler,同时板载LED每秒进行闪烁。

#include "board.h"
#include "bsp_uart.h"
#include <stdio.h>
#include  "button.h"
#include  "exti.h"
#include "timer.h"
extern uint8_t  flag;//
void TIM3_IRQHandler(void);//声明末尾定义的函数int main(void)
{LED_GPIO_Init();board_init();uart1_init(9600);flag = 0;Timer_Init();while(1){}}
#在使用TIMER  触发中断的时候为什么不需要配置EXTI中断这个选项

       EXTI(External interrupt/event controller)外部中断/事件控制器,片上外设之一,能够检测外部输入信号边沿产生变化时(上升  下降  ),并由此产生中断,通常用于GPIO这种不能自己产生中断源 的片上外设,而timer定时器  这个片上外设本身可以产生 中断源,自然也就使用不到   exti 在此产生中断源进行配置  timer  产生中断源  nvic 在进行配置  在编写  中断响应函数  然后就能使用  ,所以timer定时器  配置使用不到  exti 这个片上外设  功能   使用 exti 的配置流程如下  本文实验中断流程如

 GPIO (电平发声变化)-> EXTI(产生中断源) ->NVIC(配置中断优先级)  ->IRQ(定义函数)

        TIMER(产生中断源) ->NVIC(配置中断优先级)  ->IRQ(编写中断响应函数)

       总结:TIMER 片上外设本身可以产生中断源  不需要在使用 EXTI 这个片上外设  在此产生中断源  所以不需要使用  EXTI 这个片上外设去产生中断源   EXTI这个片上外设 一般用于检测 GPIO

引脚出现电平 变化的时候  触发产生中断源  进行触发中断使用  

                                    

                                                #使用定时器完成输出PWM

#PWM基本知识介绍

         冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。

        这句话描述的是物理学中的动量守恒原理,同时也是PWM能够生成指定电压的原理,特别是在信号处理或控制系统分析中的应用。当两个形状不同的窄脉冲(可以理解为短暂且强度大的力或者能量输入)对一个具有惯性的系统施加作用时,如果它们的总冲量(即在时间上的力与持续时间的乘积,等于物体动量的变化量)相等,那么最终系统的行为——比如位移、速度或加速度变化——将基本相似,尽管输入的脉冲形状不同。

        这反映了无论输入信号如何变化,只要总的动量转移是相同的,系统的响应将是类似的,因为系统的动态响应主要取决于冲量,而不是脉冲的具体形状。这也是工程设计中经常考虑的一种简化模型,PWM就像是BUCK电路,通过开关来控制电压稳定在指定的范围,而PWM是控制占空比,就是高电平的在整个周期内的占比,来控制整体输出电压,控制在指定范围输出,PWM(Pulse Width Modulation脉宽调制)

                                        频率:PWM的频率是整个周期的倒数。

                                        占空比:占空比是指一个周期内高电平所占的比例。

        单片机 高电平是 3.3V  低电平是   0V  那么问题来了,如果需要输出1.65V,那么就需要使用PWM这个模式输出电平,简单原理阐述,PWM输出不同电压电平,是利用高电平在一段时间周期里面的占比,这一段时间周期通常     ms为单位,从而显示出不同的电平,

                                                        50%   对应  3.3*0.5 =1.65V  

                                                        60%   对应 3.3*0.6 = 1.98V

        具体不同占空比,对应多少V电压就是这么换算的,

#函数配置生成PWM

        timer,外设输出PWM,也就是定时器框图的这一部分,一个定时器的OC(输出比较),有四个引脚可以使用,进行输出PWM,也就是 TIM_CH1 TIM_CH2 TIM_CH3 TIM_CH4 ,

void PWM_GPIO_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_TIM3);//开启复用模式 GPIOB5不在作为 普通GPIO引脚使用  而是作为timer 输出PWM通道使用 }
void Time_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStruct.TIM_Period = 1000;
TIM_TimeBaseStruct.TIM_Prescaler = 500 - 1; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct); }
void Timer_OCInit(void)
{
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = ENABLE;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC2Init(TIM2,&TIM_OCInitStruct);//输出通道2 InitTIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
//enable  CC2R 也就是 TIM_SetCompare2(timx,cc2r)	就是开启这个函数TIM_Cmd(TIM3, ENABLE);  //使能TIM3}
void pwm_breathing_lamp(void)
{uint32_t brightness = 0;// 当前亮度int step = 10;          // 亮度改变的步长// 逐渐增加亮度for(brightness = 0; brightness < 1000; brightness += step){TIM_SetCompare2(TIM3, brightness); // 使用TIM3的Channel 2delay_ms(10);}// 逐渐减少亮度for(brightness = 1000; brightness > 10; brightness -= step){TIM_SetCompare2(TIM3, brightness); // 使用TIM3的Channel 2delay_ms(10);}
}   
int main(void)
{board_init();uart1_init(9600);PWM_GPIO_Init();Time_Init();Timer_OCInit();while(1){pwm_breathing_lamp();}
}

        【立创·天空星STM32F407VET6】入门手册 - 飞书云文档 (feishu.cn)

        链接:https://pan.baidu.com/s/12SM_KSvwXXyTqAvosVA-gQ 
        提取码:zhiy

        最后希望对你有所帮助!!!个人理解,如有失误,欢迎指出,核实立改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OnlyOffice】 桌面应用编辑器,版本8.1发布,PDF编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等功能,快来体验吧

继 ONLYOFFICE 文档 8.1 发布后&#xff0c;适用于 Linux、Windows 和 macOS 的 ONLYOFFICE 桌面应用程序最新版本也已推出。它具有在线套件的最主要功能&#xff0c;例如功能齐全的 PDF 编辑器、演示文稿中的幻灯片版式、改进的 RTL 支持、新的本地化选项等。 目录 ONLYOFFICE…

手机看cad图的软件有哪些?软件推荐

手机看cad图的软件有哪些&#xff1f;随着科技的不断发展&#xff0c;CAD图纸在手机上的查看和编辑需求日益增加。为了满足这一需求&#xff0c;市面上涌现出了众多手机CAD看图软件。本文将为大家推荐四款优秀的手机CAD看图软件&#xff0c;并分别介绍它们的功能特点、受众定位…

JavaScript的学习之DOM简介

目录 一、DOM是什么 二、节点是什么&#xff08;Node&#xff09; 三、代码示例 一、DOM是什么 DOM全称Document Object Model文档对象模型 文档&#xff1a;表示整个HTML网页文档 对象&#xff1a;表示网页中的每一个部分转换为一个对象 模型&#xff1a;表示对象之间的关系…

LabVIEW开发电气设备检测与管理系统

设计并实现了一个基于LabVIEW的电气设备检测与管理系统&#xff0c;采用了先进的硬件设备&#xff08;NI PXI-6289数据采集卡、Fluke 434电能质量分析仪和Schneider PM5560电力监控仪&#xff09;&#xff0c;通过实时采集、处理与存储电气设备数据&#xff0c;提高了电气设备的…

Go语言JSON-RPC 实战: `net/rpc/jsonrpc` 包的高效使用指南

Go语言JSON-RPC 实战&#xff1a; net/rpc/jsonrpc 包的高效使用指南 简介jsonrpc 包的基础客户端&#xff08;Client&#xff09;创建客户端调用方法 服务器&#xff08;Server&#xff09;配置服务器数据类型和错误处理 搭建基础的 JSON-RPC 服务服务端的实现客户端的实现 进…

60.Python-web框架-Django手动删除了一个数据库表,migrate问题

目录 1.问题产生 2.解决方法&#xff1a; 1.问题产生 今天手欠&#xff0c;删了一个数据库表&#xff0c;然后迁移不进来了。 当你在Django项目中手动删除了数据库模型&#xff08;models&#xff09;的表后&#xff0c;想要Django通过makemigrations命令重新创建或识别这些更…

[数据集][目标检测]斑马线人行横道检测数据集VOC+YOLO格式793张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;793 标注数量(xml文件个数)&#xff1a;793 标注数量(txt文件个数)&#xff1a;793 标注类别…

“拿来主义”学习元素裁剪(附源码)

“拿来主义”学习元素裁剪 欢迎关注&#xff1a; 小拾岁月&#xff0c;获取源码。 参考链接&#xff1a;https://mp.weixin.qq.com/s/TsOOhUAff6OeqPW7A9JuaQ 预期效果图 需求分析 首先从需求上来看&#xff0c;需要一个主元素用于展示用户头像。例外&#xff0c;在页面无操…

游戏AI的创造思路-技术基础-深度学习(3)

继续填坑&#xff0c;本篇介绍深度学习中的长短期记忆网络~~~~ 目录 3.3. 长短期记忆网络&#xff08;LSTM&#xff09; 3.3.1. 什么是长短期记忆网络 3.3.2. 形成过程与运行原理 3.3.2.1. 细胞状态与门结构 3.3.2.2. 遗忘门 3.3.2.3. 输入门 3.3.2.4. 细胞状态更新 3.…

Unity通过Package Manager导入Newtonsoft.Json或叫Json.NET

Unity打开Package Manager窗口: 输入: com.unity.nuget.newtonsoft-json

重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 &#xff08;添加、旋转、删除&#xff09; 插入和调整各种对象&#xff0c;例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…

【实用软件】HyperSnap软件下载及详细安装教程

​不得不说HyperSnap是一款拥有20多年历史的老牌屏幕截图软件&#xff0c;屏幕截图专家&#xff0c;电脑屏幕截图、GAME画面捕捉、视频抓取工具&#xff0c;多种截图方式满足任何区域截图&#xff0c;特色功能有&#xff1a;文本捕捉、图片编辑、滚动页面、延迟捕获。从大部分从…

【C++/STL】:优先级队列(priority_queue)的使用及底层剖析仿函数

目录 &#x1f4a1;前言一&#xff0c;优先级队列的使用二&#xff0c;仿函数1&#xff0c;什么是仿函数2&#xff0c;仿函数的简单示例 三&#xff0c;优先级队列的底层剖析 &#x1f4a1;前言 优先队列(priority_queue)是一种容器适配器&#xff0c;默认使用vector作为其底层…

MindManager2024思维导图电脑版下载,你的思维管理神器!

&#x1f9e0; 思维导图界的革命性更新&#xff01; 亲爱的小红书的朋友们&#xff0c;今天我要和你们分享一个我近期发现的神器——MindManager2024思维导图软件&#xff01;这不仅仅是一个软件&#xff0c;它简直是我工作学习中的得力助手。想象一下&#xff0c;你的大脑中那…

MindManager2024思维导图软件重磅发布更新!

大家好啊&#xff01;&#x1f44b; 今天我超级激动要分享给大家一款改变我工作和学习方式的工具——MindManager2024思维导图软件&#xff01;这可不仅仅是个工具哦&#xff0c;它更像是我的私人思维助手&#xff0c;帮我整理思绪&#xff0c;规划时间&#xff0c;还能激发创新…

当你在浏览器输入一个地址

你在浏览器中输出了一个地址&#xff0c;回车后&#xff0c;一直到显示页面&#xff0c;中间经历了哪些过程 &#xff1f; 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL&#xff08;例如 http://example.com&#xff09;并按下回车键。 2. DNS 解析 浏览…

猫狗识别—静态图像识别

猫狗识别—静态图像识别 1. 导入必要的库:2. 设置数据目录和模型路径:3. 定义图像转换4. 使用GPU5. 加载没有预训练权重的ResNet模型6. 创建Tkinter窗口:7.定义选择图片的函数:8.定义预测图片的函数:9.退出程序的函数:10.创建按钮:11.运行Tkinter事件循环:12. 完整代码&#xf…

Chrome谷歌浏览器如何设置,才能正常使用?

Chrome浏览器&#xff0c;也被称为谷歌浏览器&#xff0c;由于简洁的界面设计&#xff0c;极快的响应速度&#xff0c;强大的插件商店&#xff0c;在全球浏览器市场份额中一直都处于遥遥领先的地位。但是因为2010年谷歌宣布退出中国&#xff0c;国内不能再使用谷歌的服务&#…

【仿真建模-解析几何】求有向线段上距指定点最近的坐标

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 问题描述&#xff1a; 有向线段起点A为&#xff08;x1&#xff0c;y1&#xff09;&#xff0c;终点B为&#xff08;x2&#xff0c;y2&a…

HTML+CSS 3D旋转登录表单

效果演示 实现了一个具有3D旋转效果的登录框&#xff0c;背景为太空图片&#xff0c;登录框位于太空中心&#xff0c;可以通过输入用户名和密码进行登录。登录框使用了CSS3的3D变换和动画效果&#xff0c;使其具有立体感和动态效果。同时&#xff0c;登录框的样式也经过精心设计…