GD32E230C8T6《调试篇》之 FMC(闪存)的读写 + USART打印

实验:按键DIG4(保存键),任意按下一个数字后,再按保存键写入flash;断电后重新上电,从 flash里读值,显示到数码管

  • 实验工具
  • GD32E230C8T6
    • 查看GPIO
    • 查看Datasheet 2.6.7章节GPIO 复用
  • 查看用户手册
  • 代码

实验工具

	主芯片GD32E230C8T6 /4段8位数码管/GN1650驱动芯片(IIC通讯)/USART/485通讯芯片

GD32E230C8T6

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

查看GPIO

在这里插入图片描述

在这里插入图片描述

查看Datasheet 2.6.7章节GPIO 复用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
说明使用PA9、 PA10的USART0时要选择AF1;
初始化USART0 时才有了这两句;
与GD32E103不同的是E230没有gpio_init这个库函数,所以参考例程是有帮助的;

    /* connect port to USARTx_Tx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);
    /* connect port to USARTx_Rx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);

查看用户手册

可以看到E230有64K的主flash,这里我选了0x0800 FC00,操作最后一页;
在这里插入图片描述

代码

main.h


//IIC所有操作函数
void i2c_init(void);  //初始化IIC的IO口	
static void IIC_Start1(void); 
static void IIC_Stop1(void);
uint8_t IIC_Rev_Byte(void);  //对IIC数据进行读出
void IIC_Wrt_Byte(uint8_t data);		//IIC发送一个字节
void IIC_ACK(void);						//IIC发送信号
void IIC_NAck(void);					//IIC不发送ACK信号
void SDA_Rx(void);						//主机recv from 从机
/************** GN1650 **************/
void GN1650_display(void);				//数码管显示
void  GN1650_display_D(void);			//数码管无显示
void GN1650_Wrt_RAM(uint8_t Address, uint8_t Data);  //对IIC数据进行写入

uint8_t GetKey(void);					//按键扫描
/************** usart ************/
void usart0_init();	
/************** flash ************/
uint8_t FMC_FLASH_Write( u32 data );
uint8_t FMC_FLASH_Read(u32 *data );

main.c

#define READ_SDA gpio_input_bit_get(GPIOB,GPIO_PIN_7)
#define LEDDOT 0x80
#define MAXNUM  10

#define TIMEPRESS  350 //key press times
#define DIG1 17
#define DIG2 25
#define DIG3 21
#define DIG4 29
#define ADDRMAX 512
uint8_t i;

uint16_t value=0;
		
void myGPIO_init(void)
{
	 /* enable GPIOB clock */
	 rcu_periph_clock_enable(RCU_GPIOA);	
		
	 gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ,GPIO_PIN_0);//PB6_42  I2C0_SCL GPIO_OTYPE_PP推挽输出
	 gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);	
}

void keycheck(void)
{
	uint16_t KeyNum;
	uint16_t LastKeyNum = 0;
	static uint8_t Keyleased=1,fastCnt=0;
	static uint16_t keydowntime = 0;
	
	KeyNum = GetKey();
	switch(KeyNum)
	{
		case DIG2:
			
			if(keydowntime++ >= TIMEPRESS )//long press ++
			{
				keydowntime=TIMEPRESS;
				if(++fastCnt>=10)//add press times 分频
				{
					fastCnt=0;
					value++;
					if(value > ADDRMAX) value = 1;  //512 to 1
				}				
			}
			else if(Keyleased && keydowntime < TIMEPRESS )//short press ++
			{
				value++;	
				Keyleased = 0;
				if(value > ADDRMAX) value = 1;    //512 to 1
			}							
			break;	
		
		case DIG3:	
			
			if( keydowntime++ >= TIMEPRESS)//long press --
			{	
				keydowntime=TIMEPRESS;
				if(++fastCnt>=10)//add press times 分频
				{
					fastCnt=0;
					value--;
					if(value == 0) value = ADDRMAX;   //0 to 512
				}								
			}
			else if(Keyleased  && keydowntime++ < TIMEPRESS )//short press --
			{
				value--;
				Keyleased=0; //keydown locked	
				if(value == 0) value = ADDRMAX;   //0 to 512
			}
							
			break;
			
		case DIG4:
			if(Keyleased)
			{			
				FMC_FLASH_Write(value);
		
				printf("****value=%d****\r\n",value);
				
				Keyleased = 0;
			}
			break;
			
		default:
			
			Keyleased=1;//keydown loosed
		
			fastCnt=0;

			keydowntime = 0;
			//lontimeflag = 1;
			break;
	}
}

