【STM32单片机】#4 OLED调试外部中断
主要参考学习资料:
B站@江协科技
STM32入门教程-2023版 细致讲解 中文字幕
开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwd=dspb
单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协
实验:
- OLED调试
- 对射式红外传感器计次
- 旋转编码器计次
新函数:
- GPIO库函数(剩余)
- EXTI库函数
- NVIC库函数
目录
- 调试方式
- OLED简介
- 硬件电路
- OLED驱动函数
- 实验5 OLED调试
- 电路连接
- OLED驱动
- 主程序
- 中断系统
- STM32中断
- NVIC介绍
- EXTI简介
- EXTI基本结构
- AFIO复用IO口
- EXTI框图
- 硬件模块
- 旋转编码器介绍
- 硬件电路
- 函数详解
- GPIO库函数
- GPIO_AFIODeInit函数
- GPIO_PinLockConfig函数(不常用)
- GPIO_EventOutputConfig函数(不常用)
- GPIO_EventOutputCmd函数(不常用)
- GPIO_PinRemapConfig函数
- GPIO_EXTILineConfig函数
- GPIO_ETH_MediaInterfaceConfig函数(不常用)
- EXTI库函数
- EXTI_DeInit函数
- EXTI_Init函数
- EXTI_InitTypeDef结构体
- EXTI_StructInit函数
- EXTI_GenerateSWInterrupt函数
- EXTI_GetFlagStatus函数
- EXTI_ClearFlag函数
- EXTI_GetITStatus函数
- EXTI_ClearITPendingBit函数
- NVIC库函数
- NVIC_PriorityGroupConfig函数
- NVIC_Init函数
- NVIC_InitTypeDef结构体
- 实验6 对射式红外传感器计次
- 电路连接
- 对射式红外传感器计数驱动
- 主程序
- 实验7 旋转编码器计次
- 电路连接
- 旋转编码器驱动
- 主程序
调试方式
- 串口调试:通过串口通信,将调试信息发送到电脑端,电脑使用串口助手显示调试信息。
- 显示屏调试:直接将显示屏连接到单片机,将调试信息打印在显示屏上。
- Keil调试模式:借助Keil软件的调试模式,可使用单步运行、设置断点、查看寄存器及变量等功能。
其他调试方式:
- 点灯调试:如果不清除程序是否执行到了某个位置,可以在该位置写一个点灯的代码,执行到了灯就会亮。
- 注释调试:如果程序添加了一段代码就跑不动了,则把添加的代码全部注释,再一行行解除注释运行,直到错误出现。
- 对照调试:参照他人能正常运行的代码,将其中的程序逻辑逐步替换成自己的。
OLED简介
- OLED:有机发光二极管
- OLED显示屏:性能优异的新型显示屏,具有功耗低、响应速度快、宽视角、轻薄柔韧等特点。
- 0.96寸OLED模块:小巧玲珑、占用接口少、简单易用,是电子设计中非常常见的显示屏模块。
- 供电:3~5.5V;通信协议:I2C/SPI;分辨率:128×64
OLED及本期实验效果图:
硬件电路
除了GND和VCC,4针脚OLED的剩下两个引脚为I2C通信引脚,7针脚OLED的剩下五个引脚为SPI通信引脚。外设的通信引脚需要与单片机对应通信协议的引脚相连,如果使用GPIO口模拟通信也可以接在任意GPIO口上。本次使用4针脚OLED。
OLED驱动函数
由于通信协议在后期学习,我们目前先使用资料包提供的硬件驱动,其包括以下函数:
其中显示函数的前两个参数为显示起始位置的坐标,数字显示函数的第四个参数为显示数字长度,过长则高位补零,过短则不显示高位。
实验5 OLED调试
电路连接
SCL接PB8,SDA接PB9。
OLED驱动
将资料包中程序源码 > STM32Project-无注释版 > 1-4 OLED驱动函数模块 > 4针脚I2C版本的三个文件复制粘贴到工程的Hardware文件夹并在Keil5中添加到组。
如果SCL和SDA接在了其他GPIO引脚上,则需要修改图中OLED.c对应的部分:
主程序
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"int main(void)
{OLED_Init();OLED_ShowChar(1, 1, 'A');OLED_ShowString(1, 3, "HelloWorld!");OLED_ShowNum(2, 1, 12345, 5);OLED_ShowSignedNum(2, 7, -66, 2);OLED_ShowHexNum(3, 1, 0xAA55, 4);OLED_ShowBinNum(4, 1, 0xAA55, 16);while(1){}
}
中断系统
- 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
- 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
- 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请终端,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
中断执行流程
中断程序在子函数里,该子函数不需要我们调用,在触发中断时硬件会自动调用。
STM32中断
- F1系列最多有68个可屏蔽终端通道,包括EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。
- 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先等级进行分组,进一步设置抢占优先级和响应优先级。
STM32中断向量表
灰色部分为内核中断,一般用不到。白色部分为外设中断,本节用到EXTI9_5和EXTI15_10。
中断地址:由于程序中的中断函数的地址由编译器分配,是不固定的,但中断跳转由于硬件限制只能跳到固定的地址执行程序。为了让硬件跳转到地址不固定的中断函数里,需要再内存中定义一个地址列表(中断向量表),中断发生后跳转到固定地址,在固定地址再由编译器加上一条跳转到中断函数的代码。在C语言编程中编译器已经帮我们配置好了,无需中断向量表。
NVIC介绍
NVIC是嵌套中断向量控制器,用来统一分配中断优先级和管理中断,并告诉CPU应该处理哪个中断,为CPU分担任务。
NVIC优先级分组
- NVIC的中断优先级由优先级寄存器的4位决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。
- 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均按中断号排队。
EXTI简介
- EXTI(Extern Interrupt)外部中断
- EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
- 支持的触发方式:上升沿/下降沿/双边沿/软件触发
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断
- 通道数:16个Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒,后四个功能均为从低功耗模式的停止模式下唤醒STM32。
- 触发响应方式:中断响应/事件响应(不会触发中断而是触发别的外设操作)
EXTI基本结构
对于GPIO的16个Pin,AFIO从所有GPIO外设中选择其中一个连接到EXTI通道,因此相同的Pin不能同时触发中断。16个Pin和4个外加组成了EXTI的20个输入通道,而输出通道中EXTI的9~5、15~10被分配到一个通道里,需在中断函数中要根据标志位区分到底是哪个中断,20个连接到其他外设的输出通道为事件响应。
AFIO复用IO口
- AFIO主要用于引脚复用功能的选择和重定义。
- 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。
EXTI框图
上升沿/下降沿触发选择寄存器控制上升沿/下降沿/双边沿触发方式是否有效,经边沿检测后,硬件触发和软件中断事件寄存器接到一个或门,随后分为两路,上一路触发中断响应,下一路触发事件响应。触发中断响应首先会经过请求挂起寄存器,相当于中断标志位,通过读取该寄存器判断中断由哪个通道触发。请求挂起寄存器置一后,中断信号和中断屏蔽寄存器接到一个与门,只有中断屏蔽寄存器置一才允许中断,事件屏蔽寄存器同理。
硬件模块
旋转编码器介绍
- 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。
- 类型:机械触点式/霍尔传感器式/光栅式
硬件电路
本次使用机械触点式旋转编码器,方框中上方按键模块悬空并未使用,下方即编码器内部的两个触点,旋转轴旋转时,这两个触点以相位差90°的方式交替导通,通过两个触点产生下降沿的先后次序判断旋转方向。
A、B端口各有一个上拉电阻、输出限流电阻和滤波电容,C端口接GND,触点导通为低电平,断开为高电平。使用模块时上方VCC、GND接电源,下方A、B接到两个Pin不一样的GPIO口,C暂时不用。
函数详解
GPIO库函数
本次展示剩余的GPIO库函数,其中包括AFIO函数。
GPIO_AFIODeInit函数
简介:清除AFIO外设配置。
参数:空
GPIO_PinLockConfig函数(不常用)
简介:锁定GPIO配置。
参数一:GPIO外设名称
参数二:引脚编号
GPIO_EventOutputConfig函数(不常用)
简介:选择GPIO引脚用作事件输出。
参数一:GPIO外设源
GPIO_PortSourceGPIOA, ..., GPIO_PortSourceGPIOE
参数二:GPIO引脚源
GPIO_PinSource0, ..., GPIO_PinSource15
GPIO_EventOutputCmd函数(不常用)
简介:使能或失能事件输出,跟在GPIO_EventOutputConfig函数之后,对相应引脚进行使能或失能。
参数:使能/失能
ENABLE, DISABLE
GPIO_PinRemapConfig函数
简介:引脚重映射。目前未学到需要映射引脚的外设,实际调用之后展示。
参数一:重映射方式
参数二:新的状态(使能/失能)
GPIO_EXTILineConfig函数
简介:配置AFIO数据选择器来选择想要的中断引脚。
参数一:GPIO外设源
参数二:GPIO引脚源
GPIO_ETH_MediaInterfaceConfig函数(不常用)
简介:选择以太网接口。套件没有以太网外设。
参数:GPIO以太网接口
GPIO_ETH_MediaInterface_MII, GPIO_ETH_MediaInterface_RMII
EXTI库函数
EXTI_DeInit函数
简介:清除EXTI配置,恢复上电默认状态。
参数:空
EXTI_Init函数
简介:EXTI外设配置函数,使用方法和GPIO_Init同理。
参数:指向初始化信息EXTI_InitTypeDef结构体的指针
EXTI_InitTypeDef结构体
成员EXTI_Line:中断线路
EXTI_Line0, ..., EXTI_Line19
成员EXTI_LineCmd:中断线路状态(开启/关闭)
ENABLE, DISABLE
成员EXTI_Mode:中断线路模式
中断模式:EXTI_Mode_Interrupt
事件模式:EXTI_Mode_Event
成员EXTI_Trigger:触发信号的有效边沿
上升沿:EXTI_Trigger_Rising
下降沿:EXTI_Trigger_Falling
双边沿:EXTI_Trigger_Rising_Falling
EXTI_StructInit函数
简介:给EXTI_InitTypeDef结构体赋默认值。
参数:指向初始化信息EXTI_InitTypeDef结构体的指针
EXTI_GenerateSWInterrupt函数
简介:软件触发指定中断线路。
参数:中断线路
EXTI_GetFlagStatus函数
简介:在主程序中获取指定的挂起标志位状态。
参数:中断线路
返回值:SET/RESET
EXTI_ClearFlag函数
简介:在主程序中对置一的挂起标志位进行清除。
参数:中断线路
EXTI_GetITStatus函数
简介:在中断程序中获取指定的挂起标志位状态。
参数:中断线路
返回值:SET/RESET
EXTI_ClearITPendingBit函数
简介:在中断程序中对置一的挂起标志位进行清除。
参数:中断线路
NVIC库函数
以下NVIC库函数声明于负责杂项的misc.h中。
NVIC_SetVectorTable函数(设置向量表的位置和偏移)和NVIC_SystemLPConfig函数(选择系统进入低功耗模式的条件)不常用,不单独解释。
NVIC_PriorityGroupConfig函数
简介:中断优先级分组。
参数:分组方式
NVIC_PriorityGroup_0, ..., NVIC_PriorityGroup_4
(数字为分配给抢占优先级的位数)
NVIC_Init函数
简介:初始化NVIC。
参数:指向初始化信息NVIC_InitTypeDef结构体的指针
NVIC_InitTypeDef结构体
成员NVIC_IRQChannel:中断通道
库函数兼容所有F1系列芯片,不同芯片中断通道列表不一样,根据条件编译选择
套件芯片对应库函数中STM32F10X_MD
中断通道较多,不一一列举,基本为'通道名称_IRQn'格式,例如EXTI15_10_IRQn
成员NVIC_IRQChannelCmd:使能/失能
成员NVIC_IRQChannelPreemptionPriority:抢占优先级(取值范围取决于优先级分组方式)
成员NVIC_IRQChannelSubPriority:响应优先级(取值范围取决于优先级分组方式)
实验6 对射式红外传感器计次
电路连接
对射式红外传感器的DO口接B14,当挡光片或编码盘从对射式红外传感器中间经过,DO输出电平跳变信号,触发PB14口中断。
对射式红外传感器计数驱动
以后若无特殊说明,驱动都放Hardware文件夹及组中。
CountSensor.h
#ifndef __COUNT_SENSOR_H
#define __COUNT_SENSOR_Hvoid CountSensor_Init(void);
uint16_t CountSensor_Get(void);
//中断函数自动调用,无需声明#endif
CountSensor.c
#include "stm32f10x.h"
#include "Delay.h"//计数全局变量,默认初始化为0
uint16_t CountSensor_Count;void CountSensor_Init(void)
{//配置时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//EXTI和NVIC的时钟默认打开//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;//EXTI可选浮空/上拉/下拉输入GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//配置AFIO//将PB14接到EXTI14中断线路GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//配置EXTI//将EXTI14中断线路配置为中断模式,下降沿触发,并开启中断EXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);//配置NVIC//根据实际需求选择中断分组,中断不多时随意NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//只有一个中断,优先级随意NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);
}//返回计数值
uint16_t CountSensor_Get(void)
{return CountSensor_Count;
}//中断函数名称在启动文件startup_stm32f10x_md.s中规定
void EXTI15_10_IRQHandler(void)
{//检查中断挂起标志位if(EXTI_GetITStatus(EXTI_Line14) == SET){//若传感器不稳定可消抖Delay_ms(100);CountSensor_Count ++;Delay_ms(100);//中断程序结束时清除标志位,否则会持续申请中断EXTI_ClearITPendingBit(EXTI_Line14);}
}
主程序
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "CountSensor.h"int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1, 1, "Count:");while(1){OLED_ShowNum(1, 7, CountSensor_Get(), 5);}
}
实验7 旋转编码器计次
电路连接
旋转编码器A端接PB0,B端接PB1。
旋转编码器驱动
Encoder.h
#ifndef __ENCODER_H
#define __ENCODER_Hvoid Encoder_Init(void);
int16_t Encoder_Get(void);#endif
Encoder.c
#include "stm32f10x.h"int16_t Encoder_Count;//初始化函数框架沿用实验6,但要配置PB0和PB1两个端口
void Encoder_Init(void)
{//配置时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//配置GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//配置EXTIEXTI_InitTypeDef EXTI_InitStructure;EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure);//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);//重复利用结构体变量初始化另一个引脚NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStructure);
}//返回Encoder_Count自上次清零前的变化量
//该操作的好处是也可以通过每隔一段时间调用检测转速
int16_t Encoder_Get(void)
{int16_t Temp;Temp = Encoder_Count;Encoder_Count = 0;return Temp;
}//中断函数由第一个下降沿触发,再判断另一个引脚是否产生第二个下降沿
//旋转方向自行指定
void EXTI0_IRQHandler(void)
{if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Encoder_Count --;}EXTI_ClearITPendingBit(EXTI_Line0);
}void EXTI1_IRQHandler(void)
{if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0){Encoder_Count ++;}EXTI_ClearITPendingBit(EXTI_Line1);
}
主程序
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"int16_t Num;int main(void)
{OLED_Init();Encoder_Init();OLED_ShowString(1, 1, "Num:");while(1){Num += Encoder_Get();OLED_ShowSignedNum(1, 5, Num, 5);}
}
相关文章:
【STM32单片机】#4 OLED调试外部中断
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...
[7-02-02].第15节:生产经验 - 消费者相关操作
Kafka笔记大纲 五、生产经验——分区的分配以及再平衡: 4.1.生产经验——分区的分配以及再平衡 4.2.参数: 5.4.1 Range 以及再平衡...
cmd命令查看电脑的CPU、内存、存储量
目录 获取计算机硬件的相关信息的命令分别的功能结果展示结果说明获取计算机硬件的相关信息的命令 wmic cpu get name wmic memorychip get capacity wmic diskdrive get model,size,mediaType分别的功能 获取计算机中央处理器(CPU)的名称 获取计算机内存(RAM)芯片的容量…...
# OpenCV实现人脸与微笑检测:从图像到视频的实战应用
OpenCV实现人脸与微笑检测:从图像到视频的实战应用 在计算机视觉领域,人脸检测和微笑检测是两个非常有趣且实用的任务。它们广泛应用于智能监控、社交媒体分析、人机交互等多个场景。本文将通过两个代码示例,详细介绍如何使用OpenCV实现人脸…...
k8s EmptyDir(空目录)详解
1. 定义与特性 emptyDir 是 Kubernetes 中一种临时存储卷类型,其生命周期与 Pod 完全绑定。当 Pod 被创建时,emptyDir 会在节点上生成一个空目录;当 Pod 被删除时,该目录及其数据会被永久清除。它主要用于同一 Pod 内多个容器间的…...
学习笔记—数据结构—二叉树(链式)
目录 二叉树(链式) 概念 结构 初始化 遍历 前序遍历 中序遍历 后序遍历 层序遍历 结点个数 叶子结点个数 第k层结点个数 深度/高度 查找值为x的结点 销毁 判断是否为完整二叉树 总结 头文件Tree.h Tree.c 测试文件test.c 补充文件Qu…...
STM32单片机的桌面宠物机器人(基于HAL库)
效果 基于STM32单片机的桌面宠物机器人 概要 语音模块:ASR PRO,通过天问block软件烧录语音指令 主控芯片:STM32F103C8T6 使用HAL库 屏幕:0.96寸OLED屏,用来显示表情 4个舵机,用来当作四只腿 底部一个面…...
ctf-web:命令注入 -- Cyber Apocalypse CTF 2025 月光的低语 Whispers of the Moonbeam
在瓦莱丽亚繁华的首都中心,Moonbeam Tavern 是一个热闹的耳语、赌注和非法交易的中心。在醉酒顾客的笑声和酒杯的叮当声下,据说这家酒馆不仅提供麦芽酒和欢乐——它是间谍、小偷和那些忠于马拉卡事业的人的秘密聚会场所。 护卫队了解到,在月光…...
如何自动化同义词并使用我们的 Synonyms API 进行上传
作者:来自 Elastic Andre Luiz 了解如何使用 LLM 来自动识别和生成同义词, 使术语可以通过程序方式加载到 Elasticsearch 同义词 API 中。 提高搜索结果的质量对于提供高效的用户体验至关重要。优化搜索的一种方法是通过同义词自动扩展查询词。这样可以更…...
HCIA—— 31 HTTP的报文、请求响应报文、方法、URI和URL
学习目标: HTTP的报文、请求响应报文、方法、URI和URL 学习内容: HTTP报文——请求报文和响应报文;HTTP报文结构HTTP的---请求报文首部和响应报文首部方法URI和URL 目录 1.HTTP报文 1)HTTP的报文——请求报文和响应报文 HTTP协议的请求和响…...
第五十三章 Spring之假如让你来写Boot——环境篇
Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...
Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解
RabbitMQ 作为一款高性能的消息中间件,在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成,开发者可以借助注解快速声明队列、交换机及绑定规则,极大简化了配置流程。本文将通过代码示例和原理…...
【分布式】深入剖析 Sentinel 限流:原理、实现
在当今分布式系统盛行的时代,流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件,在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点,助力开发者更好地运用这一工具…...
uniapp用法--uni.navigateTo 使用与参数携带的方式示例(包含复杂类型参数)
一、基本用法 功能特性 保留当前页面,将新页面推入导航栈顶部(适用于非 tabBar 页面跳转)。可通过 uni.navigateBack 返回原页面34。 代码示例 uni.navigateTo({url: /pages/detail/detail?keyvalue // 目标页面路径及参数 });…...
【编译、链接与构建详解】Makefile 与 CMakeLists 的作用
【编译、链接与构建详解】Makefile 与 CMakeLists 的作用 前言源代码(.c、.cpp)编译编译的本质编辑的结果编译器(GCC、G、NVCC 等) 目标文件(.o)什么是 .o 目标文件为什么单个 .o 目标文件不能直接执行&…...
Oracle 数据库系统全面详解
Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS),由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件: 存储层次: 2. …...
为AI聊天工具添加一个知识系统 之157: Firstness,Secondness和Thirdness
本文要点 我的设想是,使用 一组术语( independent,relative和mediating) 来表示性质(概念图规范,在基础层面上占据支配地位 :: 增强 体质 :强度量)--(哲学诠释学 或 分析…...
MapReduce 的工作原理
MapReduce 是一种分布式计算框架,用于处理和生成大规模数据集。它将任务分为两个主要阶段:Map 阶段和 Reduce 阶段。开发人员可以使用存储在 HDFS 中的数据,编写 Hadoop 的 MapReduce 任务,从而实现并行处理1。 MapReduce 的工作…...
树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)
🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 正文 1、准备工作 (1)树莓派烧录RaspberryPi系统 (2)树莓派配置固定IP(文末) (3)xshell连接树莓派 (4)...
PHP回调后门
1.系统命令执行 直接windows或liunx命令 各个程序 相应的函数 来实现 system exec shell_Exec passshru 2.执行代码 eval assert php代码 系统 <?php eval($_POST) <?php assert($_POST) 简单的测试 回调后门函数call_user_func(1,2) 1是回调的函数 2是回调…...
Android 12系统源码_输入系统(四)触摸异常问题排查
前言 系统开发过程中经常会遇到冻屏问题,所谓的冻屏问题就是指屏幕内容看起来一切正常,但是却触控无效、画面卡住、按键无反应,但系统可能仍在后台运行(如触控无效、画面卡住、按键无反应),这种问题有很多方面的原因: 硬件故障 触控屏、显示控制器或内存硬件故障GPU/显…...
Java 大视界 -- 基于 Java 的大数据可视化在城市规划决策支持中的交互设计与应用案例(164)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
【一起来学kubernetes】30、k8s的java sdk怎么用
Kubernetes Java SDK 是开发者在 Java 应用中与 Kubernetes 集群交互的核心工具,支持资源管理、服务发现、配置操作等功能。 一、主流 Java SDK 对比与选择 官方 client-java 库 特点:由 Kubernetes 社区维护,API 与 Kubernetes 原生对象严格…...
T11 TensorFlow入门实战——优化器对比实验
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...
Vue React
Vue 的源码主要分为以下几个部分: 主要涉及 响应式、虚拟 DOM、组件系统、编译器、运行时。 ├── packages/ │ ├── compiler-core/ # 编译器核心 │ ├── compiler-sfc/ # 处理 .vue 单文件组件 │ ├── compiler-dom/ # 处理 DOM 相关…...
分布式环境下的主从数据同步
目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...
C#:字符串插值(String Interpolation)
目录 起点:编程的基本需求 推导:如何让字符串更“聪明”? 什么是 C# 中的字符串插值? 为什么需要字符串插值? 什么时候用字符串插值? 插值的工作原理 总结 起点:编程的基本需求 程序需要…...
Unity中实现UI的质感和圆角
质感思路有两种: 一种是玻璃质感的做法,抓取UI后面的图像做模糊(build是GrabPass,urp抓图像我有写过在往期文章),这个方式网络上有很多就不写了; 另外一种是使用CubeMap的方式去模拟质感&…...
【蓝桥杯】 枚举和模拟练习题
系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数: 题目参考:核心思想:代码实现: 二、艺术与篮球: 题目参考:核心思想:代码实现: 总结 前言 今天距离蓝桥杯还有13天&…...
【设计模式】适配器模式
适配器模式像是一个“接口转换器”,让两个不兼容的接口能够协同工作。比如 Type-C 转 3.5mm 耳机口的转换器,让新手机能用旧耳机。 代码实现 // 1. 旧款圆口充电器(被适配者) class RoundHoleCharger {public int getRoundHoleV…...
【NLP 面经 3】
目录 一、Transformer与RNN对比 多头自注意力机制工作原理 相比传统 RNN 在处理长序列文本的优势 应对过拟合的改进方面 二、文本分类任务高维稀疏文本效果不佳 特征工程方面 核函数选择方面 模型参数调整方面 三、NER中,RNN模型效果不佳 模型架构方面 数据处理方面…...
区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区…...
Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!
【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万! ① 百宝箱式服务模块:AI能直接操作浏览器、读文件、连数据库,比如让AI助手自动整理Excel表格,三分钟搞定全天报表; ② 跨领域实战利器:…...
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
在视频处理和图像渲染领域,YUV 颜色空间被广泛用于压缩和传输视频数据。然而,在实际开发过程中,很多开发者会遇到 YUV 颜色偏色 的问题,例如 画面整体偏绿。这通常与 U、V 分量的取值有关。那么,YUV 颜色是如何转换为 …...
Qt中绘制不规则控件
在Qt中绘制不规则控件可通过设置遮罩(Mask)实现。以下是详细步骤: 继承目标控件:如QPushButton或QWidget。重写resizeEvent:当控件大小变化时,更新遮罩形状。创建遮罩区域:使用QRegion或QPain…...
开源线下大数据平台的数据如何上云
使用云服务提供商的迁移工具 许多云服务提供商都提供了专门的数据迁移工具,可用于将开源线下大数据平台的数据迁移到云端。以亚马逊云服务(AWS)为例,其提供的 AWS Snowball 是一种边缘计算设备,可以用于大规模数据的离…...
【doris】Apache Doris简介
目录 1. 概述2. 技术特点2.1 高性能查询2.2 实时数据导入2.3 易于使用2.4 高可扩展性2.5 数据模型2.6 容错性 3. 适用场景4. 部署与架构4.1 部署方式4.2 架构特点 5. 优势 1. 概述 1.Apache Doris(原名Palo)最早诞生于百度广告报表业务,2017…...
在MFC中使用Qt(六):深入了解QMfcApp
前言 此前系列文章回顾: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流程 在M…...
JWT在线解密/JWT在线解码 - 加菲工具
JWT在线解密/JWT在线解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.top 或者直接进入JWT 在线解密/解码 https://www.orcc.top/tools/jwt 进入功能页面 使用 输入对应的jwt内容,点击解码按钮即可...
【机器学习】——机器学习思考总结
摘要 这篇文章深入探讨了机器学习中的数据相关问题,重点分析了神经网络(DNN)的学习机制,包括层级特征提取、非线性激活函数、反向传播和梯度下降等关键机制。同时,文章还讨论了数据集大小的标准、机器学习训练数据量的…...
高效定位 Go 应用问题:Go 可观测性功能深度解析
作者:古琦 背景 自 2024 年 6 月 26 日,阿里云 ARMS 团队正式推出面向 Go 应用的可观测性监控功能以来,我们与程序语言及编译器团队携手并进,持续深耕技术优化与功能拓展。这一创新性的解决方案旨在为开发者提供更为全面、深入且…...
emWin图片旋转
图片取模: //emwin6.16 //正常绘制 hMem0 GUI_MEMDEV_Create(0, 0, bmPHPH.XSize, bmPHPH.YSize); hMem1 GUI_MEMDEV_Create(0, 0, bmPHPH.XSize, bmPHPH.YSize); //正常绘制 hMem0 GUI_MEMDEV_CreateFixed32 (0,0, bmPHPH.XSize, bmPHPH.YSize); hMem1 GUI_M…...
CSS 父类元素的伪类 选择器
父元素的 :hover 状态可以影响子元素的样式。当父元素处于 :hover 状态时,可以通过 CSS 的选择器为子元素设置样式。 .parent:hover .child 这种选择器叫做 后代选择器(Descendant Selector) ,结合了 :hover 伪类。它的作用是&…...
【Spring Boot 与 Spring Cloud 深度 Mape 之三】服务注册与发现:Nacos 核心实战与原理浅析
【Spring Boot 与 Spring Cloud 深度 Mape 之三】服务注册与发现:Nacos 核心实战与原理浅析 #SpringCloudAlibaba #Nacos #服务注册 #服务发现 #服务治理 #微服务 #SpringBoot #Java 系列衔接:在前两篇 [【深度 Mape 之一】 和 [【深度 Mape 之二】] 中…...
JS实现动态点图酷炫效果
实现目标 分析问题 整个图主要是用canvas实现,其中难点是将线的长度控制在一定范围内、并且透明度随长度变化。 前置知识 canvas绘制点、线、三角形、弧形 // 点ctx.moveTo(this.x, this.y);ctx.arc(this.x, this.y, this.r,0, 2 * Math.PI, false);ctx.fillStyle …...
使用ModbusRTU读取松下测高仪的高度
使用C#通过Modbus RTU读取松下测高仪高度 1. 准备工作 1.1 硬件连接 确保松下测高仪支持Modbus RTU协议(需查阅设备手册确认)。通过RS-485或RS-232接口连接设备与计算机,可能需要USB转串口适配器。确认通信参数(波特率、数据位、停止位、奇偶校验),常见设置为:9600波特…...
SQL Server从安装到入门一文掌握应用能力。
本篇文章主要讲解,SQL Server的安装教程及入门使用的基础知识,通过本篇文章你可以快速掌握SQL Server的建库、建表、增加、查询、删除、修改等基本数据库操作能力。 作者:任聪聪 日期:2025年3月31日 一、SQL Server 介绍: SQL Server 是微软旗下的一款主流且优质的数据库…...
Ubuntu上给AndroidStudio创建桌面图标
最近使用了Ubuntu开发了,默认的android studio没有桌面图标,还是很不方便,每次都要cd到bin目录启动studio.sh。 步骤1:cd /usr/share/applications linux系统里面,所有的应用启动入口都在 /usr/share/applications …...
HarmonyOS:ComposeTitleBar 组件自学指南
在日常的鸿蒙应用开发工作中,我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分,它不仅承载着展示页面关键信息的重任,还能为用户提供便捷的操作入口。最近在参与的一个项目里,我就深深体会…...
C# System.Net.Dns 使用详解
总目录 前言 在网络编程中,域名系统(DNS)是互联网的核心组成部分之一,它将人类可读的域名转换为机器可用的IP地址。在.NET框架中,System.Net.Dns类提供了一组静态方法,用于执行与DNS相关的操作。本文将详细…...