STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作
今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。
文章提供源码、测试工程下载、测试效果图。
目录
红外遥控原理:
红外遥控特点:
红外发射装置:
红外接收示意图:
NEC协议:
程序设计:
程序实践目标:
位带操作:
定时器4初始化:
定时器4中断服务程序:
处理红外键盘:
主函数:
测试效果:
工程下载:
红外遥控原理:
下图就是红外遥控与1858红外接收头
红外遥控特点:
优点:抗干扰能力强、信息可靠、功耗低、成本低、容易实现通信
缺点:距离只有几米
红外发射装置:
红外发射装置就比如遥控器,它是由键盘电路、红外编码电路、电源电路、红外发射电路组成的,红外发射电路在遥控器里是最特殊的,但它本质也是一个特殊的红外发光二极管,它在被激发时发出的是红外线,而不是普通二极管那样的可见光~
发射管红外波长:940Nm 载波频率:38KHZ
红外接收示意图:
由图可知,发射端在左侧控制二极管发射红外线,右侧接收端转化为0和1的信号
NEC协议:
配套的红外遥控器使用的是EC协议,EC码的位定义:
一个脉冲对应560us的连续载波,
一个逻辑1传输需要2.25ms(560us脉冲+1680us低电平),
一个逻辑0的传输需要 1.125ms(560us脉冲+560us低电平)。
反码就是源码基础上取反的意思
程序设计上应该先判断是否有引导码,有了引导码,之后就开始接收对应地址码,控制码以及他们的反码等。
程序设计:
红外接收方面,主要是获取高低电平的信号,而有关NEC逻辑,0协议的转换,接收头已经做好了,会从信号端直接传来1,0的电平信号,因此我们只需捕捉这样的电平信号,将其转换为具体的值即可~
这里提供俩种思路:1.外部中断法 2.定时器捕获法 都可以使用
程序实践目标:
使用定时器4 通道4 捕获红外接收模块接受的遥控信号,并通过串口1打印给上位机
位带操作:
这里我随便找了一个STM32能用的位带地址操作的宏定义,将其放在.h文件即可:
因为STM32 F103 C8T6的引脚只有PA 与 PB 端口,因此我将多出来的注释掉了~~
//IO口地址映射
//输出寄存器
#define GPIOA_ODR_Addr (GPIOA_BASE+12)//0x4001280C
#define GPIOB_ODR_Addr (GPIOB_BASE+12)//0x40010C0C
//#define GPIOC_ODR_Addr (GPIOC_BASE+12)//0x4001100C
//#define GPIOD_ODR_Addr (GPIOD_BASE+12)//0x4001140C
//#define GPTOE_ODR_Addr (GPIOE_BASE+12)//0x4001180C
//#define GPIOF_ODR_Addr (GPIOF_BASE+12)//0x40011A0C
//#define GPIOG_ODR_Addr (GPIOG_BASE+12)//0x40011E0C
//输入寄存器
#define GPIOA_IDR_Addr (GPIOA_BASE+8)//0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8)//0x40010C08
//#define GPIOC_IDR_Addr (GPIOC_BASE+8)//0x40011008
//#define GPIOD_IDR_Addr (GPIOD_BASE+8)//0x40011408
//#define GPIOE_IDR_Addr (GPIOE_BASE+8)//0x40011808
//#define GPTOF_IDR_Addr (GPIOF_BASE+8)//0x40011A08
//#define GPTOG_IDR_Addr (GPIOG_BASE+8)//0x40011E08//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define PAin(n) BIT_ADDR (GPIOA_IDR_Addr,n)//输入#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)//输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)//输入//#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)//输出
//#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)//输入
//
//#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)//输出
//#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)//输入
//
//#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)//输出
//#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)//输入
//
//#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)//输出
//#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)//输入
//
//#define PGout(n) BIT_ADDR(GPIOG_oDR_Addr,n)//输出
//#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)//输入
定时器4初始化:
//红外遥控初始化
//设置IO以及定时器4的输入捕获
void Remote_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能PORTB时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4 时钟使能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PB9 输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_9); //初始化GPIOB.9TIM_TimeBaseStructure.TIM_Period = 10000; //设定计数器自动重装值 最大10ms溢出TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //预分频器,1M的计数频率,1us加1.TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMxTIM_ICInitStructure.TIM_Channel = TIM_Channel_4; // 选择输入端 IC4映射到TI4上TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波TIM_ICInit(TIM4, &TIM_ICInitStructure);//初始化定时器输入捕获通道TIM_Cmd(TIM4,ENABLE ); //使能定时器4NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_ITConfig( TIM4,TIM_IT_Update|TIM_IT_CC4,ENABLE);//允许更新中断 ,允许CC4IE捕获中断
}//遥控器接收状态
//[7]:收到了引导码标志
//[6]:得到了一个按键的所有信息
//[5]:保留
//[4]:标记上升沿是否已经被捕获
//[3:0]:溢出计时器
u8 RmtSta=0;
u16 Dval; //下降沿时计数器的值
u32 RmtRec=0; //红外接收到的数据
u8 RmtCnt=0; //按键按下的次数
//定时器4中断服务程序
void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)//计时器更新中断{if(RmtSta&0x80) //上次有数据被接收到了{RmtSta&=~0X10; //取消上升沿已经被捕获标记if((RmtSta&0X0F)==0X00)RmtSta|=1<<6; //标记已经完成一次按键的键值信息采集if((RmtSta&0X0F)<14)RmtSta++;else{RmtSta&=~(1<<7); //清空引导标识RmtSta&=0XF0; //清空计数器}}}if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET)//捕获中断{if(RDATA)//上升沿捕获{TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC4P=1 设置为下降沿捕获TIM_SetCounter(TIM4,0); //清空定时器值RmtSta|=0X10; //标记上升沿已经被捕获} else //下降沿捕获{Dval=TIM_GetCapture4(TIM4); //读取CCR4也可以清CC4IF标志位TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC4P=0 设置为上升沿捕获if(RmtSta&0X10) //完成一次高电平捕获{if(RmtSta&0X80)//接收到了引导码{if(Dval>300&&Dval<800) //560为标准值,560us{RmtRec<<=1; //左移一位.RmtRec|=0; //接收到0} else if(Dval>1400&&Dval<1800) //1680为标准值,1680us{RmtRec<<=1; //左移一位.RmtRec|=1; //接收到1} else if(Dval>2200&&Dval<2600) //得到按键键值增加的信息 2500为标准值2.5ms{RmtCnt++; //按键次数增加1次RmtSta&=0XF0; //清空计时器}}else if(Dval>4200&&Dval<4700) //4500为标准值4.5ms{RmtSta|=1<<7; //标记成功接收到了引导码RmtCnt=0; //清除按键次数计数器}}RmtSta&=~(1<<4);//取消上升沿已经被捕获标记}}TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC4);
}
定时器4中断服务程序:
//遥控器接收状态
//[7]:收到了引导码标志
//[6]:得到了一个按键的所有信息
//[5]:保留
//[4]:标记上升沿是否已经被捕获
//[3:0]:溢出计时器
u8 RmtSta=0;
u16 Dval; //下降沿时计数器的值
u32 RmtRec=0; //红外接收到的数据
u8 RmtCnt=0; //按键按下的次数
//定时器4中断服务程序
void TIM4_IRQHandler(void)
{if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)//计时器更新中断{if(RmtSta&0x80) //上次有数据被接收到了{RmtSta&=~0X10; //取消上升沿已经被捕获标记if((RmtSta&0X0F)==0X00)RmtSta|=1<<6; //标记已经完成一次按键的键值信息采集if((RmtSta&0X0F)<14)RmtSta++;else{RmtSta&=~(1<<7); //清空引导标识RmtSta&=0XF0; //清空计数器}}}if(TIM_GetITStatus(TIM4,TIM_IT_CC4)!=RESET)//捕获中断{if(RDATA)//上升沿捕获{TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Falling); //CC4P=1 设置为下降沿捕获TIM_SetCounter(TIM4,0); //清空定时器值RmtSta|=0X10; //标记上升沿已经被捕获} else //下降沿捕获{Dval=TIM_GetCapture4(TIM4); //读取CCR4也可以清CC4IF标志位TIM_OC4PolarityConfig(TIM4,TIM_ICPolarity_Rising); //CC4P=0 设置为上升沿捕获if(RmtSta&0X10) //完成一次高电平捕获{if(RmtSta&0X80)//接收到了引导码{if(Dval>300&&Dval<800) //560为标准值,560us{RmtRec<<=1; //左移一位.RmtRec|=0; //接收到0} else if(Dval>1400&&Dval<1800) //1680为标准值,1680us{RmtRec<<=1; //左移一位.RmtRec|=1; //接收到1} else if(Dval>2200&&Dval<2600) //得到按键键值增加的信息 2500为标准值2.5ms{RmtCnt++; //按键次数增加1次RmtSta&=0XF0; //清空计时器}}else if(Dval>4200&&Dval<4700) //4500为标准值4.5ms{RmtSta|=1<<7; //标记成功接收到了引导码RmtCnt=0; //清除按键次数计数器}}RmtSta&=~(1<<4);//取消上升沿已经被捕获标记}}TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC4);
}
处理红外键盘:
//处理红外键盘
//返回值:
// 0,没有任何按键按下
//其他,按下的按键键值.
u8 Remote_Scan(void)
{u8 sta=0;u8 t1,t2;if(RmtSta&(1<<6))//得到一个按键的所有信息了{t1=RmtRec>>24; //得到地址码t2=(RmtRec>>16)&0xff; //得到地址反码if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址{t1=RmtRec>>8;t2=RmtRec;if(t1==(u8)~t2)sta=t1;//键值正确}if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了{RmtSta&=~(1<<6);//清除接收到有效按键标识RmtCnt=0; //清除按键次数计数器}}return sta;
}
主函数:
这里主函数为了防止打印反馈太频繁,改为定时器2 每100ms赋值一次Remote_temp变量 红外的接收值
#include "main.h"char Remote_temp,Remote_cnt;int main(void)
{ init_ALL(); //初始化所有函数:printf("HELLO \r\n");while(1){ if(Remote_temp!=0){printf("Remote_temp(DEX)=%d\r\n",Remote_temp); //十进制打印一次键值printf("Remote_temp(HEX)=%x\r\n",Remote_temp); //HEX 16 进制打印一次键值 } }
}//初始化所有函数:
void init_ALL(void)
{Usart1_Init(115200);SysTick_Init(72); //初始化滴答计时器Timer2_Init(); //初始化定时器2Remote_Init(); //红外按键初始化
}//定时器2中断服务函数
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ if(++Remote_cnt==10) //100ms赋值一次红外键值{Remote_cnt=0; Remote_temp=Remote_Scan();}TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中断寄存器标志位,用于退出中断}
}
测试效果:
工程下载:
https://download.csdn.net/download/qq_64257614/88241288?spm=1001.2014.3001.5503
相关文章:

STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作
今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理: 红外遥控特点: …...
linux 环境收集core文件步骤
Linux环境下进程发生异常而挂掉,通常很难查找原因,但是一般Linux内核给我们提供的核心文件,记录了进程在崩溃时候的信息,在C语言类的大型项目中,有助于深入定位。其配置流程如下: 1 查看生成core文件开关是…...

Git企业开发控制理论和实操-从入门到深入(一)|为什么需要Git|Git的安装
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…...

上篇——税收大数据应用研究
财税是国家治理的基础和重要支柱,税收是国家治理体系的重要组成部分。我们如何利用税收数据深入挖掘包含的数据价值,在进行数据分析,提升税收治理效能,推进税收现代化。 1. 定义与特点 对于“大数据”(Big data&#…...

疲劳驾驶检测和识别4:C++实现疲劳驾驶检测和识别(含源码,可实时检测)
疲劳驾驶检测和识别4:C实现疲劳驾驶检测和识别(含源码,可实时检测) 目录 疲劳驾驶检测和识别4:C实现疲劳驾驶检测和识别(含源码,可实时检测) 1.疲劳驾驶检测和识别方法 2.人脸检测方法 3.疲劳驾驶识别模型(Python) …...
Android WakefulBroadcastReceiver的使用
WakefulBroadcastReceiver 是一种特殊类型的广播接收器,为应用创建和管理 PARTIAL_WAKE_LOCK 。 简单来说, WakefulBroadcastReceiver 是持有系统唤醒锁的 BroadcastReceiver ,用于执行需要保持CPU运转的场景。 注册 注册 Receiver &#…...

python知识:什么是字符编码?
前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 我们的MySQL使用latin1的默认字符集, 也就是说,对汉字字段直接使用GBK内码的编码进行存储, 当需要对一些有汉字的字段进行拼音排序时(特别涉及到类似于名字这样的字段时…...
Vue2中使用Pinia
Vue2中使用Pinia 1.初始化配置 # main.jsimport Vue from vue import App from ./App.vue import pinia from ./stores/index import { PiniaVuePlugin } from piniaVue.use(PiniaVuePlugin)new Vue({render: h > h(App),pinia, }).$mount(#app)2.模块化开发 新建stores文…...

Docker关于下载,镜像配置,容器启动,停止,查看等基础操作
系列文章目录 文章目录 系列文章目录前言一、安装Docker并配置镜像加速器二、下载系统镜像(Ubuntu、 centos)三、基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母)四、容器的启动、 停止及重启…...
穿越网络迷雾的神奇通道 - WebSocket详解
WebSocket,作为一项前端技术,已经成为现代Web应用不可或缺的一部分。本文将深入解析WebSocket,介绍其工作原理和用途,并通过简单的代码示例,让你对这个神奇的网络通信协议有更深入的了解。 WebSocket是什么࿱…...

无脑入门pytorch系列(五)—— nn.Dropout
本系列教程适用于没有任何pytorch的同学(简单的python语法还是要的),从代码的表层出发挖掘代码的深层含义,理解具体的意思和内涵。pytorch的很多函数看着非常简单,但是其中包含了很多内容,不了解其中的意思…...

Python土力学与基础工程计算.PDF-压水试验
Python 求解代码如下: 1. import math 2. 3. # 输入参数 4. L 2.0 # 试验段长度,m 5. Q 120.0 # 第三阶段计算流量,L/min 6. p 1.5 # 第三阶段试验段压力,MPa 7. r0 0.05 # 钻孔半径,m 8. 9. # 计算透…...

Linux入门
一、安装相关软件 1.下载vmware (很容易下载,搜一下官网 ) 在cmd敲入 ncpa.cpl ,查看是否有vmware 2.下载centos 下面是镜像源网站,当然你可以选择其他的镜像源,像清华镜像源和阿里镜像源。 Index of /centos/7.9.2009/isos/x86_64/ | …...

适合国内用户的五款ChatGPT插件
众所周知使用ChatGPT3.5需要使用魔法且不稳定,订阅ChatGPT4.0每月需要支付20美元,并且使用次数有限制。对于那些不想每年花费240美元(超过1500元人民币)来使用GPT4.0的朋友们来说,还有别的办法吗? 答案是&…...

Dubbo Spring Boot Starter 开发微服务应用
环境要求 系统:Windows、Linux、MacOS JDK 8 及以上(推荐使用 JDK17) Git IntelliJ IDEA(可选) Docker (可选) 项目介绍 在本任务中,将分为 3 个子模块进行独立开发ÿ…...

linux中互斥锁,自旋锁,条件变量,信号量,与freeRTOS中的消息队列,信号量,互斥量,事件的区别
RTOS 对于目前主流的RTOS的任务,大部分都属于并发的线程。 因为MCU上的资源每个任务都是共享的,可以认为是单进程多线程模型。 【freertos】003-任务基础知识 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如…...

安装docker服务,配置镜像加速器
文章目录 1.安装docker服务,配置镜像加速器2.下载系统镜像(Ubuntu、 centos)3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母)4.容器的启动、 停止及重启操作5.怎么查看正在运行…...
CF 896 C Willem, Chtholly and Seniorious(珂朵莉树模板)
CF 896 C. Willem, Chtholly and Seniorious(珂朵莉树模板) Problem - C - Codeforces 大意:给出一个区间 , 要求进行四种操作 , 区间加 , 区间第k大 , 区间推平 , 区间求和。 珂朵莉树模板题 ÿ…...
Android Jetpack组件的全方位分析
Jetpack是一个用于简化Android应用程序开发的工具包,包含了一系列的组件和工具。Jetpack包含了很多组件,如LiveData、ViewModel、Room、Data Binding、Navigation等。 Jetpack组件是一种更高级别的抽象,它们可以提供更简洁、更易于使用的API。…...

Prometheus+Grafana+AlertManager监控SpringBoot项目并发送邮件告警通知
文章目录 PrometheusGrafanaAlertManager监控平台搭建新建SpringBoot项目为Prometheus提供指标新建项目,引入依赖新建接口,运行程序 推送指标到pushgateway 开始监控Grafana连接Prometheus数据源导入Grafana模板监控SpringBoot项目 邮件告警通知同系列文…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...