GPIO 模拟SPI

2023-11-13

SPI简介

SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

  • SDO(MOSI): 主设备数据输出,从设备数据输入
  • SDI(MISO):主设备数据输入,从设备数据输出
  • SCLK : 时钟信号,由主设备产生
  • CS :从设备使能信号,由主设备控制

SCPH=0,SCPOL=0 的 SPI 协议时序图在这里插入图片描述

SCPH=1,SCPOL=0 的 SPI 协议时序图

在这里插入图片描述

SCPH=0,SCPOL=1 的 SPI 协议时序图

在这里插入图片描述

SCPH=1,SCPOL=1 的 SPI 协议时序图

在这里插入图片描述

GPIO模拟

定义出MISO、MOSI、CS、CLK等

#define CS_GPIO                       (0)
#define CLK_GPIO                      (1)
#define MOSI_GPIO                     (2)
#define MISO_GPIO                     (3)
#define IRQ_GPIO                      (4)

#define CS(a)                         Set_SPI_Related_Gpio(a, CS_GPIO)
#define DCLK(a)                       Set_SPI_Related_Gpio(a, CLK_GPIO)
#define DIN(a)                        Set_SPI_Related_Gpio(a, MOSI_GPIO)
#define DOUT()                        Get_SPI_Related_Gpio(MISO_GPIO)

往从设备发送数据

/**
  * @brief  Write Byte to LCD
  * @param  byte : Byte
  */
void WriteByteSPI(unsigned char byte)
{
    unsigned char buf;
    unsigned char i;
    CS(0);
    for(i=0;i<8;i++) 
    {
        buf=(byte>>(7-i))&0x1;
        DIN(buf);
        DCLK(0);
        DCLK(1);
    }	
    CS(1);
}

从设备读取数据

/**
  * @brief  Read data from spi
  */
static unsigned short ReadByteSPI(void) 
{
    unsigned short buf=0,temp;
    unsigned char i;
    uint level = 0;
    DIN(0);
    DCLK(1);
    CS(0);
    for(i=0;i<8;i++)
    {
        DCLK(0);
        level = DOUT();
        temp= (level) ? 1:0;
        buf|=(temp<<(7-i));
        //Delayus(5);
        DCLK(0);
        DCLK(1);
    }
    CS(1);
    buf&=0xff;
    return(buf);
}

stm32上完整demo

//LCD.h
#include "HAL_conf.h"

#define SPI_CS(a)	\
						if (a)	\
						GPIOA->BSRR = GPIO_Pin_4;	\
						else		\
						GPIOA->BRR = GPIO_Pin_4;
#define SPI_DCLK(a)	\
						if (a)	\
						GPIOA->BSRR = GPIO_Pin_5;	\
						else		\
						GPIOA->BRR = GPIO_Pin_5;
#define SPI_SDA(a)	\
						if (a)	\
						GPIOA->BSRR = GPIO_Pin_7;	\
						else		\
						GPIOA->BRR = GPIO_Pin_7;
#define lcd_RS(a)	\
						if (a)	\
						GPIOA->BSRR = GPIO_Pin_3;	\
						else		\
						GPIOA->BRR = GPIO_Pin_3;

#define WHITE						0xFFFF
#define BLACK						0x0000	  
#define BLUE						0x001F  
#define BRED						0XF81F
#define GRED						0XFFE0
#define GBLUE						0X07FF
#define RED							0xF800
#define MAGENTA						0xF81F
#define GREEN						0x07E0
#define CYAN						0x7FFF
#define YELLOW						0xFFE0
#define BROWN						0XBC40 //棕色
#define BRRED						0XFC07 //棕红色
#define GRAY						0X8430 //灰色

