ADI Blackfin DSP处理器-BF533的开发详解52:图像处理专题-CMOS摄像头采集图像(含源码)

news2024/11/28 11:44:56

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述
在这里插入图片描述

功能介绍

板卡上设计了一个摄像头接口,可以连接与板卡匹配的 ADSP-EDU-CMOS 子卡板。摄像头接口采用 20PIN 插针接入,将插针的 PIN3 脚剪去,摄像头子卡板对应的接口被堵上,以防止摄像头板卡反向插入。

ADSP-EDU-CMOS 子卡板采用了 OV9650 CMOS 感光芯片的模组,OV9650 为 OmniVision 公司生产的 130 万像素的摄像头芯片,其最大成像点阵为 1300*1028,其具体参数如表:

在这里插入图片描述

OV9650 IIC 器件地址: Slave address W 为 60H ,Slave address R 为 61H
CMOS 和 LCD 公用一个 PPI 接口,采用 CPLD 来切换 PPI 时钟

DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。
DEVICE_OE 寄存器位功能:

在这里插入图片描述

PPI_SET1~0:PPI 选择位

00:选通 CMOS PPI 时钟,使能 CMOS
01:选通 TFT PPI 时钟
选通 板卡为扩展接口的 PPICLK 提供时钟
1x:选通 PPI 时钟由扩展接口输入

选通摄像头需将 PPI_SET0 位设置为 0,PPI_SET1 位设置为 0。

硬件连接示意图

在这里插入图片描述

硬件原理图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码实现功能

代码实现了通过配置 PPI 接口和摄像头,从摄像头采集一幅图像放置到指定的内存中,通过 Visual DSP ++软件的 image viwe 工具,将数据还原为图像。

测试步骤

1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好,将 ADSP-EDU-CMOS 子卡板镜头朝板外接入摄像头接口。
2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF53x 的 session 将仿真器与软件连接。
4. 加载 VisualDSP++ 5.0 工程文件 BF53x_CMOS.dpj 文件,编译并全速运行。

测试结果

1.当看到如下信息打印时,将代码停止,选择 Visual DSP++5.0 菜单下“View -->DebugWindows–>image viewer…”选项。

在这里插入图片描述

2. 按下图配置选项:

在这里插入图片描述

3.点“OK”后会弹出图像输出窗口,待刷新进度到 100%后,即可看到拍到的图片

在这里插入图片描述

程序源码

cmos.c

#include <cdefBF533.h>
#include"i2c.h"

#define OV9653_ADDRESS 0x60

static i2c_device mcu_i2c;

