STM32入门开发操作记录(九)——外部时钟定时器

目录

  • 一、项目准备
    • 1. 工程模板
    • 2. 器件接线
  • 二、外部时钟
    • 1. 端口复用
    • 2. 流程示意
  • 三、定时器模块
    • Timer.c
    • Timer.h
  • 四、遮光计数

一、项目准备

1. 工程模板

  本篇项目所用模板包含以下模块,声明函数见头文件,模块添加和函数功能详见往期记录。
请添加图片描述

2. 器件接线

  主装置:ST-Link仿真器,STM32系统板,MB102面包板,OLED显示屏(接线详见往期记录)

  除了A15B3B4JLINK的调试端口,其他端口可随意使用。器件接线如下:

器件端口/电源
3.3/VCC+
GND-
OLED-SCLB8
OLED-SDAB9
Sensor-DOA0

  增设模块:对射式红外传感器(A0端口)
  

二、外部时钟

1. 端口复用

  将多个功能赋予一个输入输出端口I/O),并且不同的功能可以通过设置工作模式来切换,称为端口复用。若一个GPIO同时被外置外设和内置内设使用,就称为复用
  

2. 流程示意

在这里插入图片描述
  因为选择对射式红外传感器输出时钟信号,所以需要配置GPIO端口;使用外部时钟ETR给定时器供能,选择外部时钟模式2,初始化时基单元NVIC,最后启动定时器即可。

  其中,具有TIM2定时器的外部时钟源模式的复用功能的GPIOA0,所以将传感器接入PA0引脚;由于是外部触发中断,手动产生的时钟信号频率较低,可以关闭预分频器(PSC = 0),也可以适当降低重装载目标值(ARR = 10-1),但需要启用滤波器消除抖动

  如此,每次触发外部中断,计数器的值(CNT)就会加1,累计十次触发更新中断
  

三、定时器模块

Timer.c

#include "stm32f10x.h"void Timer_Init(void)
{// 开启外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	// TIM2定时器RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// GPIOA端口// 使用外部时钟模式二:(外部触发)关闭预分频器,极性为正向(上升沿有效),指定采样频率和采样点数TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);// 配置端口参数GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;			// 上拉输入模式:默认高电平GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		// 最大速度50MHzGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;				// 13号引脚// 初始化PA0端口GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置时基单元参数TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;			// 滤波器采样频率:1分频TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;		// 计数器模式:向上计数TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;						// 自动重装载寄存器参数ARRTIM_TimeBaseInitStructure.TIM_Prescaler = 0; 						// 预分频器寄存器参数PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;				// 重复计数器寄存器参数:仅供高级计数器使用// 初始化时基单元TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);// 重置标志位:初始化参数时会产生更新中断TIM_ClearFlag(TIM2, TIM_IT_Update);// 使能更新中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置中断优先级:分组2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 配置NVIC参数NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;				// 中断请求通道:TIM2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				// 中断请求通道状态:使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	// 抢占优先级:2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			// 响应优先级:1// 初始化嵌套中断向量控制器NVIC_Init(&NVIC_InitStructure);// 启动定时器TIM2TIM_Cmd(TIM2, ENABLE);
}

  

Timer.h

#ifndef __TIMER_H
#define __TIMER_Hvoid Timer_Init(void);#endif

  

四、遮光计数

#include "stm32f10x.h"		// 器件模块
#include "OLED.h"			// OLED模块
#include "Timer.h"			// 定时器模块uint16_t Num;	// 数值int main(void)
{	// 初始化OLED_Init();Timer_Init();// 显示计数OLED_ShowString(1, 1, "Num:");OLED_ShowString(2, 1, "CNT:");while(1){OLED_ShowNum(1, 5, Num, 5);OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);}
}// TIM2中断请求通道控制
void TIM2_IRQHandler(void)
{// 检查TIM2中断线请求状态寄存器的标志位if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)	// 更新中断触发{Num ++;										// 计数TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	// 重置标志位}
}

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

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

相关文章

Python之格式化输出

格式化输出 方法一:用%方法二:用format()函数设置输出的内容的宽度和小数位数 方法一:用% 直接用print()函数对字符串进行输出,是没有进行格式化控制的。 格式化,是对输出内容的显示方式进行设置。 首先,要…

小程序滑动单元格

项目场景&#xff1a;小程序用户管理列表&#xff0c;通过单元格滑动实现“密码重置”、“删除”功能。 技术框架&#xff1a;uniapp、uview3、ts 效果如下&#xff1a; 前端页面&#xff1a; <template><view class"fui-wrap"><view class"f…

Spring Boot 的Web开发

Spring Boot 的Web开发 一、 静态资源映射规则 总结&#xff1a; 只要静态资源放在类路径下&#xff1a; called /static (or /public or /resources or /METAINF/resources 访问 &#xff1a; 当前项目根路径/ 静态资源名 二、 enjoy模板引擎 Enjoy模板引擎是一个轻量级的…

数据结构-常见的七大排序

上节中我们学习了七大排序中的五种(插入排序、希尔排序、堆排序、选择排序、交换排序) 数据结构-常见的七大排序-CSDN博客 这节我们将要学习快速排序(hoare、指针法、挖洞法(快排的延伸)、快速排序非递归(栈)) 1.快速排序 1.1 hoare法 1.1思路 1.选出一个key&#xff0c;一…

浅看MySQL数据库

有这么一句话&#xff1a;“一个不会数据库的程序员不是合格的程序员”。有点夸张&#xff0c;但是确是如此。透彻学习数据库是要学习好多知识&#xff0c;需要学的东西也是偏难的。我们今天来看数据库MySQL的一些简单基础东西&#xff0c;跟着小编一起来看一下吧。 什么是数据…