void LCD_Initial(void); //LCD初始化函数
void Delayms(unsigned short time);
void LCD_WriteRegIndex(unsigned char Index);
void LCD_WriteData(unsigned short dat);
void LCD_WR_REG(u16 Index,u16 CongfigTemp);
void Lcd_SetCursor(u16 x,u16 y);
void SPILCD_SetWindow(unsigned short xstat,unsigned short xend,unsigned short ystat,unsigned short yend);
void SPILCD_DrawPoint(unsigned short x,unsigned short y,unsigned short color);
void SPILCD_Clear(unsigned short Color);
void SPILCD_Clear_Fast(unsigned char single_Color);
void SPILCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color);
void SPILCD_DrawLine(unsigned short x1,unsigned short y1,unsigned short x2,unsigned short y2,unsigned short color);
void SPILCD_ShowChar(unsigned short x,unsigned short y,unsigned char num, unsigned int fColor, unsigned int bColor,unsigned char flag) ;
void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor,unsigned char flag);
void LCD_Fill_Pic(u16 x, u16 y,u16 pic_H, u16 pic_V, const unsigned char* pic);

//LCD.c
#include "LCD.h"
#include "ASCII.h"
#include "GB1616.h"	//16*16汉字字模
#define SPILCD_W 176
#define SPILCD_H 220

void Delayms(unsigned short time)  //延时函数
{
	unsigned short i,j;
	for(i=0;i<time;i++)
		for(j=0;j<5000;j++)	;
}

void LCD_WriteByteSPI(unsigned char byte) //SPI模拟函数,写一个8bit的数据
{
	  unsigned char buf;
    unsigned char i;
    for(i=0;i<8;i++) 
    {
        buf=(byte>>(7-i))&0x1;
        SPI_SDA(buf);
				SPI_DCLK(0);
        SPI_DCLK(1);
    }	
}
void LCD_WriteoneSPI(unsigned char byte) //写一个4bit的数据
{
	  unsigned char buf;
    unsigned char i;
	
    for(i=0;i<4;i++) 
    {
        buf=(byte>>(3-i))&0x1;
        SPI_SDA(buf);
				SPI_DCLK(0);
        SPI_DCLK(1);
    }	

}
void WriteComm(unsigned char dat) //写命令
{
//	SPI_CS(0);
	lcd_RS(0);
	LCD_WriteByteSPI(dat);	
	lcd_RS(1);
//	SPI_CS(1);
}
void LCD_WriteRegIndex(unsigned char Index) //写命令的参数
{
	lcd_RS(0);
	LCD_WriteByteSPI(Index);
	lcd_RS(1);
}
void LCD_WriteData(unsigned short dat) //写数据
{
  LCD_WriteByteSPI(dat>>8);		//	start byte RS=1,RW=0----Write a GRAM data
  LCD_WriteByteSPI(dat);
}
/******************************************
函数名:Lcd写命令函数
功能:向Lcd指定位置写入应有命令或数据
入口参数:Index 要寻址的寄存器地址
          ConfigTemp 写入的数据或命令值
******************************************/
void LCD_WR_REG(u16 Index,u16 CongfigTemp)
{
	LCD_WriteRegIndex(Index);
	LCD_WriteByteSPI(CongfigTemp);
//LCD_WriteData(CongfigTemp);
}