void init_OV9653(void);
int ov9653_write(unsigned char addr, unsigned char dat);
int ov9653_read(unsigned char addr, unsigned char * buf);
/****************************************************************************

  • 名称 :ov9653_write
  • 功能 : 写ov9653寄存器函数
  • 入口参数 :addr:寄存器偏移地址
    dat:寄存器配置值
  • 出口参数 :返回0
    /
    int ov9653_write(unsigned char addr, unsigned char dat)
    {
    int ret = -1;
    i2c_start(&mcu_i2c);
    //send slave address
    if(i2c_write(&mcu_i2c, OV9653_ADDRESS, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    //send sub-address to device
    if(i2c_write(&mcu_i2c, addr, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    //send data to device
    i2c_write(&mcu_i2c, dat, 1);
    i2c_stop(&mcu_i2c);
    return 0;
    }
    /
  • 名称 :ov9653_read
  • 功能 : 读ov9653寄存器函数寄存器偏移地址
  • 入口参数 :addr:
    buf:寄存器读取数据缓存
  • 出口参数 :返回0
    ****************************************************************************/
    int ov9653_read(unsigned char addr, unsigned char * buf)
    {
    unsigned char *p = buf;
    int ret = -1;
    i2c_start(&mcu_i2c);
    //send slave address
    if(i2c_write(&mcu_i2c, OV9653_ADDRESS, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    //send sub-address of slave
    if(i2c_write(&mcu_i2c, addr, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    i2c_stop(&mcu_i2c);
    i2c_start(&mcu_i2c);
    // send slave address (+1 read mode)
    if(i2c_write(&mcu_i2c, OV9653_ADDRESS+1, 1)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    if(i2c_wait_slave(&mcu_i2c, 1000)){
    i2c_stop(&mcu_i2c);
    return ret;
    }
    i2c_read(&mcu_i2c, p++, 1); // send ack
    i2c_stop(&mcu_i2c);
    return 0;
    }

/****************************************************************************

  • 名称 :Init_OV9653

  • 功能 : CMOS 130万 内部寄存器配置信息

  • 入口参数 :无

  • 出口参数 :无
    ****************************************************************************/
    void init_OV9653(void)
    {
    mcu_i2c.sclk = PF0; //时钟PF脚
    mcu_i2c.sdata = PF1; //数据PF脚
    mcu_i2c.low_ns = 7000; //低电平延时 ns
    mcu_i2c.high_ns = 6000; //高电平延时 ns
    i2c_init(&mcu_i2c);

    ov9653_write(0x12,0x80);
    ov9653_write(0x12,0x80);
    ov9653_write(0x11,0x81);
    ov9653_write(0x6b,0x0a);
    ov9653_write(0x6a,0x3e);
    ov9653_write(0x3b,0x09);
    ov9653_write(0x13,0xe0);
    ov9653_write(0x01,0x80);
    ov9653_write(0x02,0x80);
    ov9653_write(0x00,0x00);
    ov9653_write(0x10,0x00);
    ov9653_write(0x13,0xe5);
    ov9653_write(0x39,0x43);
    ov9653_write(0x38,0x12);
    ov9653_write(0x37,0x00);
    ov9653_write(0x35,0x91);
    ov9653_write(0x0e,0x20);
    ov9653_write(0x1e,0x34);
    ov9653_write(0xA8,0x80);
    ov9653_write(0x12,0x40);
    ov9653_write(0x04,0x00);
    ov9653_write(0x0c,0x04);
    ov9653_write(0x0d,0x80);
    ov9653_write(0x18,0xc6);
    ov9653_write(0x17,0x26);
    ov9653_write(0x32,0xad);
    ov9653_write(0x03,0x00);
    ov9653_write(0x1a,0x3d);
    ov9653_write(0x19,0x01);
    ov9653_write(0x3f,0xa6);
    ov9653_write(0x14,0x1a);
    ov9653_write(0x15,0x02);
    ov9653_write(0x41,0x12);
    ov9653_write(0x42,0x08);
    ov9653_write(0x1b,0x00);
    ov9653_write(0x16,0x06);
    ov9653_write(0x33,0xe2);
    ov9653_write(0x49,0x60);
    ov9653_write(0x34,0x16);
    ov9653_write(0x96,0x04);
    ov9653_write(0x3a,0x00);
    ov9653_write(0x8e,0x00);
    ov9653_write(0x3c,0x77);
    ov9653_write(0x8B,0x06);
    ov9653_write(0x94,0x88);
    ov9653_write(0x95,0x88);
    ov9653_write(0x40,0xc1);
    ov9653_write(0x29,0x3f);
    ov9653_write(0x0f,0x42);
    ov9653_write(0x3d,0x92);
    ov9653_write(0x69,0x40);
    ov9653_write(0x5C,0xb9);
    ov9653_write(0x5D,0x96);
    ov9653_write(0x5E,0x10);
    ov9653_write(0x59,0xc0);
    ov9653_write(0x5A,0xaf);
    ov9653_write(0x5B,0x55);
    ov9653_write(0x43,0xf0);
    ov9653_write(0x44,0x10);
    ov9653_write(0x45,0x68);
    ov9653_write(0x46,0x96);
    ov9653_write(0x47,0x60);
    ov9653_write(0x48,0x80);
    ov9653_write(0x5F,0xe0);
    ov9653_write(0x60,0x8c);
    ov9653_write(0x61,0x20);
    ov9653_write(0xa5,0xd9);
    ov9653_write(0xa4,0x74);
    ov9653_write(0x8d,0xc2);
    ov9653_write(0x13,0xe7);
    ov9653_write(0x4f,0x3a);
    ov9653_write(0x50,0x3d);
    ov9653_write(0x51,0x03);
    ov9653_write(0x52,0x12);
    ov9653_write(0x53,0x26);
    ov9653_write(0x54,0x38);
    ov9653_write(0x55,0x40);
    ov9653_write(0x56,0x40);
    ov9653_write(0x57,0x40);
    ov9653_write(0x58,0x0d);
    ov9653_write(0x8C,0x23);
    ov9653_write(0x3E,0x02);
    ov9653_write(0xa9,0xb8);
    ov9653_write(0xaa,0x92);
    ov9653_write(0xab,0x0a);
    ov9653_write(0x8f,0xdf);
    ov9653_write(0x90,0x00);
    ov9653_write(0x91,0x00);
    ov9653_write(0x9f,0x00);
    ov9653_write(0xa0,0x00);
    ov9653_write(0x3A,0x01);
    ov9653_write(0x24,0x80);
    ov9653_write(0x25,0x70);
    ov9653_write(0x26,0xd3);
    ov9653_write(0x2a,0x10);
    ov9653_write(0x2b,0x40);
    ov9653_write(0x6c,0x40);
    ov9653_write(0x6d,0x30);
    ov9653_write(0x6e,0x4b);
    ov9653_write(0x6f,0x60);
    ov9653_write(0x70,0x70);
    ov9653_write(0x71,0x70);
    ov9653_write(0x72,0x70);
    ov9653_write(0x73,0x70);
    ov9653_write(0x74,0x60);
    ov9653_write(0x75,0x60);
    ov9653_write(0x76,0x50);
    ov9653_write(0x77,0x48);
    ov9653_write(0x78,0x3a);
    ov9653_write(0x79,0x2e);
    ov9653_write(0x7a,0x28);
    ov9653_write(0x7b,0x22);
    ov9653_write(0x7c,0x04);
    ov9653_write(0x7d,0x07);
    ov9653_write(0x7e,0x10);
    ov9653_write(0x7f,0x28);
    ov9653_write(0x80,0x36);
    ov9653_write(0x81,0x44);
    ov9653_write(0x82,0x52);
    ov9653_write(0x83,0x60);
    ov9653_write(0x84,0x6c);
    ov9653_write(0x85,0x78);
    ov9653_write(0x86,0x8c);
    ov9653_write(0x87,0x9e);
    ov9653_write(0x88,0xbb);
    ov9653_write(0x89,0xd2);
    ov9653_write(0x8a,0xe6);

    }

cpu.c

#include <cdefbf533.h>

/**********************************************************************************

  • 名称 :Set_PLL
  • 功能 :初始化内核时钟和系统时钟
  • 入口参数 :pmsel pssel 设置参数
  • 出口参数 :无
    ***********/
    void Set_PLL(int pmsel,int pssel)
    {
    int new_PLL_CTL;
    pPLL_DIV = pssel;
    asm(“ssync;”);
    new_PLL_CTL = (pmsel & 0x3f) << 9;
    pSIC_IWR |= 0xffffffff;
    if (new_PLL_CTL != pPLL_CTL)
    {
    pPLL_CTL = new_PLL_CTL;
    asm(“ssync;”);
    asm(“idle;”);
    }
    }
    /
  • 名称 :Setup_Flags
  • 功能 :初始化PF口
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Setup_Flags(void)
    {
    *pFIO_INEN = 0x0020;
    *pFIO_DIR = 0x001f;
    *pFIO_EDGE = 0x0000;
    *pFIO_MASKA_S = 0x0020;
    *pFIO_POLAR = 0x0020;
    }

/****************************************************************************

  • 名称 :Init_EBIU
  • 功能 :初始化并允许异步BANK存储器工作
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc0ffc0;
*pEBIU_AMGCTL = 0x000f;
}

/****************************************************************************

  • 名称 :Init_SDRAM
  • 功能 :初始化SDRAM
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Init_SDRAM(void)
    {
    *pEBIU_SDRRC = 0x00000817;
    *pEBIU_SDBCTL = 0x00000013;
    *pEBIU_SDGCTL = 0x0091998d;
    ssync();
    }

/****************************************************************************

  • 名称 : delay
  • 功能 : 延时函数
  • 入口参数 :无
  • 返回值 :无
    ****************************************************************************/
    void delay(unsigned int tem)
    {
    int i;
    for(i=0;i<tem;i++)
    asm(“nop;”);
    }

iic.c

#include <cdefBF533.h>
#include “i2c.h”

#define CORE_CLK_IN 25 * 1000 * 1000

#define SET_PF(pf)
do{
*pFIO_FLAG_S = (pf);
ssync();
}while(0)

#define CLR_PF(pf)
do{
*pFIO_FLAG_C = (pf);
ssync();
}while(0)

#define SET_PF_OUTPUT(pf)
do{
*pFIO_INEN &= ~(pf);
*pFIO_DIR |= (pf);
ssync();
}while(0)

#define SET_PF_INPUT(pf)
do{
*pFIO_DIR &= ~(pf);
*pFIO_INEN |= (pf);
ssync();
}while(0)

int get_core_clk(void)
{
int tempPLLCTL;
int _DF;
int VCO;
int MSEL1;

tempPLLCTL = *pPLL_CTL;


MSEL1 = ((tempPLLCTL & 0x7E00) >> 9);
_DF   =  tempPLLCTL & 0x0001;

VCO  = MSEL1 * __CORE_CLK_IN__;
if(_DF == 1)
	VCO /= 2;

return  VCO;

}
void delay_ns(unsigned int core_clock, unsigned long long count)
{
count *= core_clock;
count /= 1000000000;
while(count–);

}

int _get_sdata(i2c_device * dev)
{
return ((*pFIO_FLAG_D & dev->sdata) ? 1 : 0);
}

void i2c_init(i2c_device * dev)
{
dev->core_clock = get_core_clk();
dev->delay_ns = delay_ns;
*pFIO_DIR |= dev->sclk | dev->sdata;
ssync();
}

void i2c_deinit(i2c_device * dev)
{
dev->sclk = 0;
dev->sdata = 0;

*pFIO_DIR &=  ~(dev->sclk | dev->sdata);
ssync();

}

void i2c_start(i2c_device * dev)
{
SET_PF_OUTPUT(dev->sdata);
SET_PF_OUTPUT(dev->sclk);

SET_PF(dev->sdata);
SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->low_ns);

CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

}

void i2c_stop(i2c_device * dev)
{
CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

SET_PF_OUTPUT(dev->sdata);
CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->low_ns);

SET_PF_INPUT(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns);

}

int i2c_read_ack(i2c_device * dev)
{
int ret = 0;

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/3);

SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns/3);

ret = _get_sdata(dev);

delay_ns(dev->core_clock, dev->high_ns/3);
CLR_PF(dev->sclk);

delay_ns(dev->core_clock, dev->low_ns);

SET_PF_OUTPUT(dev->sdata);
return ret;

}

int i2c_wait_slave(i2c_device * dev, unsigned int time_out)
{
int ret;
int count = time_out * 2 / dev->high_ns;

SET_PF_INPUT(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns/2);

do{
	ret = *pFIO_FLAG_D & dev->sclk;
	if(ret)
	   break;
	delay_ns(dev->core_clock, dev->high_ns/2);
}while(count--);

SET_PF_OUTPUT(dev->sclk);
return !ret;

}

void i2c_write_ack(i2c_device * dev)
{
SET_PF_OUTPUT(dev->sdata);
CLR_PF(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/2);
SET_PF(dev->sclk);
delay_ns(dev->core_clock, dev->high_ns);

CLR_PF(dev->sclk);
delay_ns(dev->core_clock, dev->low_ns);

}

int i2c_write(i2c_device * dev, unsigned char value, int need_ack)
{
int ret = -1;
unsigned char index;

SET_PF_OUTPUT(dev->sdata);

//send 8 bits to slave
for(index = 0; index < 8; index++){
	//send one bit to the i2c bus
	if((value<<index) & 0x80){
		SET_PF(dev->sdata);
	} else {
		CLR_PF(dev->sdata);
	}
	
	delay_ns(dev->core_clock, dev->low_ns/2);
	
	SET_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->high_ns);
	
	CLR_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->low_ns/2);
}