Windows 11环境下安装uwsgi的步骤和方法

正在用Django做个小网站&#xff0c;经常要用runserver启动服务观察效果&#xff0c;很不方便&#xff0c;就想装个uwsgi&#xff0c;让服务总是在后台运行&#xff0c;免得切换。上网一查发现&#xff0c;在windows下安装uwsgi不是一件简单的事情&#xff0c;很多人在尝试之后…

Python | Leetcode Python题解之第338题比特位计数

题目&#xff1a; 题解&#xff1a; class Solution:def countBits(self, n: int) -> List[int]:bits [0]for i in range(1, n 1):bits.append(bits[i & (i - 1)] 1)return bits

Spring Web MVC入门(下)

1. 响应 1.1 返回静态页面 创建前端页面&#xff0c;如下图所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Index页面</title> </head> <body>Hello,Spring MVC…

设计模式21-组合模式

设计模式21-组合模式&#xff08;Composite Pattern&#xff09; 写在前面 动机定义与结构定义结构主要类及其关系 C代码推导优缺点应用场景总结补充叶子节点不重载这三个方法叶子节点重载这三个方法结论 写在前面 数据结构模式 常常有一些组件在内部具有特定的数据结构。如何…

CVPR2023《DNF: Decouple and Feedback Network for Seeing in the Dark》暗光图像增强论文阅读笔记

相关链接 论文链接 https://openaccess.thecvf.com/content/CVPR2023/papers/Jin_DNF_Decouple_and_Feedback_Network_for_Seeing_in_the_Dark_CVPR_2023_paper.pdf 代码链接 https://github.com/Srameo/DNF 摘要 RAW数据的独特属性在低光照图像增强方面展现出巨大潜力。…

使用RKNN在Orange Pi 5 (RK3588s) 上部署推理PPO深度学习模型

文章目录 一、前言1️⃣、Orange Pi 是什么&#xff1f;2️⃣、PPO 是什么&#xff1f;3️⃣、RKNN 是什么&#xff1f;3️⃣、ONNX 是什么&#xff1f; 二、项目简介三、部署流程1️⃣、PPO 网络结构2️⃣、PPO 输出模型&#xff0c;模型转换&#xff0c;以及对比检查3️⃣、.…

ECMAScript6语法:默认参数和rest参数

1、默认参数 默认参数即在定义函数的参数列表中指定了默认值的参数。在 ES5 中&#xff0c;并没有提供在参数列表中指定参数默认值的语法&#xff0c;要想为函数的参数指定默认值&#xff0c;只能在函数体中实现&#xff0c;示例代码如下&#xff1a; function table(width, …

【性能优化】使用Perfetto定位应用启动性能的瓶颈

Android应用启动优化相关的文章已经有很多人都写过了&#xff0c;但是主要都是聚焦在&#xff0c;为了启动性能都做了哪些改动上&#xff0c;少见有文章会说应该如何分析、识别应用的启动性能。 本篇文章将会结合我个人对Perfetto的实际使用经历&#xff0c;讲解车载应用的启动…

前端post传入拿到数据,后端报null,并且能够添加或者编辑成功

检查conterller层注解接到实体类的注解是不是没加&#xff08; RequestBody &#xff09; 后端&#xff1a; 前端&#xff1a; 那么就看注解&#xff0c;因为contrller层有个接值注解&#xff08; RequestBody &#xff09;

MySQL基础练习题44-只出现一次的最大数字

目录 题目 情况一 准备数据 分析数据 情况二 准备数据 实现一 题目 单一数字 是在 MyNumbers 表中只出现一次的数字。 找出最大的 单一数字 。如果不存在 单一数字 &#xff0c;则返回 null 。 情况一 准备数据 ## 创建库 create database db; use db;## 创建表 Cre…

代码随想录算法训练营Day42||Leetcode300.最长递增子序列 、 674. 最长连续递增序列 、 718. 最长重复子数组

一、最长递增子序列 简单&#xff0c;只不过返回值不是dp数组最后一个元素了&#xff0c;自己做出来AC了 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int>dp(nums.size()1,1);for(int i1;i<nums.size();i){for(int ji-1;j>0…

自动化运维---ansible

ansible是一种由Python开发的自动化运维工具&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。 特点: 部署简单 默认使用ssh进行管理&#xff0c;基于py…

万能钥匙:解锁 C++ 模板的无限可能

1.泛型编程 1.1:交换两个数(C语言) 1.2:交换两个数(C) 1.3:泛型编程 2:函数模板 2.1:函数模板的概念 2.2:函数模板的格式 ​编辑 2.3:函数模板的原理 2.4:模板的实例化 2.4.1:隐式实例化 2.4.2:显式实例化:在函数名后的<>中指定模板参数的实际类型. 2.4.2.1…

Docker 部署 XXL-JOB

Docker 部署 XXL-JOB 目录 引言环境准备创建 MySQL 用户并授予权限使用 Docker 部署 XXL-JOB配置 XXL-JOB验证部署总结 1. 引言 XXL-JOB 是一个开源的分布式任务调度平台&#xff0c;旨在简化定时任务的管理和调度操作。其强大的功能和灵活性&#xff0c;使其在互联网公司和…

WebSocket 快速入门

WebSocket是什么 WebSocket 是基于 TCP 的一种新的应用层网络协议。它实现了浏览器与服务器全双工通信&#xff0c;即允许服务器主动发送信息给客户端。因此&#xff0c;在 WebSocket 中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性…