void LCD_Initial(void) //LCD初始化函数
{

	GPIO_SetBits(GPIOA, GPIO_Pin_2);//打开背光

		//Power Voltage Setting 
LCD_WR_REG(0x1A,0x02);     //BT 
LCD_WR_REG(0x1B,0x88);     //VRH 
 
//****VCOM offset**/// 
LCD_WR_REG(0x23,0x00);     //SEL_VCM 
LCD_WR_REG(0x24,0xEE);     //VCM 
LCD_WR_REG(0x25,0x15);     //VDV 
 
LCD_WR_REG(0x2D,0x03);     //NOW[2:0]=011 
 
//Power on Setting 
LCD_WR_REG(0x18,0x1E);     //Frame rate 72Hz 
LCD_WR_REG(0x19,0x01);     //OSC_EN='1', start Osc 
LCD_WR_REG(0x01,0x00);     //DP_STB='0', out deep sleep 
LCD_WR_REG(0x1F,0x88);    //STB=0 
Delayms(5); 
LCD_WR_REG(0x1F,0x80);      //DK=0 
Delayms(5); 
LCD_WR_REG(0x1F,0x90);    //PON=1 
Delayms(5); 
LCD_WR_REG(0x1F,0xD0);    //VCOMG=1 
Delayms(5); 
 LCD_WR_REG(0x2F,0x00);
//262k/65k color selection 
LCD_WR_REG(0x17,0x05);     //default 0x06 262k color // 0x05 65k color 
 
//SET PANEL 
LCD_WR_REG(0x16,0xA0);
LCD_WR_REG(0x36,0x09);     //REV_P, SM_P, GS_P, BGR_P, SS_P 
LCD_WR_REG(0x29,0x31);     //400 lines 
LCD_WR_REG(0x71,0x1A);     //RTN 

//Gamma 2.2 Setting     
 LCD_WR_REG(0x40,0x01); 
 LCD_WR_REG(0x41,0x08); 
 LCD_WR_REG(0x42,0x04); 
 LCD_WR_REG(0x43,0x2D); 
 LCD_WR_REG(0x44,0x30); 
 LCD_WR_REG(0x45,0x3E); 
 LCD_WR_REG(0x46,0x02); 
 LCD_WR_REG(0x47,0x69); 
 LCD_WR_REG(0x48,0x07); 
 LCD_WR_REG(0x49,0x0E); 
 LCD_WR_REG(0x4A,0x12); 
 LCD_WR_REG(0x4B,0x14); 
 LCD_WR_REG(0x4C,0x17); 
 
 LCD_WR_REG(0x50,0x01); 
 LCD_WR_REG(0x51,0x0F); 
 LCD_WR_REG(0x52,0x12); 
 LCD_WR_REG(0x53,0x3B); 
 LCD_WR_REG(0x54,0x37); 
 LCD_WR_REG(0x55,0x3E); 
 LCD_WR_REG(0x56,0x16); 
 LCD_WR_REG(0x57,0x7D); 
 LCD_WR_REG(0x58,0x08); 
 LCD_WR_REG(0x59,0x0B); 
 LCD_WR_REG(0x5A,0x0D); 
 LCD_WR_REG(0x5B,0x11); 
 LCD_WR_REG(0x5C,0x18); 
 LCD_WR_REG(0x5D,0xFF); 
 
LCD_WR_REG(0x1B,0x001a); //VRH 
LCD_WR_REG(0x25,0x0055); //NVRH 
LCD_WR_REG(0x1A,0x0010); //BT 
LCD_WR_REG(0x1E,0x0038); //FS1   

//Display ON Setting 
LCD_WR_REG(0x28,0x38);      //GON=1, DTE=1, D=10 
Delayms(40); 
LCD_WR_REG(0x28,0x3C);      //GON=1, DTE=1, D=11 
 
WriteComm(0x22);               //Start GRAM write 
}




