单片机GPIO中断+定时器 软件串口通信
单片机GPIO中断+定时器 软件串口通信
- 解决思路
- 代码示例
解决思路
串口波特率9600bps,每个bit约为1000000us/9600=104.16us; 定时器第一次定时时间设为52us即半个bit的时间,其目的是偏移半个bit时间,之后的每104us采样并读取1bit数据。使得采样点搞好在每位数据脉宽的中间点。

代码示例
- 串口波特率9600bps,每个bit约为1000000us/9600=104.16us;
- 定时器开始时定时时间设为52us,即半个bit的时间,并关闭定时器;
- GPIO设为中断模式下降沿触发,测到第一个下降沿(即串口的S信号),定时器设定52us开启定时,关闭GPIO中断,并设置状态为E_IO_UART_STATE_IDLE。
- 定时器触发52us定时E_IO_UART_STATE_IDLE状态改为E_IO_UART_STATE_START。定时器设置为104us,之后每触发一次104us定时中断读取1bit串口数据,直到8bits数据全部解析完成,重置为下次接收状态;
#if TCFG_SENSOR_CO_MODULE_EN
struct io_uart_t {uint8_t state;uint8_t index;uint8_t _data;uint8_t ready;uint8_t rxlen;uint8_t _recv[7];
};
static struct io_uart_t io_uart;
void timer1_init(void);
#endif#if TCFG_SENSOR_CO_MODULE_EN
enum {E_IO_UART_STATE_IDLE=0, // 空闲状态E_IO_UART_STATE_START, // 开始接收数据E_IO_UART_STATE_END, // 数据接收完成
};#define TIMER1_TICK_HEAD 60 // 52us 104/2=52us 半个开始信号的时间
#define TIMER1_TICK_DATA 139 // 104us 1000000/9600=104.16us 一个数据位的时间
void timer1_init(void)
{SCCM1 |= RCC_SCCM1_TIMER1;TMOD |=Bit5_En ;TMOD &=Bit4_Dis;TH1=256-TIMER1_TICK_HEAD; TL1=256-TIMER1_TICK_HEAD; TR1=0; //定时器1使能运行EAL=1; //总中断打开ET1=1; //定时器1中断打开IRQ_Vic_Set(INT_TIMER1, pritrity_level_fourth); // 设置定时器优先级最高// IRQ_Enable(IT_ALL);
}void Interrupt_GPIO0 (void) interrupt 20 //GPIO0中断服务程序
{// P07=~P07;if(IO_GetIntState(GPIO_P0,GPIO_Pin_6)){// P07=~P07; // for test// TODO: 检测到第一个下降沿:S信号,设置定时器初值52us,启动定时器,关闭外部中断TH1=256-TIMER1_TICK_HEAD; TL1=256-TIMER1_TICK_HEAD;TR1=1;io_uart.state = E_IO_UART_STATE_IDLE;IO_INT_Disable( GPIO_P0,GPIO_Pin_6);// IRQ_Disable(IT_GPIO0);IO_CleanIntState(GPIO_P0,GPIO_Pin_6);}P0_INT_REG = 0xff;
}/*中断方式*/
void Interrupt_TIMRT1 (void) interrupt 3 //TIMRT1中断服务程序
{ uint8_t checksum = 0;TF1 = 1; //清标志// TIMER01_SetPeriod(TIMER1,TIMERMODE_VALUE,TIMER1_TICK);// P07=~P07; // for testif (io_uart.state == E_IO_UART_STATE_START) {P07=~P07; // FOR TESTio_uart._data = io_uart._data >> 1; // 数据右移一位if (P06 == 1) { io_uart._data |= 0x80; // 如读取到的串口GPIO电平为高,高位位或运算}io_uart.index++;if (io_uart.index == 8) {io_uart.state = E_IO_UART_STATE_END;IO_INT_Enable( GPIO_P0,GPIO_Pin_6);// IRQ_Enable(IT_GPIO0);TR1=0;if (io_uart._data == 0xAA) {io_uart.rxlen = 0;memset(io_uart._recv, 0, sizeof(io_uart._recv));}io_uart._recv[io_uart.rxlen] = io_uart._data;io_uart.rxlen++;if (io_uart.rxlen == 7){checksum = (uint8_t)(io_uart._recv[1]+io_uart._recv[2]+io_uart._recv[3]+io_uart._recv[4]);if (checksum == io_uart._recv[5]) {// TODO: 和校验正确// P07=~P07; // for test_this->sensor_co.covol = (uint16_t)(io_uart._recv[1]<<8 | io_uart._recv[2]);io_uart.ready = 1;}}}}if (io_uart.state == E_IO_UART_STATE_IDLE) {io_uart.state = E_IO_UART_STATE_START;io_uart.index = 0;io_uart._data = 0;TH1=256-TIMER1_TICK_DATA; TL1=256-TIMER1_TICK_DATA;}
}
#endifvoid main ()
{
#if TCFG_SENSOR_CO_MODULE_ENtimer1_init();RCC_Sccm1_ClockCmd(RCC_SCCM1_GPIO,ENABLE);IO_FUN_Config(GPIO_P0,GPIO_Pin_7,GPIO_FUNCTION_DF0); //配置引脚为GPIO功能 IO_OUT_Enable(GPIO_P0, GPIO_Pin_7);IO_PU_Enable(GPIO_P0, GPIO_Pin_7);// TOODO: 模拟串口接收/*只有P0和P1口可以配置为电平触发,其他端口只能配置为沿触发*/IO_FUN_Config( GPIO_P0,GPIO_Pin_6,GPIO_FUNCTION_DF0); //配置引脚为GPIO功能IO_PU_Enable( GPIO_P0,GPIO_Pin_6);IO_INPUT_Enable(GPIO_P0,GPIO_Pin_6); //配置引脚为GPIO输入模式IO_INT_Config( GPIO_P0,GPIO_Pin_6, falling); //需要外接接下拉电阻 IO_INT_Enable( GPIO_P0,GPIO_Pin_6);IRQ_Enable(IT_GPIO0);
#endifwhile(1)
{...
}}
相关文章:
单片机GPIO中断+定时器 软件串口通信
单片机GPIO中断定时器 软件串口通信 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us; 定时器第一次定时时间设为52us即半个bit的时间,其目的是偏移半个bit时间,之后的每104us采样并读取1bit数据。使得采样…...
elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
前言 在使用el-table 表格中有些表格的表头需要加入一些提示,鼠标移入则出现提示,非常实用,我是通过el-table中的el-tooltip实现的,以下的效果预览 代码实现 <el-table ref"multipleTable" :data"data"…...
NVR小程序接入平台/设备EasyNVR多个NVR同时管理设备接入:海康NVR 3.0提示不在线如何处理?
在视频监控领域,设备的兼容性和互操作性一直是用户关注的重点。海康NVR管理平台EasyNVR作为一款轻量级的视频监控平台,凭借其强大的兼容性、可扩展性和丰富的功能,成为了公共安全领域“云平台”解决方案的杰出代表。然而,在实际应…...
datawhale11月组队学习 模型压缩技术2:PyTorch模型剪枝教程
文章目录 一、 prune模块简介1.1 常用方法1.2 剪枝效果1.3 二、三、四章剪枝测试总结 二、局部剪枝(Local Pruning)2.1 结构化剪枝2.1.1 对weight进行随机结构化剪枝(random_structured)2.1.2 对weight进行迭代剪枝(范…...
SOL链上Meme生态的崛起与未来#Dapp开发#链游#交易所#公链搭建
近年来,随着区块链技术的普及和NFT文化的流行,meme(网络迷因)逐渐成为区块链生态中的重要组成部分。meme不仅是一种互联网文化符号,更逐步渗透进了去中心化金融(DeFi)、NFT和元宇宙等多个领域&a…...
部署Apache Doris
官方文档:https://doris.apache.org/zh-CN/installing/compilation.html 一、编译 使用 Docker 开发镜像编译(推荐) 1.拉取镜像 #下载 Docker 最新主干版本代码,会随主干版本不断更新。 $ docker pull apache/incubator-doris:…...
ElasticSearch-全文检索(一)基本介绍
简介 Elasticsearch:官方分布式搜索和分析引擎 | Elastic 全文搜索属于最常见的需求,开源的Elasticsearch是目前全文搜索引擎的首选。 它可以快速地储存、搜索和分析海量数据。维基百科、StackOverflow、Github都采用它 Elastic的底层是开源库Lucene。但…...
paramiko 库实现的暴力破解 SSH 密码
import paramiko import optparse import threading import time from threading import Thread, BoundedSemaphore# 用paramiko暴力破解SSH密码 # 最大并发连接尝试的数量,可根据实际情况调整,适当减小可降低对目标服务器的压力以及减少多线程同步问题出…...
Python 操作 Elasticsearch 全指南:从连接到数据查询与处理
文章目录 Python 操作 Elasticsearch 全指南:从连接到数据查询与处理引言安装 elasticsearch-py连接到 Elasticsearch创建索引插入数据查询数据1. 简单查询2. 布尔查询 更新文档删除文档和索引删除文档删除索引 批量插入数据处理分页结果总结 Python 操作 Elasticse…...
Jarvis March算法详解及Python实现(附设计模式案例)
目录 Jarvis March算法详解及Python实现(附设计模式案例)第一部分:Jarvis March算法概述与原理1.1 什么是Jarvis March算法?1.2 算法原理1.3 算法流程1.4 时间复杂度第二部分:Jarvis March算法的Python实现(面向对象设计)2.1 面向对象设计2.2 代码实现2.3 代码解释第三部…...
AIGC中的文本风格迁移:基于深度学习的实现
引言 文本风格迁移是自然语言处理领域的一个重要研究方向,它可以将文本从一种风格转换为另一种风格,同时保留其原有的内容。随着深度学习技术的发展,文本风格迁移的方法变得越来越先进和高效。本文将探讨基于序列到序列模型(Seq2…...
丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
前言 🌟🌟本期讲解关于HTMLCSSJavaScript的基础知识,小编带领大家简单过一遍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...
响应“一机两用”政策 落实政务外网安全
在数字化时代,政务办公外网安全的重要性日益凸显,特别是在“一机两用”的背景下,即同一台终端既要处理政务内网的数据,又要访问互联网,这对网络安全提出了更高的要求。深信达SPN安全上网方案,即反向沙箱技术…...
通过JS删除当前域名中的全部COOKIE教程
有时候需要通过JS来控制一下网站的登录状态,就例如:网站登出功能,我们可以直接通过JS将所有COOKIE删除,COOKIE删除之后,网站自然也就退出了。 那么今天我就给大家分享一段JS的函数,通过调用这段函数就可以实现删除COO…...
Flutter:Widget生命周期
StatelessWidget:无状态部件的生命周期 import package:flutter/material.dart;void main() {runApp(App()); }class App extends StatelessWidget {overrideWidget build(BuildContext context) {return MaterialApp(home: MyHomePage(title: MyHome),);} }class M…...
Flutter:Dio下载文件到本地
import dart:io; import package:dio/dio.dart;main(){// 创建dio对象final dio Dio();// 下载地址var url https://*******.org/files/1.0.0.apk;// 手机端路径String savePath Directory.systemTemp.path/ceshi.apk;print(savePath);downLoad(dio,url,savePath); }downLo…...
[⑧5G NR]: PBCH payload生成
本篇博客记录下5G PBCH信道中payload数据的生成方式。PBCH payload一共32个比特,基本结构如下图: 根据SSB PDU中bchPayloadFlag的值有三种方式得到PBCH payload。 bchPayloadFlag 0:全部32比特由MAC层提供。 bchPayloadFlag 1:M…...
查看解决端口占用,以及docker解决端口占用的原理
在软件开发和部署过程中,端口占用是一个常见的问题。以下是查看和解决端口占用问题的完整解决方案: 一、查看端口占用情况 1. 在 Linux 系统中 方法一:使用 lsof 命令 sudo lsof -i:<端口号>输出信息中会显示占用端口的进程名称、PI…...
力扣-Hot100-链表其一【算法学习day.34】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
centos7 升级openssl 与升级openssh 安装卸载 telnet-server
前言: 服务器被安全扫描,扫出了漏洞需要修复,根据提示将openssh升级为9.8p1的版本,同时需要升级openssl,但是升级openssh可能会导致ssh连接失败,从而无法继续操作,特别是远程机房尤为危险&#…...
如何通过3个步骤掌握iOS游戏修改神器H5GG
如何通过3个步骤掌握iOS游戏修改神器H5GG 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG 你是否曾想在iOS设备上修改游戏数值却苦于没有越狱?是否觉得传统游戏修改工具操作…...
如何在Windows上安装APK文件:APK Installer终极指南
如何在Windows上安装APK文件:APK Installer终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK Installer是一款专为Windows系统设计的Android应用…...
电赛小白也能搞定的二维云台:用K210+舵机实现色块追踪(附完整代码)
电赛入门实战:K210舵机构建高响应色块追踪云台 第一次参加电子设计竞赛时,面对复杂的视觉控制项目总有种无从下手的感觉。直到发现用K210开发板配合普通舵机就能搭建出反应灵敏的二维云台系统,整个过程就像拼乐高一样充满乐趣。本文将带你从零…...
SpringBoot+Vue农产品电商系统源码+论文
代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...
个人自动化技能库构建指南:从Python脚本到Cron定时任务
1. 项目概述:一个为“摸鱼”场景设计的自动化技能库最近在GitHub上看到一个挺有意思的项目,叫my-copaw-skill。光看这个名字,就透着一股子“打工人”的幽默感——“copaw”这个词,我琢磨着应该是“copilot”(副驾驶/助…...
打造便携式Kali Linux安全评估工具:OpenClaw USB定制全攻略
1. 项目概述:一个便携式安全评估工具的诞生 在安全研究、渗透测试或者应急响应的现场,你经常会遇到一个经典困境:目标环境可能是一台物理隔离的机器,或者是一台你无法安装任何软件的“干净”主机。你需要一个功能强大、即插即用的…...
3分钟掌握跨平台模组下载神器:WorkshopDL全攻略
3分钟掌握跨平台模组下载神器:WorkshopDL全攻略 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic Games或GOG平台的游戏无法使用Steam创意工坊模组而烦恼吗…...
Go语言实现跨平台系统更新检查器:自动化运维与安全监控实践
1. 项目概述:一个被低估的系统运维“哨兵”在服务器和桌面系统的日常运维中,有一个场景大家一定不陌生:某天,你管理的服务器突然因为一个已知漏洞被攻击,事后排查发现,相关的安全补丁其实在几周前就已经发布…...
基于Sovereign-MCP-Servers构建私有AI工具链:从协议原理到Docker化部署
1. 项目概述与核心价值最近在折腾AI应用开发,特别是想给Claude、Cursor这类工具加上“联网”和“执行”能力时,绕不开一个概念:MCP(Model Context Protocol)。简单说,MCP就是一套标准协议,它能让…...
嵌入式测试学习第 12天:串口基础概念:UART、波特率、数据位、校验位
串口基础概念:UART、波特率、数据位、校验位一、串口整体基础概念1、什么是UART串口2、串口实物真实图片① 主板/开发板排针串口② USB转TTL串口模块③ 老式DB9工业串口公头母头二、串口四大核心参数1、波特率概念常用标准固定值通俗理解测试场景2、数据位概念作用3…...
