FPGA与STM32_FSMC总线通信实验

FPGA与STM32_FSMC总线通信实验

  • 内部存储器IP核的参数设置
  • 创建IP核
  • FPGA代码
  • STM32标准库的程序

STM32F407 上自带 FSMC 控制器,通过 FSMC 总线的地址复用模式实现STM32 与 FPGA 之间的通信,FPGA 内部建立 RAM 块,FPGA 桥接 STM32 和 RAM 块,通过 FSMC 总线从 STM32 向 RAM 块中写入数据(数据为 0 到 511),然后读取 RAM出来的数据并进行验证。原理图如下图所示:

内部存储器IP核的参数设置

单端口RAM参数介绍
在这里插入图片描述
在这里插入图片描述

创建IP核

请添加图片描述
①框是设置输出数据端口的位宽,②框是设置存储器容量的大小,这两个选项大家可根据实际的设计进行设置。这里我们设置数据位宽 16bit,存储容量为 512words,即我们设置的 RAM 的最大存储量为 512 个 16bit 数据。
③框是存储单元类型的选择,这里我们保持 Auto(软件自动选择)即可。
④框中是选择使用的时钟模式,可选择单时钟或双时钟。选择单时钟时:用一个时钟信号控制存储块的所有寄存器。选择双时钟时:输入时钟控制地址寄存器,输出时钟控制数据输出寄存器。大家可根据设计需求进行选择,这里我们选择默认选项 Single clock(单时钟)。

设置完之后点击 Next 进入下一界面:
请添加图片描述
①框是选择是否输出“q”输出寄存器。这里把输出端口的寄存器去掉(如果不去掉的话,就会使输出延迟一拍。如果没有特别的需求的话我们是不需要延迟这一拍的,所以这里我们把它去掉)。
②框是询问我们是否选择为时钟信号创建响应的使能信号,这里我们不需要,不勾选。
③框是询问我们为端口A创建字节使能,这里我们不需要,不勾选。
④框是选择是否创建“aclr”异步复位信号以及是否创建“rden”读使能信号,大家可根据实际的设计需求进行勾选,这里我们把它们都勾选上。设置完之后点击 Next 进入下一界面:

请添加图片描述
如上图所示,是进行 Read During Write Operation 项配置,选择某个地址即将被写入数据时读该地址的数据输出类型:有 Don’t Care(不关心)、 New Data(写入的新数据)和Old Data(原有数据),我们保持默认的 New Data 即可,也就是说,某个地址将被写入新数据时,同时进行读操作会读出新的数据。点击 Next 进入下一页面:
请添加图片描述
①框是选择是否为存储器配置初始化文件,与 ROM 不同的是,RAM 可以选择不配置初始化文件,这里我们选择不配置初始化文件。
②框是选择是否允许系统内存储器内容编辑器在于与系统时钟无关的情况下捕获和更新存储器的内容,这里我们不勾选。
设置完后点击 Next 进入下一界面:

请添加图片描述
如上图所示,该界面没有什么要配置的参数,但显示了我们在仿真 ROM IP 核时所需要的 Altera 仿真库,这里提示了我们单独使用第三方仿真工具时需要添加名为“altera_mf”的库。这里保持默认,直接点击“Next”。

请添加图片描述
RAM 输出的文件,除了灰色必选文件,默认还勾选上了rom_256x8_bb.v,这里我们去掉 rom_256x8_bb.v 文件,加入my_ram_ints.v(例化模板文件)即可。最后点击“Finish”完成整个 IP 核的创建。接下来 Quartus II 软件会在我们创建的 IP 核文件目录下生成 RAM IP 文件。

FPGA代码

使用RAM IP核构成FSMC,可以从示意图中看出 我们恰好对得上,需要地址线和数据线、读写使能线以及,将IP核的分配到实在的引脚
模块