/*************************************************
函数名:Lcd光标起点定位函数
功能:指定320240液晶上的一点作为写数据的起始点
入口参数:x 坐标 0~239
          y 坐标 0~319
返回值:无
*************************************************/
void Lcd_SetCursor(u16 x,u16 y)
{ 
  LCD_WriteRegIndex(0x20);
  LCD_WriteData(x);//水平坐标
  LCD_WriteRegIndex(0x21);
  LCD_WriteData(y);//垂直坐标 
} 
void SPILCD_SetWindow(unsigned short xstat,unsigned short xend,unsigned short ystat,unsigned short yend)
{
	//Set GRAM Area 
	LCD_WR_REG(0x02,xstat>>8); 
	LCD_WR_REG(0x03,xstat&0xff);     //Column Start 
	LCD_WR_REG(0x04,xend>>8); 
	LCD_WR_REG(0x05,xend&0xff);     //Column End 
	 
	LCD_WR_REG(0x06,ystat>>8); 
	LCD_WR_REG(0x07,ystat&0xff);     //Row Start 
	LCD_WR_REG(0x08,yend>>8); 
	LCD_WR_REG(0x09,yend&0xff);     //Row End 

	WriteComm(0x22);
}
void SPILCD_Fill(unsigned short xsta,unsigned short ysta,unsigned short xend,unsigned short yend,unsigned short color)
{                    
	unsigned short i,j;
	//设置窗口		
	SPILCD_SetWindow(xsta,xend-1,ysta,yend-1);
	for(i=xsta;i<=xend;i++)
		for(j=ysta;j<=yend;j++)
	{
		   	LCD_WriteData(color);	  //显示所填充的颜色. 
	}    
}
/******************************************
函数名:Lcd图像填充100*100
功能:向Lcd指定位置填充图像
入口参数:
******************************************/
void LCD_Fill_Pic(u16 x, u16 y,u16 pic_H, u16 pic_V, const unsigned char* pic)
{
  unsigned long i,j;
	j=pic_H*pic_V*2;
	SPILCD_SetWindow(x,x+pic_H-1,y,y+pic_V-1);
	for (i = 0; i < j; i++)
	{
    LCD_WriteByteSPI(pic[i]);
	}
}
//=============== 在x,y 坐标上打一个颜色为Color的点 ===============
void DrawPixel(u16 x, u16 y, int Color)
{
	SPILCD_SetWindow(x,x,y,y); 
  LCD_WriteData(Color);							  
}
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
//8*16字体 ASCII码 显示
//函数名:SPILCD_ShowChar
//参  数:
//(x,y): 
//num:要显示的字符:" "--->"~"
//flag:有背景色(1)无背景色(0)
void SPILCD_ShowChar(unsigned short x,unsigned short y,unsigned char num, unsigned int fColor, unsigned int bColor,unsigned char flag) 
{       
	unsigned char temp;
	unsigned int pos,i,j;  

	num=num-' ';//得到偏移后的值
	i=num*16; 	
	for(pos=0;pos<16;pos++)
		{
			temp=nAsciiDot[i+pos];	//调通调用ASCII字体
			for(j=0;j<8;j++)
		   {                 
		        if(temp&0x80)
							DrawPixel(x+j,y,fColor);
						else 
							if(flag) DrawPixel(x+j,y,bColor); //如果背景色标志flag为1
							temp<<=1; 
		    }
			 y++;
		}		 
}  

//写一个16x16的汉字
void PutGB1616(unsigned short x, unsigned short  y, unsigned char c[2], unsigned int fColor,unsigned int bColor,unsigned char flag)
{
	unsigned int i,j,k;
	unsigned short m;
	for (k=0;k<64;k++) { //64标示自建汉字库中的个数,循环查询内码
	  if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1]))
			{ 
    	for(i=0;i<32;i++) 
			{
				m=codeGB_16[k].Msk[i];
				for(j=0;j<8;j++) 
				{		
					if((m&0x80)==0x80) {
						DrawPixel(x+j,y,fColor);
						}
					else {
						if(flag) DrawPixel(x+j,y,bColor);
						}
					m=m<<1;
				} 
				if(i%2){y++;x=x-8;}
				else x=x+8;
		  }
		}  
	  }	
	}