//主函数处理
int main(void)
{
	uint8_t flag = 0;
	
	systick_config();
	
	delay_ms(10);
	
	usart0_init();
		
	//myGPIO_init();
	
	delay_ms(10);
 	
	i2c_init();
	
	FMC_FLASH_Read((u32 *)&value);//read flash	

    while(1)
	{
		flag =!flag;
		gpio_bit_write(GPIOA,GPIO_PIN_0,flag);
		delay_ms(1);
		
		keycheck();
		
		GN1650_display();		
					
		//do work1
		
		//do work2				
	}
 
}
/********** 数码管显示 **********/
void  GN1650_display(void)	
{		
	GN1650_Wrt_RAM(0x68,LEDENCODE[value/1000%10]);//high //0x48 系统指令  0x41//4级亮度 8段显示 显示开
	GN1650_Wrt_RAM(0x6A,LEDENCODE[value/100%10] );//   ;
	GN1650_Wrt_RAM(0x6C,LEDENCODE[value/10%10]);
	GN1650_Wrt_RAM(0x6E,LEDENCODE[value%10] ); //low
	
	GN1650_Wrt_RAM(0x48,0x01);
	
}
/********** 数码管无显示 **********/
void  GN1650_display_D(void)	
{
	GN1650_Wrt_RAM(0x48,0x00);
}
/**********  IIC初始化 *********/
void i2c_init(void)
{
	 /* enable GPIOB clock */
	 rcu_periph_clock_enable(RCU_GPIOB);
	 /* enable I2C0 clock */
	 rcu_periph_clock_enable(RCU_I2C0);
	
	 /* connect PB6 to I2C0_SCL */
	 gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_6);
	 /* connect PB7 to I2C0_SDA */
	 gpio_af_set(GPIOB,GPIO_AF_1,GPIO_PIN_7);
	
	 gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_6);//PB6_42  I2C0_SCL 
	 gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_6);
	
	 gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43  I2C0_SDA
	 gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
			
	 /* configure I2C0 clock */
	 //i2c_clock_config(I2C0,60000,I2C_DTCY_2);

	 /* enable I2C0 */
	 i2c_enable(I2C0);
	 /* enable acknowledge */
	 i2c_ack_config(I2C0,I2C_I2CMODE_ENABLE);
	 
	 /*  空闲状态 */
	 gpio_bit_write(GPIOB,GPIO_PIN_6,1);
	 gpio_bit_write(GPIOB,GPIO_PIN_7,1);
	 
	 GN1650_Wrt_RAM(0x48,0x00);//关闭显示
	 	
}
void SDA_Rx(void)					//主机recv from 从机
{
	 /* enable GPIOB clock */
	 rcu_periph_clock_enable(RCU_GPIOB);
	 gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
	
}
void SDA_Tx(void)
{
	 /* enable GPIOB clock */
	 rcu_periph_clock_enable(RCU_GPIOB);
	 gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_2MHZ,GPIO_PIN_7);//PB7_43  I2C0_SDA
	 gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_7);
}

void IIC_SCL(uint8_t n)
{
	gpio_bit_write(GPIOB,GPIO_PIN_6,n);
}

void IIC_SDA(uint8_t n)
{
	gpio_bit_write(GPIOB,GPIO_PIN_7,n);
}


static void IIC_Delay(void)
{
	__IO  uint16_t cnt=1;
	while(cnt--);
}

/*********************模拟IIC通信****************/
/*
*函数功能:IIC起始
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/
static void IIC_Start1(void)
{
	SDA_Tx();
	//2、SCL 1
	IIC_SCL(1);
	//3、SDA 1
	IIC_SDA(1);
	//延时5us
	IIC_Delay();
	//4、SCL 0 
	IIC_SDA(0);
	//延时5us
	IIC_Delay();
	//5、SDA 0
	IIC_SCL(0);
	//延时5us
	IIC_Delay();		
}


/*
*函数功能:IIC结束
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/

static void IIC_Stop1(void)
{
	//2、SCL 1
	IIC_SCL(1);
	//3、SDA 0
	IIC_SDA(0);
	//延时5us
	IIC_Delay();
	//4、SDA 1
	IIC_SDA(1);
	//延时5us
	IIC_Delay();
}

/*
*函数功能:IIC应答
*提    示:
*输入参数:无
*输出参数:无
*返回值  :无
*/
void IIC_ACK(void)
{	
	SDA_Rx();
	IIC_SCL(0);
	IIC_Delay(); 
	IIC_SDA(0); 	
	IIC_Delay();     
	IIC_SCL(1);
	IIC_Delay();                  
	IIC_SCL(0);                     
	IIC_Delay();
	SDA_Tx(); 
	IIC_SDA(0);	
	IIC_Delay();
		
}


