4、蓝牙打印机-定时器驱动

蓝牙打印机实现打印内容,需要先通过定时器发送固定的节拍驱动步进电机转动,从而驱动打印头打印相应的内容。

因此想要实现打印,先要实现定时器功能。

本例采用通用定时器2完成发送节拍功能。

1、硬件

定时器总线

由上图知道TIM2是挂载在APB1总线上的。

RCC的TIM2为APB1ENR寄存器的第0位。

定时器的内部结构图:

定时器时钟源

定时器时钟源选择内部时钟源72M。

APB1进行了2分频,对于APB1其他外设来说是36M;但是对于定时器2-7要看下面,如果分频系数不为1,则还需要频率*2,因此对于定时器2-7来说,频率还是72M.

预分频器

计数器

2、软件

定时器初始化函数
{时钟源选择预分频器、计数器设置计数器清零、清除中断标识位使能定时器更新中断 - 模块中断开启核心中断使能定时器
}定时器服务函数
{}

定时器要使用中断,不然会影响其他程序运行。

定时器timer.c

#include "timer.h"
#include "led.h"/********************************************************************
*  函数名:  void TIM2_Config(u16 arr,u16 psc)
*  功能描述: 定时器TIM2初始化
*  输入参数:u16 arr,u16 psc   
*  返回:     无      
*  其他:          
*  					arr -- 计数个数,多少us进入中断, 内部实现-1
*           psc -- 多长时间为1us              内部实现-1
*********************************************************************/	void TIM2_Config(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;// 使能TIM2和GPIOA时钟(如果使用了TIM2的CH1-4作为输入捕获/输出比较)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 如果使用了GPIO,则启用相应的GPIO时钟,例如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 配置TIM2时间基单元TIM_TimeBaseStructure.TIM_Period = arr - 1;TIM_TimeBaseStructure.TIM_Prescaler = psc - 1;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 清除更新中断标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 使能TIM2更新中断TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置NVIC中断优先级NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       // 子优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能TIM2TIM_Cmd(TIM2, ENABLE);
}// TIM2中断服务函数
void TIM2_IRQHandler(void)
{static u16 cnt = 0;if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET){// 清除中断标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);// 自己的代码cnt++;// 1ms进入一次中断,1s切换灯的状态if(cnt >= 1000){cnt = 0;LED1 = !LED1;}}
}

定时器timer.h

#ifndef _TIMER_H
#define _TIMER_H#include "stm32f10x.h"void TIM2_Config(u16 arr,u16 psc);#endif

main.c测试代码

