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,一经查实,立即删除!

相关文章

安装 Jenkins 后无法访问用户名或密码且忘记这些凭证怎么办?

Jenkins 是一款功能强大的自动化服务器,在持续集成与交付(CI/CD)领域应用广泛。不过,用户在使用过程中,尤其是首次接触该系统或系统重启后,常常会遇到登录方面的问题。要是 Jenkins 突然要求输入用户名和密…

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

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

JVM面试相关

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

zookeeper shell操作和zookeeper 典型应用(配置中心、集群选举服务、分布式锁)

文章目录 引言I zookeeper客户端命令查看子节点 ls创建子节点 create获取节点信息 get更新节点数据 set删除节点 delete\ rmrII 监听机制node1:设置监听node3:修改监听节点node1:得到监听反馈III zookeeper 典型应用分布式锁集群选举服务数据发布/订阅(配置中心)引言 zk 的…

Netty 入门学习

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

Microsoft Sql Server 2019 数据类型

数据类型 bigint、int、smallint、tinyint 使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数 据类型。 例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上。 但对于建筑物的 年龄,tinyint 就不再适应,因为建…

爬虫学习心得

爬虫学习心得 下面给新学者分享一些爬虫的技巧1 xpath的学习a xpath的基本用法b xpath案例 2.正则表达式学习a 基本使用b 12306提取省份成json格式 3.Bs的学习3.1基础3.3基础案例3.5基本案例 4.拿取数据技巧4.1通过标签获取4.2通过lamda表达式获取数据 下面给新学者分享一些爬虫…

[笔记] 使用 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为例,他们开发出商城系统,团购系统,外卖点餐系统,…

C# 与 Windows API 交互的“秘密武器”:结构体和联合体

一、引言 在 C# 的编程世界里,当我们想要深入挖掘 Windows 系统的底层功能,与 Windows API 打交道时,结构体和联合体就像是两把神奇的钥匙🔑 它们能够帮助我们精准地操控数据,实现一些高级且强大的功能。就好比搭建一…

C++实现设计模式---状态模式 (State)

状态模式 (State) 状态模式 是一种行为型设计模式,它允许对象在运行时根据内部状态的改变来动态改变其行为。通过将状态相关的行为封装到独立的类中,状态模式使得状态的切换更加清晰和灵活。 意图 将对象的行为和状态分离,随着状态的改变动…

202312 青少年软件编程等级考试C/C++ 一级真题答案及解析(电子学会)

第 1 题 数的输入和输出 输入一个整数和双精度浮点数,先将浮点数保留2位小数输出,然后输出整数。 时间限制:1000 内存限制:65536 输入 一行两个数,分别为整数N(不超过整型范围),双精度浮点数F,以一个空格分开。 输出 一行两个数,分别为保留2位小数输出的F,以…

信息系统项目管理-采购管理-采购清单示例

序号类别产品/服务名称规格/功能描述数量备注1硬件服务器高性能处理器,大容量存储10HP、DELL2网络设备高速路由器和交换机10华为3工作站多核处理器,高分辨率显示器25国产设备4移动检查设备手持式移动检查仪,可连接云平台30国产设备5打印机和扫…

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

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

Mysql学习笔记之函数

1.简介 SQL提供了很多函数,便于在查询时能够快速的进行计算或者计数等操作,下文介绍一些实际场景中常用的函数。 2.字符串函数 常用的字符串函数如下表所示: 函数名描述LENGTH(str)返回字符串的长度,以字节为单位。例如LENGTH…

pytest 参数介绍

命令行参数描述常见使用案例-v / --verbose显示每个测试用例的详细信息,包括测试名称和状态pytest -v-s / --captureno禁用输出捕获,允许 print() 输出显示pytest -s-q / --quiet安静模式,减少输出,仅显示每个测试的通过/失败结果…

10步打造完美ASP.NET、Web API和控制台应用程序文件夹结构

一、前言 在大型项目中,合理的文件夹结构是项目成功的关键之一。一个好的文件夹结构就像是一座井然有序的图书馆,每一本书(代码文件)都有其固定的位置,让人能迅速找到所需。它可以让团队成员更容易理解和维护代码&…

conntrack iptables 安全组

centos 安装yum install conntrack-tools 1. conntrack状态 NEW: 新建连接(第一次包)。 ESTABLISHED: 已建立连接,正在传输数据。 RELATED: 与已有连接相关的连接,如 FTP 数据连接。 INVALID: 无效连接,无法识别或不…

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

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