/****************模拟IIC通信**************/

/* 描述:一个字节数据发送函数               
 * 参数:  无
 * 返回值:无		*/

void IIC_Wrt_Byte(uint8_t data)
{
	int i;	
    IIC_SCL(0);    //拉低时钟开始数据传输
	for(i = 0;i < 8;i++)
	{
		IIC_SDA((data & 0x80)>0 ); //check bit7
        data <<= 1; 	  
		IIC_Delay();   //这三个延时都是必须的
		IIC_SCL(1);
		IIC_Delay(); 
		IIC_SCL(0);	
		IIC_Delay();	
	}	
}

/* 描述:一个字节数据接收函数               
 * 参数:  无
 * 返回值:接收到的字节数据		*/

uint8_t IIC_Rev_Byte(void)
{
	uint8_t dat=0;
	uint8_t i;	
 
	SDA_Rx();			/* 设置数据线为输入方式 */
	IIC_Delay();                    
	for(i = 0;i < 8;i++)
	{  
		IIC_SCL(0);		/* 设置时钟线为低,准备接收数据位	*/
		IIC_Delay();               
		IIC_SCL(1);		/* 设置时钟线为高使数据线上数据有效  */              
		if(READ_SDA) dat|=0x80;	//同ret++; /* 读数据位,接收的数据位放入ret中 */
		dat>>=1;
		IIC_Delay();
	}
	IIC_SCL(0); 
 	
	return dat;
}

// write to RAM
void GN1650_Wrt_RAM(uint8_t Address, uint8_t Data)
{
	IIC_Start1();
    IIC_Wrt_Byte(Address);
    IIC_ACK();
    IIC_Wrt_Byte(Data);
    IIC_ACK();
    IIC_Stop1();	
}
/********** get 4 按键 ID **********/
uint8_t GetKey(void)
{
	uint8_t key=0;
	
	IIC_Start1();
	IIC_Wrt_Byte(0x49);
	IIC_ACK();
	key= IIC_Rev_Byte();
	IIC_ACK();
	IIC_Stop1();
	return key;
}

#define  ADDRSTART 0x0800FC00
/****************** flash write **************/
/*!
    \brief      FLASH写
    @Address    操作地址
    @Size       数据长度
*/
uint8_t FMC_FLASH_Write(u32 data)
{
    fmc_state_enum FLASHStatus;
    uint16_t i;    
    uint32_t Address = ADDRSTART;
	
    /* 解锁 */
    fmc_unlock();
	/* step1: erase pages */
    fmc_page_erase(Address);
    /* step2: 操作FMC前先清空STAT 状态寄存器,非常必要*/
    fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR );
    fmc_word_program(Address, data);
	fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGAERR | FMC_FLAG_PGERR );
    /* 上锁 */
    fmc_lock();
    return 0;
}
/****************** flash read **************/

/*!
    \brief      FLASH读
    @Address    操作地址
    @data      数据指针
*/
uint8_t FMC_FLASH_Read(u32 *data)
{
    uint32_t Address = ADDRSTART;
 
    *data = *( __IO uint32_t* ) Address;
	
    return 0;

}

/****************** usart0 print **************/