if(need_ack){
	ret = i2c_read_ack(dev);
}
return ret;

}

int i2c_read(i2c_device * dev, unsigned char * value, int send_ack)
{
unsigned char index;
*value = 0x00;

SET_PF_INPUT(dev->sdata);
delay_ns(dev->core_clock, dev->high_ns/2);

//get 8 bits from the device
for(index = 0; index < 8; index++){
	SET_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->high_ns/2);
	
	*value <<= 1;
	*value |= _get_sdata(dev);
	
	delay_ns(dev->core_clock, dev->high_ns/2);
	
	CLR_PF(dev->sclk);
	delay_ns(dev->core_clock, dev->low_ns);
}

// send ack to slave
if(send_ack){
	i2c_write_ack(dev);
}
return *value;

}

main.c

#include <cdefBF533.h>

/****************************************************************************

  • 名称 :main
  • 功能 :初始化各函数,实现图象捕捉
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void main()
    {
    Set_PLL(16,4) ;
    Setup_Flags();
    Init_EBIU();
    Init_SDRAM();
    Init_Interrupts();
    printf( “\n initialize success!\n” );
    IIC_Enable();
    init_OV9653();
    printf( “\nCMOS initialize success!\n” );
    CMOS_Enable();
    Video_Frame_Capture();
    while(1);
    }

ppi.c

#include <cdefBF533.h>
#include <sys\exception.h>

EX_INTERRUPT_HANDLER(DMA0_PPI_ISR);
/****************************************************************************

  • 名称 :Init_Timers
  • 功能 :初始化TIMER0 为PWM模式。
  • 入口参数 :无
  • 出口参数 :无
    ****/
    void Init_Timers(void)
    {
    pTIMER0_CONFIG = 0x0019;
    pTIMER0_PERIOD = 0x00800000;
    pTIMER0_WIDTH = 0x00400000;
    pTIMER_ENABLE = 0x0001;
    }
    /
  • 名称 :Init_Interrupts
  • 功能 : DMA0 PPI interrupt 允许
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Init_Interrupts(void)
    {
    *pSIC_IAR0 = *pSIC_IAR0 & 0xffffffff | 0x00000000;
    *pSIC_IAR1 = *pSIC_IAR1 & 0xffffffff | 0x00000001;
    *pSIC_IAR2 = *pSIC_IAR2 & 0xffffffff | 0x00000000;
    register_handler(ik_ivg8, DMA0_PPI_ISR);
    *pSIC_IMASK=0x00000100;
    }