//显示一串字
void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor,unsigned char flag) 
{
	unsigned char l=0;
	while(*s) 
		{
			if( *s < (char)0x80) 
					{
						SPILCD_ShowChar(x+l*8,y,*s,fColor,bColor,flag);
						s++;l++;
					}
			else
					{
						PutGB1616(x+l*8,y,(unsigned char*)s,fColor,bColor,flag);
						s+=2;l+=2;
					}
		}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPIO 模拟SPI 的相关文章

  • OpenGL驱动质量的事实现状(精简翻译版)

    原文 http richg42 blogspot com 2014 05 the truth on opengl driver quality html 一 厂商A 为大多数开发者所使用 功能最全 测试得最好 几乎是事实上的标准驱动 其驱动
  • Rockchip CAN FD 开发文档

    Rockchip CAN FD 开发文档 前言 概述 产品版本 芯片名称 内核版本 RK356X 4 19 5 10 RK3588 5 10 目录 文章目录 Rockchip CAN FD 开发文档 toc CAN FD 驱动 驱动文件 D
  • FPGA学习记录:第28章 VGA显示器驱动设计与验证

    硬件平台 Cyclone IV E EP4CE10F17C8 开发平台 Quartus II 64 Bit Version 13 0 1 Build 232 06 12 2013 SP 1 SJ Full Version 开发板 野火征途p
  • 驱动怎么学

    1 什么是驱动 1 1理解驱动的概念 1 驱动一词的字面意思 驱动就是让一个东西动起来 给一个东西动力 让它动起来 2 物理上的驱动 比如 一个球放在那儿没动 你踢了一下它 给了它一个力 给了力之后它就能动 就说明你驱动了它 这就是物理学上
  • 字符设备驱动详解(主次设备号、注册/卸载字符设备驱动、创建设备节点、地址映射)

    1 主次设备号 1 主次设备号是内核用来索引设备的 每个主次设备号在内核中都是唯一的 每个注册的设备都有一个分配的主次设备号 2 同一个主设备号可以有多个从设备号 主设备是对应的驱动程序 次设备号对应设备文件所指的设备 一个Soc可能接同样
  • 微星b560m mortar wifi 开机二检(开机灭了1秒后自动重启)

    微星b560m mortar wifi 开机二检 开机灭了1秒后自动重启 1 起因 为了照顾旧CPU 还想把内存扩容到64GB 就选择了DDR4的4条插槽的 B560M主板 都弄好之后 开机发现在按下电源键之后 通电自检后断电了大概2秒左右
  • 虚拟机Linux访问usb设备,通过Libusb库方法实现读写usb设备所获取的实时图像数据

    一 前言 基于Linux 平台USB驱动开发 主要有内核驱动的开发和libusb的无驱设计 首先为什么要选第三方库Libusb 可能是基于Libusb的程序只涉及到应用层 使用起来更加方便 如果是在内核驱动 就要考虑到内核大小 内核版本的兼
  • Linux设备驱动的软件架构思想与设备驱动的基础内容总结

    Linux设备驱动的软件架构思想与设备驱动的基础内容总结 Linux是一个兼容性特别强的一个系统 而兼容性的实现与驱动强大的适应性密不可分 而这个具体的实现是离不开 总线bus和类class的管理方式 Linux使用bus统一的管理一系列相
  • Linux 块设备驱动实验

    一 块设备驱动要远比字符设备驱动复杂得多 不同类型的存储设备又对应不同的驱动子系统 本章我们重点学习一下块设备相关驱动概念 不涉及到具体的存储设备 1 什么是块设备 块设备是针对存储设备的 比如 SD 卡 EMMC NAND Flash N
  • 异步通知实验(信号)

    目录 异步通知 异步通知简介 驱动中的信号处理 应用程序对异步通知的处理 硬件原理图分析 实验程序编写 修改设备树文件 程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 在前面使用阻塞或者非阻塞的方式来读取驱动中按键值
  • Linux INPUT 子系统实验

    目录 input 子系统 input 子系统简 input 驱动编写流程 input event 结构体 硬件原理图分析 实验程序编写 修改设备树文件 按键input 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测
  • Linux 帧缓冲子系统详解:LCD介绍、framebuffer驱动框架、LCD驱动源码分析

    1 LCD显示屏基础知识介绍 请看博客 嵌入式开发 S5PV210 LCD显示器 2 内核帧缓冲子系统 2 1 功能介绍 1 帧缓冲 framebuffer 是 Linux 为显示设备提供的一个接口 它把显示设备描述成一个缓冲 区 允许应用
  • inux字符驱动之read、write部分

    本期主题 linux字符驱动之read write部分 往期链接 linux设备驱动中的并发 linux设备驱动中的编译乱序和执行乱序 linux设备驱动之内核模块 linux字符驱动 linux字符驱动之ioctl部分 linux字符驱动
  • Linux INPUT 子系统实验

    按键 鼠标 键盘 触摸屏等都属于输入 input 设备 Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件 输入设备本质上还是字符设备 只是在此基础上套上了 input 框架 用户只需要负责上报输入事件 比如按键值
  • USB之基础知识

    1 USB概述 USB Universal Serial Bus 通用串行总线 是一个外部总线标准 用于规范电脑与外部设备的连接和通讯 USB接口支持设备的即插即用和热插拔功能 USB接口有4个pin脚 分别为VCC GND Data Da
  • Windows驱动开发第11课(R3与R0通信交换数据第二节)

    在上一节课我们证实了在用户层调用CreateFile函数时 相应的在驱动层会响应一个IRP MJ CREATE的事件 这节课我们来看看用户层和驱动层是怎么交换数据的 首先来介绍一下控制码 由CTL CODE宏创建 是一个唯一的32位系统I
  • 32位/64位WINDOWS驱动之-突破进程保护映射的方法进行跨进程读内存2

    32位 64位WINDOWS驱动之 突破进程保护映射的方法进行跨进程读内存2 一 在过保护读写筛选器中添加 读写驱动2 c 驱动层 代码如下 include
  • 5V转±12V无变压器双boost电路

    最近有个新项目 需要 10V范围的模拟量输出 非隔离 对于5V以下供电的控制板而言单端输出绝对没问题 可现在需要有正负输出 是少不了正负电源的 因此准备设计一个5V转 12V的电源 然后选择一个双向供电的运放 来实现单端模拟量信号向双向模拟
  • STM32 CAN通信理解(是半双工还是全双工?)

    STM32F429 CAN通信 CAN 是控制器局域网络 Controller Area Network 的简称 它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的 并最终成为国际标准 ISO11519 是国际上应用最广泛的现场
  • linux应用程序直接return与exit的区别

    在Linux应用程序中 可以使用 return 语句直接从 main 函数返回 这将导致程序终止并返回给操作系统 然而 有时候使用 exit 函数比直接使用 return 语句更有优势 以下是一些原因 清理资源 exit 函数可以确保在程序

随机推荐

  • Linux配置kdump大小,linux6下kdump的配置

    linux6下kdump的配置 背景知识 kexec是一个快速启动机制 允许通过已经运行的内核的上下文启动一个Linux内核 不需要经过BIOS BIOS可能会消耗很多时间 特别是带有众多数量的外设的大型服务器 这种办法可以为经常启动机器的
  • 竞赛 基于机器视觉的火车票识别系统

    文章目录 0 前言 1 课题意义 课题难点 2 实现方法 2 1 图像预处理 2 2 字符分割 2 3 字符识别 部分实现代码 3 实现效果 最后 0 前言 优质竞赛项目系列 今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖 适
  • 【Linux入门教程】4 用户管理、系统性能分析、系统日志及日志分析、信号机制与信号处理

    Linux用户管理 在Linux中 有三种用户 Root 用户 也称为超级用户 对系统拥有完全的控制权限 超级用户可以不受限制的运行任何命令 Root 用户可以看做是系统管理员 系统用户 系统用户是Linux运行某些程序所必须的用户 例如
  • Linq的使用方法

    Linq Lamdbe 简单的查询 var ss from r in db Am recProScheme select r var ss1 db Am recProScheme 带where的查询 var ss from r in db
  • 万网免费空间php,免费虚拟主机空间

    免费虚拟主机空间 编辑 概述 许多人选择免费虚拟主机搭建自己的网站或Web技术 事实上免费虚拟主机存在很大风险 如果你需要可靠的 安全的 能快速加载服务的 有技术保障支持的服务 建议你准备一些预算 到正规的买可靠的虚拟主机空间 一 什么是免
  • 多线程快速导入大量数据到mysql

    目录 一 前言 二 多线程分批导入Mysql 3 Future类详解 4 ExecutorService 中 shutdown shutdownNow awaitTermination 含义和区别 一 前言 批量导入3w条数据需要一分多钟
  • 常用的方法封装成Jar包并调用

    在android开发过程中 我们经常会有这种需求 自己封装一个类库jar包 1 把自己写好的封装类只是代码的 直接在Eclipse中导出jar包 在所需要的项目中引用即可 2 如果代码中涉及到res资源文件的调用 通用的方法是把res资源文
  • 类中自身类的对象不能做自己的数据成员

    C 中为什么类中自身类的对象不能做自己的数据成员 但是做静态数据成员 引用类数据成员等可以 pre class cpp student private student a 错误 student b 正确 static student c 正
  • 备战数学建模1-MATLAB矩阵相关

    目录 一 数值数据 二 常用函数 三 变量及其操作 四 矩阵的基础应用 五 MATLAB基本运算 六 字符串处理 七 特殊矩阵 八 矩阵变换 九 矩阵求值 十 矩阵的特征值与特征向量 十一 稀疏矩阵 一 数值数据 1 整型 整型分为有符号整
  • JEESITE4实战之旅(五) 多数据源和图表

    前段时间有点忙 今天得空赶紧继续移植工作 今天要说一说多数据源的配置 自定义复杂查询 以及图表的操作 当然还是根据业务需求来 最近客户想让我在新系统上加一个销售汇总的功能 按月统计各个部门的销售额 废话 不多说 先上最终的效果图 因为汇总的
  • 数组扁平化(flatten)实现方案

    1 2 3 1 2 3 1 2 gt 1 2 3 1 2 3 1 2 上面的转换就是数组的扁平化 将一个嵌套多层的数组 array 转换为只有一层的数组 下面是实现数组扁平化的几种简单方法 1 递归 function flatten1 ar
  • 全量数据同步与数据校验实践——应对百亿量级分库分表异构库迁移

    在一家发展中的公司搬砖 正好遇到分库分表 数据迁移的需求比较多 就入坑了 最近有个系统重构 一直做数据重构 迁移 校验等工作 基本能覆盖数据迁移的各个基本点 所以趁机整理一下 数据同步的场景是 数据库拆分 数据冗余 数据表重构 数据重构服务
  • wget 命令 简单使用

    wget 命令用于在终端中下载网络文件 格式为 wget 参数 下载地址 1 wget 常用参数 b 后台下载模式 r 递归下载 p 下载页面内所有资源 包括图片 视频 音频等 c 断点续传 t 最大尝试次数 P 下载到指定的目录 2 案例
  • 新一代云数据库的引领者---AWS

    文章目录 前言 正文 1 数据库多样性挑战与数据库云管平台的机遇 1 1 数据库多样性挑战 1 2 数据库云管平台的机遇 1 2 1 数据库市场百花齐放 多元混合数据库管理给企业带来挑战 1 2 2 企业普遍缺乏多元混合数据库管理的人才和技
  • okyo Cabinet简介

    http idning github io ssd cache html http blog 163 com zbr 4690 blog static 126613593200910312346337 http blog chinaunix
  • Param ‘serviceName‘ is illegal, serviceName is blank --------报错

    报错内容为 java lang IllegalArgumentException Param serviceName is illegal serviceName is blank 报错原因 SpringBoot2 4版本之后不会默认加载b
  • linux测试命令

    如下是一份 Linux 机器的渗透测试备忘录 是在后期开发期间或者执行命令注入等操作时的一些典型命令 设计为测试人员进行本地枚举检查之用 系统信息命令 对于本地的枚举检查很有用 基于 Redhat CentOS RPM 的发行版 YUM 命
  • 解决SpringMVC Controller中接受日期格式发生400错误

    解决SpringMVC Controller中接受日期格式发生400错误 用户中有生日 Date 属性 用户注册的时候 选择日期即可 然后提交表单 可SpringMVC报错 意思是不能把字符串转为日期类型的 如果是strtus的话 压根不是
  • Vuex概念+实现原理

    文章目录 一 Vuex概念 1 Vuex是什么 2 Vuex的具体工作 3 Vuex 的属性包含以下6个 二 Vuex实现原理 2 1 store是怎么注册的 2 2 mutaions是怎么实现的 2 3 commit是怎么实现的 2 4
  • GPIO 模拟SPI

    GPIO 模拟SPI SPI简介 SCPH 0 SCPOL 0 的 SPI 协议时序图 在这里插入图片描述 https img blog csdnimg cn daeedeab80d14239aa1331736b17bf7d png SCP