void usart0_init() // 初始化串口0
{
	/* enable COM GPIO clock */
	rcu_periph_clock_enable(RCU_GPIOA);  // 使能GPIOA时钟
	rcu_periph_clock_enable(RCU_GPIOB);  // 使能GPIOB时钟
	rcu_usart_clock_config(CK_APB2);
	rcu_periph_clock_enable(RCU_USART0);  // 使能串口0时钟
	
	/* connect port to USARTx_Tx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);

    /* connect port to USARTx_Rx */
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);
	
	/* configure USART Tx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
	
	/* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
	
	/*****  485 TX enable  ****/ //pin13--PB13	
	gpio_mode_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_13); //GPIO_OSPEED_2MHZ
	gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_13);
	gpio_bit_set(GPIOB,GPIO_PIN_13); //0-Rx  
	
	// 步骤1-7:
	usart_deinit(USART0);   //reset USART0
	usart_word_length_set(USART0,USART_WL_8BIT);  ///2、配置USART字长
	usart_stop_bit_set(USART0,USART_STB_1BIT);  ///3、配置USART停止位
	usart_parity_config(USART0, USART_PM_NONE);//4、奇偶校验位
	usart_baudrate_set(USART0,115200);  ///5、配置USART波特率
	usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);  // 6、USART发送配置
	usart_receive_config(USART0,USART_RECEIVE_ENABLE);
		
	usart_enable(USART0);//使能串口	
	
	// 在nvic中配置中断向量和中断优先级
	nvic_irq_enable(USART0_IRQn,1); //使能NVIC的中断
	// 使能USART子中断   
	usart_interrupt_enable(USART0,USART_INT_RBNE);
}

// 中断处理函数
void USART0_IRQHandler(void)
{	
	// 串口2外部给串口2发送了数据,就会进入下面这个中断,然后把数据读取到data里面
	if( RESET != usart_interrupt_flag_get(USART0,USART_INT_FLAG_RBNE) )// 发生中断,则返回RESET
	{
		 usart_data_receive(USART0); // 读取串口接收到的数据		
	}
	usart_interrupt_flag_clear(USART0,USART_INT_FLAG_ERR_FERR);

}

/* retarget the C library printf function to the USART */
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}

************ 版权所有,转载请注明出处 ************
共同监督,一起努力!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python Django的学生选课管理系统,实现多用户登录注册,可选课可评课

学生选课管理系统是一个基于Python Django开发的教务管理系统&#xff0c;旨在提供方便快捷的选课服务和学籍管理功能。该系统分为教师端和学生端两个角色&#xff0c;为教师和学生提供了不同的功能和权限。 教师端功能&#xff1a; 教师可以登录系统后&#xff0c;进行课程管…

如何在 Ubuntu 20.04 上安装 Nginx

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装 Nginx 介绍 Nginx是世界上最受欢迎的 Web 服务器之一&#xff0c;负责托管互联网…

【LeetCode-406】根据身高重建队列(贪心)

LeetCode406.根据身高重建队列 题目描述 题目链接 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于…

[C++]使用yolov8的onnx模型仅用opencv和bytetrack实现目标追踪

【官方框架地址】 yolov8: https://github.com/ultralytics/ultralytics bytetrack: https://github.com/ifzhang/ByteTrack 【算法介绍】 随着人工智能技术的不断发展&#xff0c;目标追踪已成为计算机视觉领域的重要研究方向。Yolov8和ByTetrack作为当前先进的算法&…

设计模式——1_6 代理(Proxy)

诗有可解不可解&#xff0c;若镜花水月勿泥其迹可也 —— 谢榛 文章目录 定义图纸一个例子&#xff1a;图片搜索器图片加载搜索器直接在Image添加组合他们 各种各样的代理远程代理&#xff1a;镜中月&#xff0c;水中花保护代理&#xff1a;对象也该有隐私引用代理&#xff1a;…

成熟的内外网数据交换方案,如何实现跨网传输?

网络迅速发展&#xff0c;我们可以从网络上查找到各式各样的信息&#xff0c;但是同时网络安全问题也随之严重。近几年&#xff0c;各种有关网络安全的新闻不断被报道&#xff0c;数据泄露给很多企业带来了严重打击&#xff0c;不仅是经济损失&#xff0c;严重者还会对企业的声…

二进制计算

二进制的引入 十进制规则:满10进1&#xff0c;由数字0到9组成。 而所谓十六进制&#xff0c;八进制&#xff0c;二进制的规则也是类似。 这里为了区分十六进制和八进制&#xff0c;十六进制前面会加上0x&#xff0c;八进制前面会加个0作为区分 而二进制的规则类似于十进制&…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

uniapp css样式穿透