/****************************************************************************

  • 名称 :Video_Frame_Capture
  • 功能 : 初始化PPI控制器 初始化DMA0控制器
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Video_Frame_Capture(void)
    {
    *pPPI_FRAME = 480;
    *pPPI_COUNT = 1279;
    *pPPI_DELAY = 0;
    *pPPI_CONTROL = 0x01AC;
    *pDMA0_START_ADDR = 0;
    *pDMA0_X_COUNT = 640;
    *pDMA0_X_MODIFY = 0x2;
    *pDMA0_Y_COUNT = 480;
    *pDMA0_Y_MODIFY = 0x2;
    *pDMA0_PERIPHERAL_MAP = 0x0;
    *pDMA0_CONFIG = WNR | WDSIZE_16| DMA2D | RESTART | DI_EN;
    *pDMA0_CONFIG |= DMAEN;
    ssync();
    *pPPI_CONTROL |= PORT_EN;
    ssync();
    }

/****************************************************************************

  • 名称 :EX_INTERRUPT_HANDLER
  • 功能 : 中断函数 清 DMA 中断标志,关PPI
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/

EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{
*pDMA0_IRQ_STATUS = 0x1;
*pPPI_CONTROL &= 0xfffe;
printf( “\nSuccess Capture One Frame: 640 * 480\n”);
printf( " YUYV422(YUV422) Format\n" );
printf( " The data address is 0 \n" );
}

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

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

相关文章

照片变漫画怎么做?分享这几个照片变漫画的技巧给你

大家在网上是否有看到过一些绘画博主给别人画漫画图呢&#xff1f;这些图片中的人物形象与现实中的非常相像&#xff0c;而且看起来真的很像漫画中的人物一般&#xff0c;画出来对于一些没有绘画功底的人来说是比较困难的。那么我们又该如何得到我们在漫画中的图片呢&#xff1…

四种常见排序(冒泡、选择、插入、快速排序)--- Python版

经典排序算法总结与实现 经典排序算法在面试中占有很大的比重&#xff0c;也是基础&#xff0c;为了未雨绸缪&#xff0c;这次收集整理并用Python实现了八大经典排序算法&#xff0c;包括冒泡排序&#xff0c;插入排序&#xff0c;选择排序&#xff0c;希尔排序&#xff0c;归…

Python实现批量采集美女视*频 <无水印>

前言 大家早好、午好、晚好吖 ❤ ~ 我给大家准备了一些资料&#xff0c;包括: 2022最新Python视频教程、Python电子书10个G &#xff08;涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题&#xff09;、Python学习路线图等等 直接在文末名片自取即可&#x…

机器学习还能预测心血管疾病?没错,我用 Python 写出来了

全球每年约有1700万人死于心血管疾病&#xff0c;当中主要表现为心肌梗死和心力衰竭。当心脏不能泵出足够的血液来满足人体的需要时&#xff0c;就会发生心力衰竭&#xff0c;通常由糖尿病、高血压或其他心脏疾病引起。 在检测心血管疾病的早期症状时&#xff0c;机器学习就能…

nodejs+vue企业固定资产管理系统-vscode

目 录 摘 要 I 目 录 III 第一章 概述 1.1研究背景 1.2 开发意义 1.3 研究现状 1.4 研究内容 1.5 论文结构 第二章 开发技术介绍 2.5 B/S架构 3.1 可行性分析 3.1.1技术可行性 3.1.2操作可行性 3.1.3 经济可行性 3.1.4 运行可行性 3.2性能需求分析 3.4功能分析 第四章 系统设计…

轻量级的架构决策记录机制

作者&#xff1a;倪新明 ADR是一种性价比非常高的架构决策文档化实践&#xff0c;团队引入和实践成本很低&#xff0c;却能为团队带来极大收益&#xff01; 1 团队研发面临的问题 不论是在传统的IT行业&#xff0c;还是互联网行业&#xff0c;研发团队在架构决策层面或多或少…

在Arduino IDE上开发ESP32(离线安装SDK)

用过Arduino的朋友都知道&#xff0c;Arduino的整个生态强大得让你不能不服。大家所贡献出来的各种库让基于Arduino的开发虽然还没有变得无所不能&#xff0c;但也算是相当得心应手了。你所能想到的功能大体都能在网上找到对应的库和文章。可能是因为这个原因吧&#xff0c;所以…

Redis整理-未完成

目录 1. Redis安装 1.1 单机 1.2 主从 1.3 哨兵 1.4 集群 1.4.1 方式一 redis-cli --cluster命令 1.4.2 方式二 cluster meet/addslots/replicate 2. Redis配置 2.1 基本参数配置 2.2 持久化配置 2.3 内存策略设置 2.4 主从配置 2.5 哨兵配置 2.6 集群配置 2.6.…

吃透这份 “ 自动化测试 ” 核心技术栈,月薪30K还不是随便叫

为了帮助大家快速回顾学习自动化测试中的知识点&#xff0c;分享一下这些年来&#xff0c;我对于技术一些归纳和总结&#xff0c;和自己对作为一名 高级测试工程师需要掌握那些技能的笔记分享&#xff0c;希望能帮助到有心在技术这条道路上一路走到黑的朋友&#xff01; 一、L…

[附源码]Python计算机毕业设计SSM基于JAVA快递配送平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

语音怎么转换成文字?这几个实用方法分享给你

当我们在听一些流行的英文歌曲时&#xff0c;发现它没有附带翻译的时候&#xff0c;是不是常常听不懂歌曲的意思内容呢&#xff1f;面对这种情况应该怎么办呢&#xff1f;其实也不难&#xff0c;我们只需要利用软件来将歌曲转换成文字的格式就可以了&#xff0c;那你们知道如何…

分布式系统(交互、协作)

文章目录进程组织进程交互传染病协议反熵&#xff08;Anti-Entropy&#xff09;闲聊&#xff08;Gossiping&#xff09;P2P 路由Circular routingPastry应用层多播ESMScribe中间件通信协议RPCMOM进程协作有序组播基本组播FIFO 组播全排序组播定序者分布式协商因果序组播分布式互…

基于SSM框架的酒店管理系统

基于SSM框架的酒店管理系统开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 看每个等级模块&#xff1a;客白模块&#xff0c;屋工模垫&#xff0c;反怠管理员模垫 客户可…

如何实现采购管理流程的优化?

采购管理流程优化指的是一种整体方法&#xff0c;而不是个人主义的方法。它指的是利用人员、流程和技术来实现最佳价值创造的过程。采购优化的方法可以是&#xff1a;最初的范围界定&#xff0c;数据收集和分析&#xff0c;改进和实施以及跟进和监控。 理解采购管理流程优化 …

oracle学习篇(二)

oracle学习篇(二) 1添加约束 1.1 添加主键约束 1.1.1 语法 alter table 表名 add constraint 约束名 约束关键字 key(添加约束的字段);1.1.2 示例代码 alter table infos add constraint pk_stuid primary key(stuid);1.2 添加检查约束 1.2.1 语法 alter table 表名 ad…

[附源码]Node.js计算机毕业设计高校学生心理健康信息咨询系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

numpy.pad()函数详解

目录 函数定义&#xff1a; 示例讲解&#xff1a; 示例1.1 constant&#xff1a; 示例1.2 maximum 示例1.3 constant: 示例2.1 constant&#xff1a; 示例2.2 constant&#xff1a; 函数定义&#xff1a; numpy.pad()函数用于对Numpy数组进行填充。有时需要对Numpy数组进…

Docker 项目快速部署Flask项目

前言 打造 flask gunicron nginx Mysql 环境 nginx Mysql 使用docker 快速部署 使用 supervisor 对 gunicron 做监控 环境&#xff1a;centos7 &#xff0c;python3.7 flask 篇 flask 项目就不多赘述了。这里贴一下项目的目录&#xff0c;便于解释下面的命令参数。 运行…

​Word怎么转换成PDF格式?这三种方法教你如何转换

怎么把Word文档转换成PDF文件格式呢&#xff1f;相信小伙伴们在办公过程中会习惯使用Word文档来编辑文件&#xff0c;编辑好后如果需要发送文件的话会将文档转换成PDF格式来发送&#xff0c;原因就是PDF格式独有的兼容性和稳定性能够让我们的文件格式不会错乱&#xff0c;这也是…

深入理解Maven的全部配置

深入理解Maven的全部配置1. Introduction1.1 Big Data -- Postgres2. Install2.1 Maven Install2.2 Config Setting.xml2.3 Local Package Install Maven3. Project4.AwakeningMaven Document: https://maven.apache.org/. Maven Download: https://maven.apache.org/download.…