功能:1ms进入1次中断,1s切换一次灯的亮度。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "timer.h"int main()
{u8 key;init_delay(72); // 全速72Minit_led();init_key();TIM2_Config(1000,72);  // 1ms进入中断while(1){}}

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

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

相关文章

(纯小白教程)Mac OS中安装配置Anaconda及常用conda命令回顾

本教程介绍了如何在Mac OS系统中下载、安装、配置 Anaconda3,并介绍了换源的方法,最后介绍了常用的conda命令。本教程适用于苹果系统,如需要在Windows系统或者Liunx系统中安装Anaconda3,可移步至主页的其他博客。 (纯…

JVM面试相关

JVM组成 什么是程序计数器 详细介绍Java堆 什么是虚拟机栈 能不能解释一下方法区? 直接内存相关 类加载器 什么是类加载器,类加载器有哪些 什么是双亲委派模型 类加载过程 垃圾回收 对象什么时候可以被垃圾回收器回收 JVM垃圾回收算法有那些 JVM的分代…

Netty 入门学习

前言 学习Spark源码绕不开通信,Spark通信是基于Netty实现的,所以先简单学习总结一下Netty。 Spark 通信历史 最开始: Akka Spark 1.3: 开始引入Netty,为了解决大块数据(如Shuffle)的传输问题 Spark 1.6&…

[笔记] 使用 Jenkins 实现 CI/CD :从 GitLab 拉取 Java 项目并部署至 Windows Server

随着软件开发节奏的加快,持续集成(CI)和持续部署(CD)已经成为确保软件质量和加速产品发布的不可或缺的部分。Jenkins作为一款广泛使用的开源自动化服务器,为开发者提供了一个强大的平台来实施这些实践。然而…

qt QPainter setViewport setWindow viewport window

使用qt版本5.15.2 引入viewport和window目的是用于实现QPainter画出来的内容随着窗体伸缩与不伸缩两种情况,以及让QPainter在widget上指定的区域(viewport)进行绘制/渲染(分别对应下方demo1,demo2,demo3)。 setViewpo…

likeshop同城跑腿系统likeshop回收租赁系统likeshop多商户商城安装及小程序对接方法

前言:首先likeshop是一个开发平台,是一个独创的平台就像TP内核平台一样,你可以在这个平台上开发和衍生出很多伟大的产品,以likeshop为例,他们开发出商城系统,团购系统,外卖点餐系统,…

继续以“实用”指导Pythonic编码(re通配表达式)(2024年终总结②)

弃现成工具手剥任务🧐,我哈哈滴就像笨笨的傻大个儿😋。 (笔记模板由python脚本于2025年01月12日 23:29:33创建,本篇笔记适合熟悉正则表达式的coder翻阅) 【学习的细节是欢悦的历程】 Python官网:https://www.python.or…

相机和激光雷达的外参标定 - 无标定板版本

1. 实现的效果 通过本软件实现求解相机和LiDAR的外参,即2个传感器之间的三维平移[x, y, z]和三维旋转[roll, pitch, yaw]。完成标定后,可将点云投影到图像,效果图如下: 本软件的优势:(1)无需特…

WPF系列九:图形控件EllipseGeometry

简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用,比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆:EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制:可以被用作 Path 元素的数据&…

qt设置qwidget背景色无效

最近在做一个界面,有三个子窗体,于是就把各个子窗体分别做成了三个UI,再将3个UI,放到1个UI,再将那一个UI在其他窗体上进行提升。 最后就发现怎么设置qwidget的背景都没有效果。 在Qt中,如果是给Qwidget的…

【Rust学习笔记】Rust 的所有权介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust中的所有权介绍1.1 一个简单的例子1.2 一个稍微复杂的例…

CentOS7下Hadoop集群分布式安装详细图文教程

1、集群规划 主机 角色 DSS20 NameNode DataNode ResourceManager NodeManager DSS21 SecondaryNameNode NameNode NodeManager DSS22 DataNode NodeManager 1.1、环境准备 1.1.1 关闭防火墙 #查看防火墙状态 firewall-cmd --state #停止…

在 Vue 项目中使用地区级联选

在 Vue 项目中使用地区级联选择的完整流程: 1.安装依赖包,这个包提供了中国省市区的完整数据。 npm install element-china-area-data --save 2.导入数据 import { regionData } from element-china-area-data 这个包提供了几种不同的数据格式&#…

基于改进粒子群优化的无人机最优能耗路径规划

目录 1. Introduction2. Preliminaries2.1. Particle Swarm Optimization Algorithm2.2. Deep Deterministic Policy Gradient2.3. Calculation of the Total Output Power of the Quadcopter Battery 3.OptimalEnergyConsumptionPathPlanningBasedonPSO-DDPG3.1.ProblemModell…

Redis为 List/Set/Hash 的元素设置单独的过期时间

一.业务简介 我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。 这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。但这样并不…

【51单片机】03 蜂鸣器-播放音乐

蜂鸣器-播放音乐 一、原理介绍1.硬件电路 二、练习1.让蜂鸣器发声2.尝试演奏小星星 一、原理介绍 蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。 有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音 无源蜂鸣器:需要提供特定频率的声音信号,才能…

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器:定时器0、定时器1、定时器2 注意:51系列单片机一定有基本的2个定时器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器&#xff…

LeetCode热题100-合并两个有序链表【JavaScript讲解】

题目: 题解: 我们目前已经知道两条链表都是有序链表,我们就可以通过迭代的方法实现上述问题。当list1和list2都不是空链表时,判断list1和list2哪个头节点的值更小,将较小的值添加到结果里,被添加到结果里的…