目录 前言css样式穿透方法不加css样式穿透的代码加css样式穿透的代码不加css样式穿透的代码 与 加css样式穿透的代码 的差别参考 前言 略 css样式穿透方法 使用 /deep/ 进行css样式穿透 不加css样式穿透的代码 <style>div {background-color: #ddd;} </style>…

Go 虚拟环境管理工具 gvm 原理介绍与使用指南

本文谈下我对 Go 版本管理的一些想法。让后&#xff0c;我将介绍一个小工具&#xff0c;gvm。这个话题说起来也很简单&#xff0c;但如果想用的爽&#xff0c;还是要稍微梳理下。 背景介绍 Go 的版本管理&#xff0c;并非包的依赖管理&#xff0c;而且关于如何在不同的 Go 版…

一文读懂:D3.js的前世今生,以及与echarts的对比

D3.js&#xff08;Data-Driven Documents&#xff09;是一种用于创建动态、交互式数据可视化的JavaScript库。它通过使用HTML、CSS和SVG等Web标准&#xff0c;将数据与文档结合&#xff0c;使得数据可以以一种直观和易于理解的方式进行呈现。D3.js的重要性在于它赋予了开发者更…

vue3 中组合键 command+Enter / shift+Enter / alt + Enter 实现换行,详细实现

vue3 中组合键实现换行 需求背景 有一个聊天室功能&#xff0c;采用输入框的形式&#xff0c;输入完毕使用Enter&#xff0c;可以直接进行发送。使用一些组合键 比如 commandEnter / shiftEnter / alt Enter … 可以实现换行操作。但现实的情况是&#xff0c;原生 Enter 天然…

动静态库的理解、制作、使用。

一.动静态库的理解。 1.什么是库&#xff1f; 代码是无穷无尽的&#xff0c;当程序猿在写一些项目时&#xff0c;未必所有代码亲历亲为&#xff0c;他们可以在网上寻找大佬写过的一些有关需求的代码&#xff0c;这些代码可以让他们拿过来直接使用&#xff0c;而省去了许多精力…

【Vulnhub通关】Kioptrix:Level 1 (#1)

文章目录 准备工作靶机基本信息下载 渗透流程主机发现目标扫描服务探测HTTP(S)服务SMB文件共享服务 权限提升本次靶机测试到此结束 注意&#xff1a;本文转载自本人稀土掘金博客。博客地址&#xff1a;御坂19008号 的个人主页 - 动态 - 掘金 准备工作 靶机基本信息 靶机名称&a…

ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

最近需要做套接字通讯的工作&#xff0c;最好是有一个网络调试软件能够接受或者发送套接字&#xff0c;测试代码能够正常通讯。windows下有很多&#xff0c;但是linux下比较少&#xff0c;使用广泛的是下面这一款。 1、安装 首先从网盘&#xff08;链接: https://pan.baidu.c…

【JSON2WEB】02 JSON2WEB初步UI设计

JSON2WEB的UI初步设计&#xff0c;包括草图、登录、主页、导航树JSON2TREEE组件、表格JSON2GRID组件、表单JSON2FORM组件等。 1草图 表单作为抽屉从右边拉出。LOGO行和导航树为固定区域&#xff0c;导航树可以折叠。 2 登录页 找回账号&#xff1a;可以给邮箱&#xff08;找…

宝塔+nextcloud+docker+Onlyoffice 全开启https

折腾了我三天的经验分享 1.宝塔创建网站 nextcloud版本为28.0.1 php8.2 &#xff0c;导入nextcloud绑定域名对应的证书 &#xff0c;不用创建mysql 因为nextcloud 要求是mariadb:10.7 宝塔里没有&#xff0c;就用docker安装一个 端口设置为3307 将数据库文件映射出来/ww…

安卓开发之自动缩放布局

AutoScalingLayout 适用于 Android 的自动缩放布局。 替换布局&#xff1a; 我们只需要替换根布局所需的自动缩放&#xff0c;子布局也将实现自动缩放。 原始布局AutoScalingLayout相对布局ASRelativeLayout线性布局ASLinearLayoutFrameLayout&#xff08;框架布局&#xff…

Shell 虚拟机基线配置脚本示例

这是一个配置虚拟机基线的示例&#xff0c;包含关闭防火墙、禁用SElinux、设置时区、安装基础软件等。 这只是一个简单的模板&#xff0c;基线配置方面有很多&#xff0c;后续可以按照这个模板去逐步添加 代码示例 [rootbogon ~]# cat bastic.sh #!/bin/bashRED\E[1;31m GRE…

低功耗DC-DC电源模块的精细化PCB设计

在电子设备中&#xff0c;电源模块是核心组件&#xff0c;将输入直流电压转为设备所需的各种直流电压。DC-DC电源转换器&#xff0c;特别是基于开关方式的转换器&#xff0c;因其高效、小体积和轻重量等优点被广泛应用。但设计优秀的DC-DC电源转换器并不容易。布局、电磁兼容性…
最新文章