GD32F103输入捕获
GD32F103输入捕获程序,经过多次测试,终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮,第1次按下采集一个值保存到TIMER2_CountValue1中,第2次按下采集一个值保存到TIMER2_CountValue2中,然后计算其低电平时间宽度。
网上也有人写了测试案例,但好像能用,但不是很完善。
我喜欢直奔主题,程序如下:
#include "Timer2_InputCapture.h"
#include "stdio.h" //使能printf(),sprintf()uint16_t TIMER2_CountValueMAX = 65535;//设定最大捕获计数器值为65535
uint32_t TIMER2_CLKFrequence;
uint16_t TIMER2_OverValue = 0;//溢出次数
uint32_t TIMER2_CountValue1=0;
uint32_t TIMER2_CountValue2=0;
uint32_t TIMER2_CountResult=0;
uint8_t TIMER2_CaptchStatus=0;
float MyPeriod=0;
float MyFrequence=0;void TIMER2_Input_Init(void);//函数功能:将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度
//Tout=(65535+1)*(107+1)/108000000=0.065536秒
//TIMER2输入时钟频率:108000000/(107+1)=1000000Hz
void TIMER2_Input_Init(void)
{timer_parameter_struct TimerParameterStruct; //TIMER0初始化结构体timer_ic_parameter_struct timer_icinitpara; //TIMER0输入捕获结构体rcu_periph_clock_enable(RCU_TIMER2); //使能TIMER0时钟rcu_periph_clock_enable(RCU_GPIOB); //使能GPIOB时钟rcu_periph_clock_enable(RCU_AF); //使能复用时钟gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);//将TIMER2_CH2通道映射到PB0引脚timer_deinit(TIMER2);timer_struct_para_init(&TimerParameterStruct); //将初始化结构体参数变为初始值TimerParameterStruct.period = TIMER2_CountValueMAX; //定时器装载值,计数值超出后会产生溢出中断TimerParameterStruct.prescaler = 107; //设置用来作为TIMx时钟频率除数的预分频值(APB2时钟分频值)
//Tout= ((arr+1)(psc+1))/Tclk;
//Tclk:TIM的输入时钟频率(单位为Hz),在这里是108000000Hz
//psc为定时器预分频值,在这里是107
//arr为重装载值,在程序中为65535
//Tout:TIM溢出时间(单位为s),Tout=(65535+1)*(107+1)/108000000=0.065536秒TimerParameterStruct.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分母值为1TimerParameterStruct.counterdirection = TIMER_COUNTER_UP; //设置计数方向为"向上计数"TimerParameterStruct.alignedmode = TIMER_COUNTER_EDGE; //设置为无中央对齐计数模式(边沿对齐模式)TimerParameterStruct.repetitioncounter = 0; //重复计数,重复溢出多少次才会溢出中断,此处配置为0,不重复timer_init(TIMER2,&TimerParameterStruct);//根据TimerParameterStruct所指向的参数初始化TIMERx的时间基数单位timer_channel_input_struct_para_init(&timer_icinitpara); //将输入捕获结构体参数变为初始值timer_icinitpara.icpolarity = TIMER_IC_POLARITY_FALLING; //通道输入极性timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; //通道输入模式选择"通道直连"timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; //通道输入预分频器timer_icinitpara.icfilter = 0; //通道输入捕获滤波timer_input_capture_config(TIMER2,TIMER_CH_2,&timer_icinitpara);timer_counter_value_config(TIMER2,0);//设置TIMER2的计数器初始值为0timer_auto_reload_shadow_enable(TIMER2); //自动重装载使能
/timer_flag_clear(TIMER2,TIMER_FLAG_UP); //清除"TIMERx更新标志位"timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP); //清除"TIMERx更新中断标志位"timer_interrupt_enable(TIMER2,TIMER_INT_UP); //使能"TIMERx更新"产生中断timer_internal_clock_config(TIMER2);//设置"内部时钟"作为定时器时钟TIMER2_CLKFrequence=SystemCoreClock/(TimerParameterStruct.prescaler+1);//SystemCoreClock=108000000MHz
/timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH2); //清除CH2的中断标志位timer_interrupt_enable(TIMER2,TIMER_INT_FLAG_CH2); //CH2通道中断使能nvic_irq_enable(TIMER2_IRQn,1,0); //使能中断线timer_enable(TIMER2);
}/*
KEY==0
TIMER2_OverValue=11, TIMER2_CountValue1=19395, TIMER2_CountValue2=30890, TIMER2_CountResult=732380
MyPeriod=0.732380s
MyFrequence=1.365411Hz
KEY==0
*/
//TIMER2中断服务函数
void TIMER2_IRQHandler(void)
{if( SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP) )// 读取更新中断标志位{if(1 == TIMER2_CaptchStatus) TIMER2_OverValue++;timer_flag_clear(TIMER2,TIMER_FLAG_UP); //清除"TIMER0更新标志位"timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP); //清除"更新中断标志位"
// printf("\r\nTIMER2 Interrupt");}if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH2) != RESET){timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH2);if(0 == TIMER2_CaptchStatus){TIMER2_OverValue=0;//清除溢出计数器TIMER2_CountValue1 = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_2);TIMER2_CaptchStatus = 1;}else if(1 == TIMER2_CaptchStatus){TIMER2_CountValue2 = timer_channel_capture_value_register_read(TIMER2,TIMER_CH_2);TIMER2_CountResult = (TIMER2_OverValue*TIMER2_CountValueMAX-TIMER2_CountValue1)+TIMER2_CountValue2;MyPeriod=(float)TIMER2_CountResult/TIMER2_CLKFrequence;MyFrequence = (float)TIMER2_CLKFrequence/ TIMER2_CountResult;printf("\r\nTIMER2_OverValue=%u, TIMER2_CountValue1=%u, TIMER2_CountValue2=%u",TIMER2_OverValue,TIMER2_CountValue1,TIMER2_CountValue2);printf(", TIMER2_CountResult=%u",TIMER2_CountResult);printf("\r\nMyPeriod=%fs",MyPeriod);printf("\r\nMyFrequence=%fHz",MyFrequence);TIMER2_OverValue = 0;//溢出次数TIMER2_CountValue1=0;TIMER2_CountValue2=0;TIMER2_CountResult=0;TIMER2_CaptchStatus = 0;}}
}
#include "KEY.h"void KEY_Init(void);//函数功能:初始化KEY
void KEY_Init(void)
{rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB时钟,enable GPIO clockgpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0);//将GPIOB0设置为浮空输入
}
#ifndef __KEY_H
#define __KEY_H#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t#define KEY PBin(0) //读取PB0的输入状态值
#define Read_KEY_Value() gpio_input_bit_get(GPIOB, GPIO_PIN_0) //读取PB0的输入状态值extern void KEY_Init(void);#endif
#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "UART3.h"
#include "stdio.h" //使能printf(),sprintf()
#include "KEY.h"
#include "Timer2_InputCapture.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"UART3_Init(115200);//初始化UART3printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"INTX_ENABLE();//开启所有中断KEY_Init();//初始化KEYTIMER2_Input_Init();//将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度while(1){if(KEY==0){printf("\n\rKEY==0");while(KEY==0);//等待按键释放}}
}
#include "UART3.h"
#include "stdio.h" //使能printf(),sprintf()void UART3_Init(unsigned int bound);//函数功能:初始化串口3,这个和STM32F103VET6的UART4兼容
void UART3_Init(unsigned int bound)
{rcu_periph_clock_enable(RCU_GPIOC); //使能GPIOC时钟,enable GPIO clock rcu_periph_clock_enable(RCU_UART3); //使能UART3时钟,enable USART clockgpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);//将GPIOC10设置为AFIO口(复用IO口),输出上拉gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);//将GPIOC11设置为浮空输入口usart_deinit(UART3); //复位UART3,USART configureusart_baudrate_set(UART3, bound); //设置UART3的波特率usart_word_length_set(UART3, USART_WL_8BIT); //设置UART3数据传输格式为8位usart_stop_bit_set(UART3, USART_STB_1BIT); //设置UART3停止位为1位usart_parity_config(UART3, USART_PM_NONE); //设置UART3无需奇偶校验usart_hardware_flow_rts_config(UART3, USART_RTS_DISABLE); //设置不使能UART3的RTS引脚功能usart_hardware_flow_cts_config(UART3, USART_CTS_DISABLE); //设置不使能UART3的CTS引脚功能usart_receive_config(UART3, USART_RECEIVE_ENABLE); //使能UART3接收usart_transmit_config(UART3, USART_TRANSMIT_ENABLE); //使能UART3发送usart_enable(UART3); //使能UART3
}/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{usart_data_transmit(UART3, (uint8_t) ch);while( RESET == usart_flag_get(UART3, USART_FLAG_TBE) ){//等待串口0发送结束}return ch;
}
相关文章:

GD32F103输入捕获
GD32F103输入捕获程序,经过多次测试,终于完成了。本程序将TIMER2_CH2通道映射到PB0引脚,捕获PB0引脚低电平脉冲时间宽度。PB0是一个按钮,第1次按下采集一个值保存到TIMER2_CountValue1中,第2次按下采集一个值保存到TIM…...

[RT-Thread]基于ARTPI的文件系统认识与搭建
[写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 目录 [写作为了记忆,个人最终输出的内容往往是遗忘后最容易捡起的内容,故以此作文] 前提 内容 认识 基于ARTPI的文件系统的挂载 ROMFS与LFS. (默认自动挂载,romfs可读不可写) 搭…...
动态规划+二分查找
题目描述:给定一个区间数组,[[1,2,3],[3,4,2],[2,4,4]],每个区间有价值,求在获取k个区间的条件下面,求获得的最大的价值,关键是dp的定义和二分查找的写法(小于tar额最右下标) import…...
8.2小非农ADP数据来袭黄金将会如何表现?
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析: 周二(8月1日)现货黄金价格回落,原因是美元指数升创7月10日以来新高至102.43.美联储官员乐观言论夯实美国经济软着陆预期。此外,中国刺激措施将…...
linux启动oracle
一、启动方法 方法1: Sql代码 cd $ORACLE_HOME/bin #进入到oracle的安装目录 ./dbstart #重启服务器 ./lsnrctl start #重启监听器 ----------------------------------- 方法2: (1) 以oracle身份登录数据库&am…...

AssetBundleBrowser导入报错解决方案
第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…...

vue-baidu-map-3x 使用记录
在 Vue3 TypeScript 项目中,为了采用 标签组件 的方式,使用百度地图组件,冲浪发现了一个开源库 ovo,很方便!喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本(支持v2.0、v…...

《GPU并行计算与CUDA编程》笔记
第一个GPU程序 #include <stdio.h>__global__ void square(float* d_out,float* d_in){int idx threadIdx.x;float f d_in[idx];d_out[idx] f * f; }int main(int argc,char** argv){const int ARRAY_SIZE 8;const int ARRAY_BYTES ARRAY_SIZE * sizeof(float);// …...
Shell编程基础(十二)函数
函数 概念定义调用函数综合脚本 概念 和其他编程语言一样,函数作为一种封装代码块,以提高代码复用性和可维护性的存在。 记住一点,先定义,再使用 定义 shell 函数的创建方式 function 函数名 空格{ xxxx return 返回码&#x…...

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报3
天气(自然现象) 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象,即某瞬时内大气中各种气象要素(如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等ÿ…...

Screens 4 for mac VNC客户端 强大的远程控制工具
Screens 4 for Mac 是一款功能强大的 VNC 客户端软件,为 Mac 用户提供了便捷的远程访问和控制解决方案。无论您是需要远程管理服务器、办公电脑,还是需要远程协助他人解决问题,Screens 4 都是您的理想选择。 Screens 4 for Mac具备简洁直观的…...
搜索与图论(三)
一、最小生成树 1.1Prim算法 朴素版Prim 一般用于稠密图 算法流程: 集合表示当前已经在连通块的点 1.初始化距离,把所有距离都初始化为正无穷 2.n次迭代,找到集合外距离最小的点 ->t 3.用t来更新其它点到集合的距离 #include<iostream> #include&…...

阿里云“通义千问”开源,可免费商用
我是卢松松,点点上面的头像,欢迎关注我哦! 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天,阿里云公开表态,把自家的通义千问大模型开源。 阿里云把通用70亿参数模型,包括Qwen-7B和对话模…...
23.7.31 牛客暑期多校5部分题解
E - Red and Blue and Green 题目大意 构造一个长度为 n n n 的序列,满足 m m m 个条件,每个条件包含三个数 l , r , w l,\space r,\space w l, r, w,表示区间左端点,区间右端点,这个区间的逆序对数的奇偶性&…...

Python爬虫的学习day02 requests 模块post 函数, lmxl 模块的 etree 模块
1. requests 模块post 函数 1.1 post 函数的参数 (简单版) 参数1: url 网络地址 参数2: data 请求数据 (一般数据是 账号,密码) 参数3: headers 头请求 (…...

客户流失分析预测案例 -- 机器学习项目基础篇(7)
客户流失 它是指现有的客户、用户、订阅者或任何类型的回头客停止与公司开展业务或结束与公司的关系。 客户流失的类型 合同客户流失:当客户签订了服务合同并决定取消服务时,例如有线电视,SaaS。自愿流失:当用户自愿取消服务时…...
uniapp中我使用uni.navigateTo跳转webview页面传参,但是接收的参数只有一半。
在uniapp中使用uni.navigateTo跳转webview页面传参时,可能会遇到接收的参数只有一半的情况。这可能是因为在跳转时,url的长度超过了限制。为了解决这个问题,可以使用encodeURIComponent和decodeURIComponent进行编码和解码。 具体的解决办法…...
使用kaminari,在列表页实现分页功能
安装 1. bundller 大于1的话,可以使用这个版本 gem install kaminari -v 0.16.3 或者 gem kaminari 2. 使用命令: $ bundle install 3. 然后使用这个命令可以创建一个config文件 $ rails g kaminari:config 4. 重新启动服务器 bundle exec rail…...

Android 性能调优之bitmap的优化
背景 Android开发中,加载图片过多、过大很容易引起OutOfMemoryError异常,即我们常见的内存溢出。因为Android对单个应用施加内存限制,默认分配的内存只有几M(具体视不同系统而定)。而载入的图片如果是JPG之类的压缩格…...
HOT74-数组中的第K个最大元素
leetcode原题链接:数组中的第K个最大元素 题目描述 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...