嵌入式实验3.docx
《嵌入式实验3.docx》由会员分享,可在线阅读,更多相关《嵌入式实验3.docx(20页珍藏版)》请在冰豆网上搜索。
嵌入式实验3
CVT6410定时器制作精确延时来控制LED
一、实验目的
1.熟悉RVDS2.2开发环境。
2.掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。
3.熟悉在ARM裸机环境下的C语言编程。
4.熟悉ARMv6的VIC控制以及S3C6410的timer控制器。
二、实验内容
建立RVDS开发环境。
利用定时器实现对开发板上发光二极管LED的跑马灯控制。
三、实验设备
1.硬件:
CVT6410教学实验箱、PC机;
2.软件:
PC机操作系统Windows98(2000、XP)+RVDS开发环境。
3.JLINK仿真器。
四、基础知识
从电路图上我们可以看到,发光二极管LED的一端连接到了ARM的GPIO,另一端经过一个限流电阻接电源VCC3。
当GPIO口为低电平时,LED两端产生电压降,这时LED有电流通过并发光。
反之当GPIO为高电平时,LED将熄灭。
注意亮灭之间要有一定的延时,以便人眼能够区分出来。
实验相应寄存器
端口配置寄存器
端口数据寄存器
端口上拉电路使能寄存器
实验电路
发光二极管LED的驱动电路参见“3.1CVT6410GPIO控制LED”的实验电路。
实验程序
init.s:
IMPORTMain
AREA|C$$code|,CODE,READONLY
globalstart
start
blMain
END
Main.c
//程序初始化
#definePCLK66000000//forS3C641066MHZ
#defineHCLK133000000//forS3C6410133MHZ
#definerTCFG0(*(volatileunsigned*)(0x7F006000))
#definerTCFG1(*(volatileunsigned*)(0x7F006004))
#definerTCON(*(volatileunsigned*)(0x7F006008))
#definerTCNTB0(*(volatileunsigned*)(0x7F00600C))
#definerTCMPB0(*(volatileunsigned*)(0x7F006010))
#definerTCNTO0(*(volatileunsigned*)(0x7F006014))
#definerTCNTB1(*(volatileunsigned*)(0x7F006018))
#definerTCMPB1(*(volatileunsigned*)(0x7F00601c))
#definerTCNTO1(*(volatileunsigned*)(0x7F006020))
#definerTCNTB2(*(volatileunsigned*)(0x7F006024))
#definerTCNTO2(*(volatileunsigned*)(0x7F00602c))
#definerTCNTB3(*(volatileunsigned*)(0x7F006030))
#definerTCNTO3(*(volatileunsigned*)(0x7F006038))
#definerTCNTB4(*(volatileunsigned*)(0x7F00603c))
#definerTCNTO4(*(volatileunsigned*)(0x7F006040))
#definerTINT_CSTAT(*(volatileunsigned*)(0x7F006044))
#defineU8unsignedchar
//Timer2做的一个us延时
voiduDelay(intusec)
{
//初始化LED的IO设置
unsignedintval=(PCLK)/1000000-1;
rTCFG0&=~(0xff<<8);
rTCFG0|=0<<8;
rTCFG1&=~(0xf<<8);
rTCFG1|=0<<8;
rTCNTB2=val;
rTCON&=~(0xf<<12);
rTCON|=0xb<<12;
rTCON&=~(2<<12);
while(usec--)
while(rTCNTO2>=val>>1);
while(rTCNTO2>1);
};
}
//循环延时
voidmsDelay(inttime)
volatileunsignedinti,j;
for(i=0;i<2000000;i++)
for(j=0;j}voidLedTest(void){volatileunsignedinti;*((U8*)0x3800B000)=0xff;uDelay(1000000);*((U8*)0x3800B000)=0x0;uDelay(1000000);//进入循环操作,LED灯轮流闪烁while(1){for(i=1;i<9;i++){*((U8*)0x3800B000)=1<<(i-1);uDelay(1000000);}}}voidMain(void){LedTest();}五、实验步骤1.准备好实验环境,将JLINK连接好。给开发板上电,使Bootloader停在菜单处。2.打开软件‘CodeWarriorforRVDS’,新建工程‘timerLed.mcp’,并添加两个程序文件‘main.c’和‘init.s’(汇编文件)。3.对工程文件进行相应设置4.编译该工程,成功后将生成映像文件‘timerLed.axf’。打开AXD,装载映像文件‘timerLed.axf’。5.运行程序,观察结果。六、实验结果四个LED轮流闪烁,实现流水灯控制。7、总结这次的实验是用定时器来控制流水灯的,通过定时器的定时时间来决定LED亮的时间,时间可快可慢。首先知道实验的电路知道定时器是怎么控制LED的,在看懂程序后运行,就会得出实验结果,改变程序中的时间可以改变LED亮的频率。CVT6410串口UART0实验一、实验目的1.熟悉RVDS2.2开发环境。2.掌握S3C6410内部相关寄存器的操作方法,最终实现对外部设备的控制。3.熟悉在ARM裸机环境下的C语言编程。4.熟悉S3C6410的串口编程。二、实验内容建立RVDS开发环境。学习并编程实现ARM的UART通讯。三、实验设备1.硬件:CVT6410教学实验箱、PC机;2.软件:PC机操作系统Windows98(2000、XP)+RVDS开发环境。3.JLINK仿真器。四、基础知识串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA与TTL电平转换器以及地址译码电路组成。采用的通信协议有两类:异步协议和同步协议。随着大规模集成电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,它们的基本功能是类似的。采用这些芯片作为串行通信接口电路的核心芯片,会使电路结构比较简单。下面介绍了异步串行通信的基本原理、串行接口的物理层标准以及S3C6410串行口控制器。1.异步串行通信异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。图3-1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600等。图3-1串行通信字符格式2.串行接口的物理层标准通用的串行I/O接口有许多种,现就最常见的两种标准作简单介绍。1)EIARS-232C这是美国电子工业协会推荐的一种标准(ElectronicindustriesAssociationRecoil-mendedStandard)。它在一种25针接插件(DB-25)上定义了串行通信的有关信号。这个标准后来被世界各国所接受并使用到计算机的I/O接口中。在实际异步串行通信中,并不要求用全部的RS-232C信号,许多PC/XT兼容机仅用15针接插件(DB-15)来引出其异步串行I/O信号,而PC中更是大量采用9针接插件(DB-9)来担当此任。图3-2分别给出了DB-25和DB-9的引脚定义,表3-3列出了引脚的名称以及简要说明。图3-2DB-25和DB-9引脚定义表3-3引脚说明:引脚名称全称说明FGFrameGround连到机器的接地线TXDTransmittedData数据输出线RXDReceivedData数据输入线RTSRequesttoSend要求发送数据CTSCleartoSend回应对方发送的RTS的发送许可,告诉对方可以发送DSRDataSetReady告知本机在待命状态DTRDataTerminalReady告知数据终端处于待命状态CDCarrierDetect载波检出,用以确认是否收到Modem的载波SGSignalGround信号线的接地线(严格的说是信号线的零标准线)图3-4给出了两台微机利用RS-232C接口通信的两种基本连接方式。简单连接完全连接图5-5RS-232连线图2)信号电平规定RS-232C规定了双极性的信号逻辑电平,它是一套负逻辑定义:-3V到-25V之间的电平表示逻辑“1”。+3V到+25V之间的电平表示逻辑“0”。以上标准称为EIA电平。PC/XT系列使用的信号电平是-12V和+12V,符合EIA标准,但在计算机内部流动的信号都是TTL电平,因此这中间需要用电平转换电路。常用专门的RS-232接口芯片,如SP3232、SP3220等,在TTL电平和EIA电平之间实现相互转换。PC/XT系列以这种方式进行串行通信时,在波特率不高于9600的情况下,理论上通信线的长度限制为15米。实验相应寄存器实验电路实验程序/*******************************************************************///程序名:UART.C//功能:串口接收和打印字符信息/*******************************************************************/#include"6410addr.h"#include"typdef.h"#include#include#include#include#include#definePCLK66000000U16UDIVSLOT_DATA[16]={0x0000,0x0080,0x0808,0x0888,0x2222,0x4924,0x4A52,0x54AA,0x5555,0xD555,0xD5D5,0xDDD5,0xDDDD,0xDFDD,0xDFDF,0xFFDF};/******************************************************************///程序名:GPIO_Config()//功能:配置GPIO为串口模式//参数:无//返回值:无//备注:/******************************************************************/voidGPIO_Config(){//PORTAGROUP//BIT[31:28][27:24][23:20][19:16][15:12][11:8][7:4][3:0]//CONFIG00100010001000100010001000100010//FunctionRTSn1CTSn1RTXD1RXD1RTSn0CTSn0TXD0RXD0rGPACON=0x22222222;rGPAPUD=0x00;//上下拉电阻禁止}/*****************************************************************///程序名:UartInit()//功能:串口初始化//参数:无//返回值:无//备注:这里只对串口0进行初始化/*****************************************************************//*voidUartInit(intch,intbaud){inta;U8temp;floatx;if(!ch){if(!ch){rULCON0=0x03;//正常模式无奇偶校验,一个停止位,8个数据位rUCON0=0x885;//时钟源采用PCLK,中断为脉冲方式,不产生接收错误状态中断,发射接收均为正常模式rUFCON0=0x0;//FIFO禁止rUMCON0=0x0;//FIFO禁止,nRTS无效rUBRDIV0=(PCLK/(baud*16)-1);//DIV_VAL=(PCLK/(bpsx16))-1;UBRDIV0是DIV_VAL的整数部分,PCLK初始化为66MHzx=(float)((PCLK/(baud*16)-1)%1);a=(int)(x*16);rUDIVSLOT0=UDIVSLOT_DATA[a];temp=rURXH0;}else{rULCON1=0x03;//正常模式无奇偶校验,一个停止位,8个数据位rUCON1=0x885;//时钟源采用PCLK,中断为脉冲方式,不产生接收错误状态中断,发射接收均为正常模式rUFCON1=0x0;//FIFO禁止rUMCON1=0x0;//FIFO禁止,nRTS无效rUBRDIV1=(PCLK/(baud*16)-1);//DIV_VAL=(PCLK/(bpsx16))-1;UBRDIV0是DIV_VAL的整数部分,PCLK初始化为66MHzx=(float)((PCLK/(baud*16)-1)%1);a=(int)(x*16);rUDIVSLOT1=UDIVSLOT_DATA[a];temp=rURXH1;}}}*/voidUartInit(void){U8temp;rULCON0=0x03;//正常模式无奇偶校验,一个停止位,8个数据位rUCON0=0x885;//时钟源采用PCLK,中断为脉冲方式,不产生接收错误状态中断,发射接收均为正常模式rUFCON0=0x0;//FIFO禁止rUMCON0=0x0;//FIFO禁止,nRTS无效rUBRDIV0=0x22;rUDIVSLOT0=0xDFDD;temp=rURXH0;//将接收到的数据赋给temp}voidDelay(intt)//延时一小段时间{while(t--);}/*****************************************************************///程序名:voidUartSend()//功能串口0发送数据//参数data//返回值:无/*****************************************************************/voidUartSend(chardata)//串口0发射数据,开发板只用到串口0{if(data=='\r')//判断是否为回车键{while(!(rUTRSTAT0&0x2));Delay(100);rUTXH0='\n';//如果是回车则换行}while(!(rUTRSTAT0&0x2));Delay(100);rUTXH0=data;}/*****************************************************************///程序名:chargetch()//功能串口0接收数据//参数无//返回值:rURXH0/*****************************************************************/chargetch(void){while(!(rUTRSTAT0&0x1));//等待直到接受到一个数据returnrURXH0;}/*****************************************************************///程序名:Uart_SendString()//功能串口发送字符//参数无//返回值:无/*****************************************************************/voidUart_SendString(char*pt){while(*pt)UartSend(*pt++);}/*****************************************************************///程序名:Uart_Printf()//功能串口发送字符//参数无//返回值:无/*****************************************************************/voidUart_Printf(char*fmt,...){va_listap;charstring[256];va_start(ap,fmt);vsprintf(string,fmt,ap);Uart_SendString(string);va_end(ap);}voidmain(void){U8buff;GPIO_Config();UartInit();Uart_Printf("\n准备就绪,现在开始测试串口,请输入字符:");while(1){buff=getch();Delay(1000);UartSend(buff);}}五、实验步骤1.准备好实验环境,将JLINK连接好。给开发板上电,使Bootloader停在菜单处。2.打开软件‘CodeWarriorforRVDS’,新建工程‘uart.mcp’,并添加程序文件‘uart.c’以及若干文件。3.对工程文件进行相应设置4.编译该工程,成功后将生成映像文件‘uart.axf’。打开AXD,装载映像文件‘uart.axf’。5.运行程序,观察结果。六、实验结果在超级终端中,实现打印。如下图:7、总结这次的实验是串口通信的实验,首先了解实验的电路,在读懂实验程序的情况运行,成功后打开终端输入你要发送的信息,可以看到在终端窗口上接受到你发送的信息,这样就表明串口测试时成功的。
voidLedTest(void)
volatileunsignedinti;
*((U8*)0x3800B000)=0xff;
uDelay(1000000);
*((U8*)0x3800B000)=0x0;
//进入循环操作,LED灯轮流闪烁
while
(1)
for(i=1;i<9;i++)
*((U8*)0x3800B000)=1<<(i-1);
voidMain(void)
LedTest();
五、实验步骤
1.准备好实验环境,将JLINK连接好。
给开发板上电,使Bootloader停在菜单处。
2.打开软件‘CodeWarriorforRVDS’,新建工程‘timerLed.mcp’,并添加两个程序文件‘main.c’和‘init.s’(汇编文件)。
3.对工程文件进行相应设置
4.编译该工程,成功后将生成映像文件‘timerLed.axf’。
打开AXD,装载映像文件‘timerLed.axf’。
5.运行程序,观察结果。
六、实验结果
四个LED轮流闪烁,实现流水灯控制。
7、总结
这次的实验是用定时器来控制流水灯的,通过定时器的定时时间来决定LED亮的时间,时间可快可慢。
首先知道实验的电路知道定时器是怎么控制LED的,在看懂程序后运行,就会得出实验结果,改变程序中的时间可以改变LED亮的频率。
CVT6410串口UART0实验
4.熟悉S3C6410的串口编程。
学习并编程实现ARM的UART通讯。
串行通信接口电路一般由可编程的串行接口芯片、波特率发生器、EIA与TTL电平转换器以及地址译码电路组成。
采用的通信协议有两类:
异步协议和同步协议。
随着大规模集成电路技术的发展,通用的同步(USRT)和异步(UART)接口芯片种类越来越多,它们的基本功能是类似的。
采用这些芯片作为串行通信接口电路的核心芯片,会使电路结构比较简单。
下面介绍了异步串行通信的基本原理、串行接口的物理层标准以及S3C6410串行口控制器。
1.异步串行通信
异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图3-1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
每一个数据位的宽度等于传送波特率的倒数。
微机异步串行通信中,常用的波特率为110,150,300,600,1200,2400,4800,9600等。
图3-1串行通信字符格式
2.串行接口的物理层标准
通用的串行I/O接口有许多种,现就最常见的两种标准作简单介绍。
1)EIARS-232C
这是美国电子工业协会推荐的一种标准(ElectronicindustriesAssociationRecoil-mendedStandard)。
它在一种25针接插件(DB-25)上定义了串行通信的有关信号。
这个标准后来被世界各国所接受并使用到计算机的I/O接口中。
在实际异步串行通信中,并不要求用全部的RS-232C信号,许多PC/XT兼容机仅用15针接插件(DB-15)来引出其异步串行I/O信号,而PC中更是大量采用9针接插件(DB-9)来担当此任。
图3-2分别给出了DB-25和DB-9的引脚定义,表3-3列出了引脚的名称以及简要说明。
图3-2DB-25和DB-9引脚定义
表3-3引脚说明:
引脚名称
全称
说明
FG
FrameGround
连到机器的接地线
TXD
TransmittedData
数据输出线
RXD
ReceivedData
数据输入线
RTS
RequesttoSend
要求发送数据
CTS
CleartoSend
回应对方发送的RTS的发送许可,告诉对方可以发送
DSR
DataSetReady
告知本机在待命状态
DTR
DataTerminalReady
告知数据终端处于待命状态
CD
CarrierDetect
载波检出,用以确认是否收到Modem的载波
SG
SignalGround
信号线的接地线(严格的说是信号线的零标准线)
图3-4给出了两台微机利用RS-232C接口通信的两种基本连接方式。
简单连接
完全连接
图5-5RS-232连线图
2)信号电平规定
RS-232C规定了双极性的信号逻辑电平,它是一套负逻辑定义:
-3V到-25V之间的电平表示逻辑“1”。
+3V到+25V之间的电平表示逻辑“0”。
以上标准称为EIA电平。
PC/XT系列使用的信号电平是-12V和+12V,符合EIA标准,但在计算机内部流动的信号都是TTL电平,因此这中间需要用电平转换电路。
常用专门的RS-232接口芯片,如SP3232、SP3220等,在TTL电平和EIA电平之间实现相互转换。
PC/XT系列以这种方式进行串行通信时,在波特率不高于9600的情况下,理论上通信线的长度限制为15米。
/*******************************************************************/
//程序名:
UART.C
//功能:
串口接收和打印字符信息
#include"6410addr.h"
#include"typdef.h"
#include
#definePCLK66000000
U16UDIVSLOT_DATA[16]=
0x0000,0x0080,0x0808,0x0888,0x2222,0x4924,0x4A52,0x54AA,
0x5555,0xD555,0xD5D5,0xDDD5,0xDDDD,0xDFDD,0xDFDF,0xFFDF
/******************************************************************/
GPIO_Config()
//功能:
配置GPIO为串口模式
//参数:
无
//返回值:
//备注:
voidGPIO_Config()
//PORTAGROUP
//BIT[31:
28][27:
24][23:
20][19:
16][15:
12][11:
8][7:
4][3:
0]
//CONFIG00100010001000100010001000100010
//FunctionRTSn1CTSn1RTXD1RXD1RTSn0CTSn0TXD0RXD0
rGPACON=0x22222222;
rGPAPUD=0x00;//上下拉电阻禁止
/*****************************************************************/
//程序名:
UartInit()
串口初始化
这里只对串口0进行初始化
/*voidUartInit(intch,intbaud)
inta;
U8temp;
floatx;
if(!
ch)
rULCON0=0x03;//正常模式无奇偶校验,一个停止位,8个数据位
rUCON0=0x885;//时钟源采用PCLK,中断为脉冲方式,不产生接收错误状态中断,发射接收均为正常模式
rUFCON0=0x0;//FIFO禁止
rUMCON0=0x0;//FIFO禁止,nRTS无效
rUBRDIV0=(PCLK/(baud*16)-1);//DIV_VAL=(PCLK/(bpsx16))-1;UBRDIV0是DIV_VAL的整数部分,PCLK初始化为66MHz
x=(float)((PCLK/(baud*16)-1)%1);
a=(int)(x*16);
rUDIVSLOT0=UDIVSLOT_DATA[a];
temp=rURXH0;
else
rULCON1=0x03;//正常模式无奇偶校验,一个停止位,8个数据位
rUCON1=0x885;//时钟源采用PCLK,中断为脉冲方式,不产生接收错误状态中断,发射接收均为正常模式
rUFCON1=0x0;//FIFO禁止
rUMCON1=0x0;//FIFO禁止,nRTS无效
rUBRDIV1=(PCLK/(baud*16)-1);//DIV_VAL=(PCLK/(bpsx16))-1;UBRDIV0是DIV_VAL的整数部分,PCLK初始化为66MHz
rUDIVSLOT1=UDIVSLOT_DATA[a];
temp=rURXH1;
}*/
voidUartInit(void)
rUBRDIV0=0x22;
rUDIVSLOT0=0xDFDD;
temp=rURXH0;//将接收到的数据赋给temp
voidDelay(intt)//延时一小段时间
while(t--);
voidUartSend()
//功能串口0发送数据
//参数data
voidUartSend(chardata)//串口0发射数据,开发板只用到串口0
if(data=='\r')//判断是否为回车键
while(!
(rUTRSTAT0&0x2));
Delay(100);
rUTXH0='\n';//如果是回车则换行
rUTXH0=data;
chargetch()
//功能串口0接收数据
//参数无
rURXH0
chargetch(void)
(rUTRSTAT0&0x1));//等待直到接受到一个数据
returnrURXH0;
Uart_SendString()
//功能串口发送字符
voidUart_SendString(char*pt)
while(*pt)
UartSend(*pt++);
Uart_Printf()
voidUart_Printf(char*fmt,...)
va_listap;
charstring[256];
va_start(ap,fmt);
vsprintf(string,fmt,ap);
Uart_SendString(string);
va_end(ap);
voidmain(void)
U8buff;
GPIO_Config();
UartInit();
Uart_Printf("\n准备就绪,现在开始测试串口,请输入字符:
");
buff=getch();
Delay(1000);
UartSend(buff);
2.打开软件‘CodeWarriorforRVDS’,新建工程‘uart.mcp’,并添加程序文件‘uart.c’以及若干文件。
4.编译该工程,成功后将生成映像文件‘uart.axf’。
打开AXD,装载映像文件‘uart.axf’。
在超级终端中,实现打印。
如下图:
这次的实验是串口通信的实验,首先了解实验的电路,在读懂实验程序的情况运行,成功后打开终端输入你要发送的信息,可以看到在终端窗口上接受到你发送的信息,这样就表明串口测试时成功的。
下载文档到电脑,查找使用更方便
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1