FSMC模块

 module FSMC_Ctrl(ab,db,wrn,rdn,csn,PLL_100M,RST_n,nadv);input [8:0]ab;	//地址inout [15:0]db;	//数据input wrn;		//写使能input rdn;		//读使能input csn;		//使能input PLL_100M;	//时钟input RST_n; 	//复位input nadv; 	//复用功能wire rd;wire wr;assign rd = (csn | rdn);//使能和读使能共同有效时assign wr = (csn | wrn);//使能和写使能共同有效时wire [15:0]DB_OUT;assign db = !rd ? DB_OUT : 16'hzzzz;//在读数据的时候,将端口全部设置成高阻态reg wr_clk1,wr_clk2;always @(posedge PLL_100M or negedge RST_n)beginif(!RST_n)beginwr_clk1 <= 1'd1;wr_clk2 <= 1'd1;endelse{wr_clk2,wr_clk1} <= {wr_clk1,wr};	//提取写时钟endwire clk = (!wr_clk2 | !rd);my_ram      u1(											//ram块例化.address(ab),.clock(clk),.data(db),.wren(!wr),.rden(!rd),.q(DB_OUT),);endmodule

复位模块

//--------------------Timescale------------------------------//
`timescale 1 ns / 1 ps//--------------------RST_Ctrl------------------------//
module RST_Ctrl(input FPGA_CLK,	//输入板载晶振FPGA_CLK,25Moutput RST_n			//输出全局复位信号);
//--------------------RST_n----------------------------------//reg [3:0] cnt_rst = 4'd0;always @(posedge FPGA_CLK)if (cnt_rst == 4'd10)cnt_rst <= 4'd10;elsecnt_rst <= cnt_rst + 1'd1;assign RST_n = (cnt_rst == 4'd10);//复位信号,10个周期后RST_n为1//--------------------endmodule------------------------------//
endmodule

顶层文件

//-------------------------Timescale----------------------------//
`timescale 1 ns / 1 ps
//--------------------FSMC_SIG---------------------//
module FSMC_INDEP(FPGA_CLK,	//输入板载晶振GPGA_CLK,25MFPGA_LEDR,FPGA_LEDG,FPGA_LEDB,WR,			//FSMC写信号RD,			//FSMC读信号CS0,			//FSMC片选A,				//FSMC地址总线DB,			//FSMC数据总线NADV,			//FSMC的NADV);input FPGA_CLK,NADV;input WR,RD,CS0;inout [15:0]DB;input [24:16]A;output FPGA_LEDB,FPGA_LEDG,FPGA_LEDR;assign FPGA_LEDR = 1'd1;assign FPGA_LEDG = 1'd0;assign FPGA_LEDB = 1'd1;
//-------------------------MY_PLL-------------------------------//wire PLL_100M;MY_PLL 				U1(.inclk0(FPGA_CLK),.c0(PLL_100M));//例化MY_PLL模块,输出50M时钟
//------------------------RST_Ctrl-----------------------------//wire RST_n;RST_Ctrl				U2(.FPGA_CLK(FPGA_CLK),.RST_n(RST_n));	//例化RST_Ctrl模块,输出全局复位信号RST_n//-------------------------FSMC_Ctrl ------------------------------//FSMC_Ctrl			U3(									//FSMC总线测试模块.ab(A[24:16]),.db(DB),.wrn(WR),.rdn(RD),.csn(CS0),.PLL_100M(PLL_100M),.RST_n(RST_n),.nadv(NADV));//------------------------enmodule ---------------------------//endmodule

STM32标准库的程序

fsmc.h

//------------------------define---------------------------//
#ifndef __fsmc_h__
#define __fsmc_h__//---------------------Include files-----------------------////----------------------- Define --------------------------//
#define fpga_write(offset,data)	*((volatile unsigned short int *)(0x60000000 + (offset << 17))) = data#define fpga_read(offset)	*((volatile unsigned short int *)(0x60000000 + (offset << 17)))//----------------- Typedef -----------------------------//
typedef struct{int (* initialize)(void);
}FSMC_T;//---------------- Extern -------------------------------//extern FSMC_T fsmc;#endif //__fsmc_h__

fsmc.c

/** FILE								: fsmc.c* DESCRIPTION				: This file is iCore3 fsmc driver.* Author							: XiaomaGee@Gmail.com* Copyright					:** History* --------------------* Rev								: 0.00* Date								: 01/03/2016** create.* --------------------*/
//---------------- Include files ------------------------//
#include "..\include\fsmc.h"
#include "..\fwlib\inc\stm32f4xx_rcc.h"
#include "..\fwlib\inc\stm32f4xx_gpio.h"
#include "..\fwlib\inc\stm32f4xx_fsmc.h"//---------------- Function Prototype -------------------//
static int initialize(void);//---------------- Variable -----------------------------//
FSMC_T fsmc = {.initialize = initialize
};//-----------------Function------------------------------//
/** Name										: initialize* Description						: ---* Author									: XiaomaGee.** History* ----------------------* Rev										: 0.00* Date										: 01/03/2016** create.* ----------------------*/
static int initialize(void)
{GPIO_InitTypeDef GPIO_InitStructure;FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef  p;//时钟使能RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOG, ENABLE);//IO初始化GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7 |	GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_Init(GPIOD, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOE, GPIO_PinSource2 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource3 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource4 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource5 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource6 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_Init(GPIOE, &GPIO_InitStructure);GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_FSMC);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_Init(GPIOG, &GPIO_InitStructure);//FSMC初始化p.FSMC_AddressSetupTime = 1;p.FSMC_AddressHoldTime = 0;p.FSMC_DataSetupTime = 4;p.FSMC_BusTurnAroundDuration = 0;p.FSMC_CLKDivision = 0;p.FSMC_DataLatency = 0;p.FSMC_AccessMode = FSMC_AccessMode_A;FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //FSMC Bank1_SRAM1 Bank使能FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); return 0;
}

led.c

//--------------------------- Include ---------------------------//
#include "..\include\led.h"
#include "..\fwlib\inc\stm32f4xx_gpio.h"
#include "..\fwlib\inc\stm32f4xx_rcc.h"//--------------------- Function Prototype ----------------------//
static int initialize(void);//--------------------------- Variable --------------------------//
LED_T led = {.initialize = initialize
};
//--------------------------- Function --------------------------//
/** Name                : initialize* Description         : ---* Author              : ysloveivy.** History* --------------------* Rev                 : 0.00* Date                : 01/03/2016* * create.* --------------------*/
static int initialize(void)
{GPIO_InitTypeDef   GPIO_uInitStructure;//LED IO初始化RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);GPIO_uInitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;    //设置连接三色LED灯的IO端口GPIO_uInitStructure.GPIO_Mode = GPIO_Mode_OUT;                          //设置端口为输出模式GPIO_uInitStructure.GPIO_OType = GPIO_OType_PP;                         //推挽输出GPIO_uInitStructure.GPIO_PuPd = GPIO_PuPd_UP;                           //上拉GPIO_uInitStructure.GPIO_Speed = GPIO_Speed_100MHz;                     //设置速度为第三级GPIO_Init(GPIOI,&GPIO_uInitStructure);//PI5、PI6、PI7接三色LED灯,PI5、PI6、PI7置高电位,灯熄灭GPIO_SetBits(GPIOI,GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);return 0;
}

led.h

#ifndef __led_h__
#define __led_h__//--------------------------- Define ---------------------------//
//红灯<----->PI5
#define LED_RED_OFF GPIO_SetBits(GPIOI,GPIO_Pin_5)
#define LED_RED_ON  GPIO_ResetBits(GPIOI,GPIO_Pin_5)
//绿灯<----->PI6
#define LED_GREEN_OFF GPIO_SetBits(GPIOI,GPIO_Pin_6)
#define LED_GREEN_ON  GPIO_ResetBits(GPIOI,GPIO_Pin_6)
//蓝灯<----->PI7
#define LED_BLUE_OFF GPIO_SetBits(GPIOI,GPIO_Pin_7)
#define LED_BLUE_ON  GPIO_ResetBits(GPIOI,GPIO_Pin_7)//----------------------- Include files ------------------------////-------------------------- Typedef----------------------------//
typedef struct {int (* initialize)(void);
}LED_T;//--------------------------- Extern ---------------------------//
extern LED_T led;#endif //__led_h__

主函数

int main(void)
{int i;unsigned short int fsmc_read_data;/*初始化*/led.initialize();fsmc.initialize();LED_GREEN_ON;/*绿色led亮,表示测试正常红色led亮,表示测试失败,测试结束*/while(1){for(i = 0;i < 512;i++){fpga_write(i,i);                  //向FPGA写入数据}	for(i = 0;i < 512;i++){fsmc_read_data = fpga_read(i);   //从FPGA读数据if(fsmc_read_data != i){LED_GREEN_OFF;LED_RED_ON;while(1);}			}}
}

复用模式说明
在这里插入图片描述

地址和数据线复用时,NADV是访问地址和数据的区别信号,你只需要配合时序参数,芯片会自动识别的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法 | 模拟No.5】leetcode 74. 搜索二维矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

抢抓泛娱乐社交出海新风口!Flat Ads深圳沙龙活动引爆海外市场

随着全球化进程的加速&#xff0c;中国的应用类APP不断走向国际市场。作为产品和服务的提供者&#xff0c;中国开发者围绕社交泛娱乐创新&#xff0c;开启直播出海、短视频出海、游戏社交出海、1V1 视频出海、音频社交出海等出海热潮。“社交、泛娱乐”融合成为行业主流发展趋势…

Go的优雅退出

Go优雅退出/停机以前主要通过signal来实现&#xff0c;当然现在也是通过signal来实现&#xff0c;只是从go 1.16开始&#xff0c;新增了更加友好的API: func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc) 该…

DevChat:开发者专属的基于IDE插件化编程协助工具

DevChat&#xff1a;开发者专属的基于IDE插件化编程协助工具 一、DevChat 的介绍1.1 DevChat 简介1.2 DevChat 优势 二、DevChat 在 VSCode 上的使用2.1 安装 DevChat2.2 注册 DevChat2.3 使用 DevChat 三、DevChat 的实战四、总结 一、DevChat 的介绍 在AI浪潮的席卷下&#x…

Linux每日智囊

每日分享三个Linux命令,悄悄培养读者的Linux技能。 ls 作用 显示目录信息 语法 ls [选项] 文件 参数: -a:显示所有文件,包含以 . 开头的隐藏文件以及特殊目录-A:显示所有文件,包含以 . 开头的隐藏文件,但不显示特殊文件 . 和 …-l:使用长格式显示当前目录下文件的详…

STM32——NVIC中断优先级管理分析

文章目录 前言一、中断如何响应&#xff1f;NVIC如何分配优先级&#xff1f;二、NVIC中断优先级管理详解三、问题汇总 前言 个人认为本篇文章是我作总结的最好的一篇&#xff0c;用自己的话总结出来清晰易懂&#xff0c;给小白看也能一眼明了&#xff0c;这就是写博客的意义吧…

家庭安全计划 挑战赛| 溺水预防

溺水预防 从了解到行动 家庭安全计划 | 少年急救官 地震避险逃生该怎么做&#xff1f; 起火了该如何应对&#xff1f; 哪些行为容易导致溺水&#xff1f; 家庭风险隐患有哪些&#xff1f; 家庭逃生演练四步骤你会吗&#xff1f; 国际救助儿童会&#xff08;英国&#xff…

3d max软件中的缓存垃圾该如何清理?

使用3d max建模到渲染操作&#xff0c;来回对效果图调整的次数过多时&#xff0c;就会出现一下看不到的垃圾缓存&#xff0c;影响保存的速度&#xff0c;影响效率&#xff01; 对于这类的3d垃圾清理的有什么高效方法呢&#xff1f; 3dmax垃圾清理的常规操作如下&#xff1a; 1、…

Pytest插件

官方文档&#xff1a;API Reference — pytest documentation BaseReport 定义Case结果输出 >>> from _pytest.reports import TestReport >>> test TestReport(1,1,1,pass,,running) >>> print(dir(test)) [__annotations__, __class__, __delatt…

【03】Istio Gateway示例配置

3.1 开放kiali至集群外部 首先将istio-inressateway暴露集群外部; 在node02的ens33网卡上面有多余的ip地址&#xff0c;将该地址绑定在igressgateway的svc 上面。 kubectl edit svc istio-ingressgateway -n istio-system定义kiali的ingress gateway的资源配置清单 apiVersion:…

【广州华锐互动】楼宇智能化VR虚拟教学系统

在如今的技术时代&#xff0c;教育行业正在逐步引入各种创新方法以提升教学质量。VR公司广州华锐互动开发的楼宇智能化VR虚拟教学系统就是其中的一种&#xff0c;它利用虚拟现实(VR)技术&#xff0c;为学生提供一种全新的、沉浸式的学习体验。 楼宇智能化VR虚拟教学系统涵盖综合…

【Spring Boot 源码学习】初识 SpringApplication

Spring Boot 源码学习系列 初识 SpringApplication 引言往期内容主要内容1. Spring Boot 应用程序的启动2. SpringApplication 的实例化2.1 构造方法参数2.2 Web 应用类型推断2.3 加载 BootstrapRegistryInitializer2.4 加载 ApplicationContextInitializer2.5 加载 Applicatio…

Word转PDF简单示例,分别在windows和centos中完成转换

概述 本篇博客以简单的示例代码分别在Windows和Linux环境下完成Word转PDF的文档转换。 文章提供SpringBoot Vue3的示例代码。 文章为什么要分为Windows和Linux环境&#xff1f; 因为在如下提供的Windows后端示例代码中使用documents4j库做转换&#xff0c;此库需要调用命令行…

python的re正则表达式

华子目录 什么是正则表达式元字符字符集字符集与元字符的综合使用 数量规则指定匹配次数边界处理分组匹配贪婪匹配非贪婪匹配re.S转义字符re.search()re.sub()实例常见的匹配模式 什么是正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串…

macOS Big Sur(macos11版本)

macOS Big Sur是苹果推出的最新操作系统&#xff0c;具有以下特点&#xff1a; 全新的设计风格&#xff1a;Big Sur采用了全新的设计语言&#xff0c;包括更加圆润的窗口和控件、更加鲜明的色彩和更加简洁的界面。这种设计风格使得操作系统更加美观和易用。强大的性能表现&…

基于RK3399的室内健身魔镜方案

I 方案背景 一、健身魔镜的兴起 2020年疫情席卷全球&#xff0c;宅家是防疫的措施之一&#xff0c;因而宅家运动火爆&#xff0c;随之而来的宅家运动器材也风靡起来&#xff0c;其中包含既有颜值又具有多种功能的健身魔镜。 Ⅱ 方案介绍 一、健身魔镜的方案介绍 …

windows安装nginx

一、下载安装Nginx 1、官网下载地址&#xff1a;nginx: download 2、下载教程&#xff1a;选择最新的Stable version&#xff08;稳定版本&#xff09;下载到本地 3、下载完成后&#xff0c;解压放入本地非中文的文件夹中&#xff1a; 4、启动nginx&#xff1a;切勿直接双击n…

php的api接口token简单实现

<?php // 生成 Token function generateToken() {$token bin2hex(random_bytes(16)); // 使用随机字节生成 tokenreturn $token; } // 存储 Token&#xff08;这里使用一个全局变量来模拟存储&#xff09; $tokens []; // 验证 Token function validateToken($token) {gl…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…

浅谈泛在电力物联网在智能配电系统应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;在社会经济和科学技术不断发展中&#xff0c;配电网实现了角色转变&#xff0c;传统的单向供电服务形式已经被双向能流服务形式取代&#xff0c;社会多样化的用电需求也得以有效满足。随着物联网技术的发展&am…