超子物联网HAL库笔记:准备篇
超子物联网 HAL库学习 汇总入口:
超子物联网HAL库笔记:[汇总]
写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧!
1. HAL库简介
HAL库
- HAL库(Hardware Abstraction Layer)是STMicroelectronics提供的STM32微控制器的硬件抽象层库。
- 它通过一套统一的API接口,简化了对STM32外设的配置和操作,使开发者能够更快速地进行嵌入式系统开发,而不必深入了解底层硬件细节。
HAL库的优点
- 高层次抽象:HAL库提供了高层次的抽象接口,简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置,而不必直接操作寄存器。
- 易于使用:由于提供了丰富的库函数和示例代码,开发者可以快速上手进行开发,减少了开发时间。
- 一致性和移植性:HAL库在不同的STM32系列中保持了一致的API接口,增强了代码的移植性和重用性。如果需要更换STM32系列微控制器,代码的修改量较小。
- 简化调试:由于HAL库屏蔽了底层的寄存器操作,调试过程中更容易定位和解决问题,减少了开发和维护的复杂性。
- 代码维护性好:HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。
对比标准固件库的不同
- 抽象层次:
- 标准固件库:直接操作寄存器,提供底层硬件访问,要求开发者对STM32微控制器的寄存器有较深入的理解。
- HAL库:提供高层次的抽象接口,屏蔽底层寄存器操作,使开发者可以更快速地进行开发。
- 代码复杂性:
- 标准固件库:代码较复杂,涉及大量的寄存器配置,开发者需要处理更多的细节。
- HAL库:代码简洁易读,通过调用库函数进行配置和操作,减少了代码量和复杂性。
- 学习曲线:
- 标准固件库:学习曲线较陡,需要花费较多时间了解和掌握硬件细节。
- HAL库:学习曲线较缓,提供了丰富的示例代码和文档,开发者可以快速上手。
- 开发效率:
- 标准固件库:适合对性能和功耗有严格要求的项目,但开发和调试时间较长。
- HAL库:提高了开发效率,适合快速开发和原型设计,缩短了开发周期。
- 移植性:
- 标准固件库:不同系列的STM32微控制器之间存在较大的差异,代码移植工作量较大。
- HAL库:提供一致的API接口,增强了代码的移植性和重用性,不同系列之间的移植工作量较小。
2. 创建HAL库工程模板
1. 制作文件模板
-
先找一个位置,存放工程模板
-
在工程模板中 添加 User、Library 、 Hardware 、 CMSIS 文件夹:
- User:
- main.c
- Library:
- Include
- Source
- Hardware:
- Include
- Source
- CMSIS :
- Include
- Source
- User:
-
下载HAL库 源码 STM32Cube MCU和MPU包: 相关产品
-
解压并打开
-
拷贝HAL库(Library)
- 进入
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\STM32F1xx_HAL_Driver把头文件夹 Inc 和源文件夹 Src 移动到自己的Library的对应的文件中
- 进入
-
拷贝启动文件(CMSIS\Include)
- 先进入内核文件
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS - 进入头文件
\\CMSIS\\Include把所有文件拷贝到自己的CMSIS/Include文件中 再进入\\CMSIS\\Device\\ST\\STM32F1xx\\Include把所有文件拷贝到自己的CMSIS/Include文件中
- 先进入内核文件
-
拷贝源文件(CMSYS\Source)
- 进入
\\STM32Cube_FW_F1_V1.8.0\\Drivers\\CMSIS\\Device\\ST\\STM32F1xx\\Source\\Templates - 把
\\Templates文件的的system_stm32f1xx.c拷贝到自己的CMSIS/Source文件中 - 再进入/arm文件下,把所有文件拷贝到自己的CMSIS/Source文件中
- 进入
-
编辑Hardware文件夹
分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h 代码如下
stm32f1xx_it.c
/*-------------------------------------------------*/
/* */
/* 实现各种中断服务函数的源文件 */
/* */
/*-------------------------------------------------*/#include "stm32f1xx_hal.h"
#include "stm32f1xx_it.h" /*-------------------------------------------------*/
/*函数名:不可屏蔽中断处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void NMI_Handler(void)
{}/*-------------------------------------------------*/
/*函数名:硬件出错后进入的中断处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void HardFault_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:软中断,SWI 指令调用的处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SVC_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:可挂起的系统服务处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void PendSV_Handler(void)
{}
/*-------------------------------------------------*/
/*函数名:SysTic系统嘀嗒定时器处理函数 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SysTick_Handler(void)
{ HAL_IncTick();
}
stm32f1xx_it.h
/********************************************************************************* @file GPIO/GPIO_IOToggle/Inc/stm32f1xx_it.h* @author MCD Application Team* @brief This file contains the headers of the interrupt handlers.******************************************************************************* @attention** <h2><center>© Copyright (c) 2016 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F1xx_IT_H
#define __STM32F1xx_IT_H#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F1xx_IT_H *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
最后需要把自己的Library文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为 stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件
文件结构
CMSISIncludecmsis_armcc.hcmsis_armclang.hcmsis_compiler.hcmsis_gcc.hcmsis_iccarm.hcmsis_version.hcore_armv8mbl.hcore_armv8mml.hcore_cm0.hcore_cm0plus.hcore_cm1.hcore_cm23.hcore_cm3.hcore_cm33.hcore_cm4.hcore_cm7.hcore_sc000.hcore_sc300.hmpu_armv7.hmpu_armv8.hstm32f100xb.hstm32f100xe.hstm32f101x6.hstm32f101xb.hstm32f101xe.hstm32f101xg.hstm32f102x6.hstm32f102xb.hstm32f103x6.hstm32f103xb.hstm32f103xe.hstm32f103xg.hstm32f105xc.hstm32f107xc.hstm32f1xx.hsystem_stm32f1xx.htz_context.hSourcestartup_stm32f100xb.sstartup_stm32f100xe.sstartup_stm32f101x6.sstartup_stm32f101xb.sstartup_stm32f101xe.sstartup_stm32f101xg.sstartup_stm32f102x6.sstartup_stm32f102xb.sstartup_stm32f103x6.sstartup_stm32f103xb.sstartup_stm32f103xe.sstartup_stm32f103xg.sstartup_stm32f105xc.sstartup_stm32f107xc.ssystem_stm32f1xx.c
DebugConfigProject_STM32F103C8_1.0.0.dbgconfTarget_1_STM32F103C8_1.0.0.dbgconf
HardwareIncludestm32f1xx_it.hSourcestm32f1xx_it.c
LibraryIncludeLegacystm32f1xx_hal_can_ex_legacy.hstm32f1xx_hal_can_legacy.hstm32_hal_legacy.hstm32f1xx_hal.hstm32f1xx_hal_adc.hstm32f1xx_hal_adc_ex.hstm32f1xx_hal_can.hstm32f1xx_hal_cec.hstm32f1xx_hal_conf.hstm32f1xx_hal_cortex.hstm32f1xx_hal_crc.hstm32f1xx_hal_dac.hstm32f1xx_hal_dac_ex.hstm32f1xx_hal_def.hstm32f1xx_hal_dma.hstm32f1xx_hal_dma_ex.hstm32f1xx_hal_eth.hstm32f1xx_hal_exti.hstm32f1xx_hal_flash.hstm32f1xx_hal_flash_ex.hstm32f1xx_hal_gpio.hstm32f1xx_hal_gpio_ex.hstm32f1xx_hal_hcd.hstm32f1xx_hal_i2c.hstm32f1xx_hal_i2s.hstm32f1xx_hal_irda.hstm32f1xx_hal_iwdg.hstm32f1xx_hal_mmc.hstm32f1xx_hal_nand.hstm32f1xx_hal_nor.hstm32f1xx_hal_pccard.hstm32f1xx_hal_pcd.hstm32f1xx_hal_pcd_ex.hstm32f1xx_hal_pwr.hstm32f1xx_hal_rcc.hstm32f1xx_hal_rcc_ex.hstm32f1xx_hal_rtc.hstm32f1xx_hal_rtc_ex.hstm32f1xx_hal_sd.hstm32f1xx_hal_smartcard.hstm32f1xx_hal_spi.hstm32f1xx_hal_sram.hstm32f1xx_hal_tim.hstm32f1xx_hal_tim_ex.hstm32f1xx_hal_uart.hstm32f1xx_hal_usart.hstm32f1xx_hal_wwdg.hstm32f1xx_ll_adc.hstm32f1xx_ll_bus.hstm32f1xx_ll_cortex.hstm32f1xx_ll_crc.hstm32f1xx_ll_dac.hstm32f1xx_ll_dma.hstm32f1xx_ll_exti.hstm32f1xx_ll_fsmc.hstm32f1xx_ll_gpio.hstm32f1xx_ll_i2c.hstm32f1xx_ll_iwdg.hstm32f1xx_ll_pwr.hstm32f1xx_ll_rcc.hstm32f1xx_ll_rtc.hstm32f1xx_ll_sdmmc.hstm32f1xx_ll_spi.hstm32f1xx_ll_system.hstm32f1xx_ll_tim.hstm32f1xx_ll_usart.hstm32f1xx_ll_usb.hstm32f1xx_ll_utils.hstm32f1xx_ll_wwdg.hstm32_assert_template.hSourceLegacystm32f1xx_hal_can.cstm32f1xx_hal.cstm32f1xx_hal_adc.cstm32f1xx_hal_adc_ex.cstm32f1xx_hal_can.cstm32f1xx_hal_cec.cstm32f1xx_hal_cortex.cstm32f1xx_hal_crc.cstm32f1xx_hal_dac.cstm32f1xx_hal_dac_ex.cstm32f1xx_hal_dma.cstm32f1xx_hal_eth.cstm32f1xx_hal_exti.cstm32f1xx_hal_flash.cstm32f1xx_hal_flash_ex.cstm32f1xx_hal_gpio.cstm32f1xx_hal_gpio_ex.cstm32f1xx_hal_hcd.cstm32f1xx_hal_i2c.cstm32f1xx_hal_i2s.cstm32f1xx_hal_irda.cstm32f1xx_hal_iwdg.cstm32f1xx_hal_mmc.cstm32f1xx_hal_msp_template.cstm32f1xx_hal_nand.cstm32f1xx_hal_nor.cstm32f1xx_hal_pccard.cstm32f1xx_hal_pcd.cstm32f1xx_hal_pcd_ex.cstm32f1xx_hal_pwr.cstm32f1xx_hal_rcc.cstm32f1xx_hal_rcc_ex.cstm32f1xx_hal_rtc.cstm32f1xx_hal_rtc_ex.cstm32f1xx_hal_sd.cstm32f1xx_hal_smartcard.cstm32f1xx_hal_spi.cstm32f1xx_hal_sram.cstm32f1xx_hal_tim.cstm32f1xx_hal_timebase_rtc_alarm_template.cstm32f1xx_hal_timebase_tim_template.cstm32f1xx_hal_tim_ex.cstm32f1xx_hal_uart.cstm32f1xx_hal_usart.cstm32f1xx_hal_wwdg.cstm32f1xx_ll_adc.cstm32f1xx_ll_crc.cstm32f1xx_ll_dac.cstm32f1xx_ll_dma.cstm32f1xx_ll_exti.cstm32f1xx_ll_fsmc.cstm32f1xx_ll_gpio.cstm32f1xx_ll_i2c.cstm32f1xx_ll_pwr.cstm32f1xx_ll_rcc.cstm32f1xx_ll_rtc.cstm32f1xx_ll_sdmmc.cstm32f1xx_ll_spi.cstm32f1xx_ll_tim.cstm32f1xx_ll_usart.cstm32f1xx_ll_usb.cstm32f1xx_ll_utils.c
ListingsProject.map
Objectsmain.dmain.oProject.axfProject.build_log.htmProject.htmProject.lnpProject.sctProject_Project.depstartup_stm32f101xb.ostm32f1xx_hal.dstm32f1xx_hal.ostm32f1xx_hal_cortex.dstm32f1xx_hal_cortex.ostm32f1xx_hal_gpio.dstm32f1xx_hal_gpio.ostm32f1xx_hal_gpio_ex.dstm32f1xx_hal_gpio_ex.ostm32f1xx_hal_rcc.dstm32f1xx_hal_rcc.ostm32f1xx_hal_rcc_ex.dstm32f1xx_hal_rcc_ex.osystem_stm32f1xx.dsystem_stm32f1xx.o
Usermain.c
2. Keil 创建工程
-
创建工程、选择User为目录。
-
点击木箱子设置分组
- User 、 Library 、 Hardware 、 CMSIS
-
导入文件
- 这里只导入必备的。以后用哪个再加那个
- Library:
- stm32f1xx_hal.c
- stm32f1xx_hal_cortex.c
- stm32f1xx_hal_gpio.c
- stm32f1xx_hal_gpio_ex.c
- stm32f1xx_hal_rcc.c
- stm32f1xx_hal_rcc_ex.c
- CNSIS:
- system_stm32f1xx.c
- startup_stm32f103xb.s
- User:
- main.c
-
在魔术棒中设置:
C/C++中: 在Define输入STM32F103xB (目的是通知编译器我们用的是xb) 添加头文件路径(Hardware、CMSIS、Library)。以后有别的添加则再添加。 Target中:
选择ARM编译器为v6.16 否则会报错
-
在main.c中引入头文件stm32f1xx_hal.h (在hal.c中可找到)
-
最后编译即可。0错误0警告
3. HAL库结构初步分析
-
以HAL库的串口为例来讲解
-
串口分为USART和UART 他们分别是同步通信和异步通信。一般我们用异步的
所以这里我们添加uart.c的文件。
-
hal库之中,串口包含三种方式: 轮询、中断、DMA。所以在库文件中必须添加DMA库
所以我们这里添加DMA.c的文件
-
-
在HAL库中每个外设都有两个关键的部分:
- Private:(私有的),是HAL库内部自己调用的
- Exported:(对外的),我们的应用程序中去调用。Exported分为四个部分
- types,各种Struct结构体,用于外设功能配置。对应了CubeMax软件的配置项
- constants,上方各种Struct结构体中的成员的可以配置的选项
- macro,宏定义,相当于直接对寄存器操作。因为在某些时候调用api反而效率不高
- functions,API函数。
这些是可以在文件中验证的。hal_uart.c中 可见
我们对CubeMax的操作,实际上就是与这些结构体、成员变量一一对应的
一个外设的相关结构体会被定义在一个总的结构体中。比如串口是UART_HandleTypedef
相关文章:
超子物联网HAL库笔记:准备篇
超子物联网 HAL库学习 汇总入口: 超子物联网HAL库笔记:[汇总] 写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧! 1. HAL库简介 HAL库 HAL库(Hardware Abstraction Layer&#…...
FoRAG:面向网络增强型长文本问答的事实优化检索增强生成方法
人工智能咨询培训老师叶梓 转载标明出处 检索增强生成技术尽管出现了各种开源方法和商业系统,如Bing Chat,但生成的长文本答案中缺乏事实性和清晰逻辑的问题仍未得到解决。为了解决这些问题,来自蚂蚁集团和清华大学的研究者们提出了一种名为…...
Android NSD局域网发现服务
近期在了解局域网发现服务的时候无意间看到Android 自带的(Network Service Discovery)网络发现服务,在一番验证之后发现实现比较简单,可靠性也高,因此在这里做一个整理,算是对自己知识做一个归档。 网络服…...
算法的学习笔记—左旋转字符串(牛客JZ58)
😀前言 在程序设计中,字符串处理问题屡见不鲜,其中“字符串左旋”是一种常见操作,今天我们一起来探讨一个经典的左旋转字符串题目,以及一种优雅的解决方案——三步翻转法。 🏠个人主页:尘觉主页…...
Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM
文章目录 问题描述驱动下载地址问题解决:安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以,但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…...
ios 项目升级极光SDK
由于项目使用的是旧版本,隐私合规检查不通过,需要升级到最新版本, 使用cocoapods集成无法正常运行,.a文件找不到,可能项目比较久了,最好选择手动导入 下载最新版本SDK,将 SDK 包解压ÿ…...
【Java】java | logback日志配置 | 按包配置级别
一、概述 日志配置需求: 本地部分包开debug,其他路径走配置;只在本地环境有效 二、logback.xml配置 <!--本地调试,开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…...
Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS
1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后,在原理图界面点击Launch,点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找打Generate All from Source。 2、在Generate Layout界面,选中“Instance”&#…...
Spring框架原理面试题及参考答案
目录 什么是Spring 开发框架? 说说Spring 的 IOC 和 DI? 简述IoC(控制反转)及在 Spring 中的实现 说说Spring IOC 容器的基本概念? 说说Spring IoC 的实现机制? 说说Spring IoC 容器? 简述Spring ApplicationContext 说说Spring Bean 的生命周期 说说在 Spring…...
Java类的static成员以及代码块(详细版)
文章目录 一、什么是static成员二、static修饰的成员有何意义三、static修饰成员变量四、static修饰成员方法4.1、静态成员变量不可以在方法内创建4.2、静态成员方法内部不可以访问非静态成员变量4.3、总结 五、static成员变量的初始化5.1、就地初始化5.2、静态代码块初始化 六…...
Opensearch集群部署【docker、服务器、Helm多种部署方式】
操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch ,例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版,但我们只测…...
本地Docker部署开源WAF雷池并实现异地远程登录管理界面
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
性能需求笔记
名称解释 系统用户:所有注册过的用户;在线用户:某时间段内登录且在线的用户 pv:用户浏览页面的次数 UV:登录系统的用户,uv课产生多个pv 性能测试:测试软件在系统中的运行性能,度量系…...
ts:数组的常用方法(reduce累加)
ts:数组的常用方法(reduce累加) 一、主要内容说明二、例子reduce方法(累加)1.源码1 (reduce方法)2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的reduce方法,用…...
Begin
cpp 编程的发展方向还是很多的:游戏、嵌入式、QT、客户端、服务端、机器学习、算法大模 型 ...,现阶段还是不太清楚具体想走什么方向。主QT编程应该是不在考虑之内的,可以为辅简单 学习一下;游戏方向:需要学习lua语言…...
【实战案例】Django框架表单处理及数据库交互
本文基于之前内容列表如下: 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…...
python开发工具是选择vscode还是pycharm?两款软件优缺点对照!
Pycharm和VSCode是两款流行的代码编辑器,它们都有各自的优缺点和适用情况。本文将从以下几个方面对它们进行比较和分析: 功能和扩展性性能和稳定性用户体验和界面价格和支持 功能和扩展性 Pycharm是一款专为Python开发而设计的集成开发环境(…...
2025选题|基于Hadoop的物品租赁系统的设计与实现
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
【Qt】QTableView添加下拉框过滤条件
实现通过带复选框的下拉框来为表格添加过滤条件 带复选框的下拉框 .h文件 #pragma once #include <QCheckBox> #include <QComboBox> #include <QEvent> #include <QLineEdit> #include <QListWidget>class TableComboBox : public QComboBox …...
部署DNS主从服务器
一。DNS主从服务器作用: DNS作为重要的互联网基础设施服务,保证DNS域名解析服务的正常运转至关重要,只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中,从服务器可以从主服务器上获取指定的区域数据文件&…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
