版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、STM32-USB使用方法开发板买的是奋斗 mini开发板,芯片是:STM32F103VET6. 要程序。如果需要源程序 keil4-arm 工程,上位机vb。加qq339396264USB开发涉及主机和设备,为了避免开发驱动程序,使用Windows自带的驱动程序。所以设备枚举成 HID类设备。USB鼠标就是标准的 USB-HID设备。不过操作系统阻止了应用程序直接访问 USB鼠标返回的报告。 所以本例使用自定义 HID 设备。一来免去了开发驱动程序,二来自定义的HID设备应用程序和设备可以自由收发数据(仅指数据内容)本文主要介绍STM32的USB模块的简单使用,不会介绍USB协议。主要是介绍
2、一下 STM32F103的USB模块使用。USB模块从初始化首先是配置和使能时钟F面是时钟的初始化:void Set_USBClock(void) /RCC_USBCLKSource_PLLCLK_1Div5 表示【USB 时钟 =PLL 时钟除以 1.5】【72/1.5=48MHz 】RCC_USBCLKConfig(RCC_USBCLKSource_ PLLCLK_1Div5);RCC_APB1PenphClockCmd(RCC_APB1Penph_USB, ENABLE);/【使能配置好了的 USB 时钟】首先系统时钟要设置为 72MHz,然后配置USB时钟为48MHz并使能。然后是配置
3、中断void USB_Interru pts_Config(void) #define USB LP CAN1 RX0 IRQn 20NVIC_lnitT yp eDef NVIC_lnitStructure;/【使能USB中断】NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; /【USB 低优先级中断】NVIC_InitStructure.NVIC_IRQChannel Preem ption Priority = 0; NVIC_InitStructure.NVIC_IRQChannelSub Priority = 0;N
4、VIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init (&N VIC_InitStructure);然后初始化模块的一些寄存器USART_send_str("USB 断开 rn");1.5K上拉电阻 连接 rn");USB_DISCONNECT/这是断开1.5k上拉电阻 delay(0x7AFFFF);/ 延时一会 USB_CONNECT/ 使能USART_se nd_str("USBDADDR = 0x0080;/USB模块使能位。EF必须置1CNTR = 0x0001;/ 强制复位CN
5、TR = 0x0000;/ 退出复位ISTR = 0x0000;/清除可能产生的假中断CNTR = (I_CTR | I_RESET);/使能一些中断,为了简单这里只使能了【总线复位中断】和【数据正确传输中断】ISTR = 0x0000;/清除可能产生的假中断自此USB模块初始化完毕。以后的流程就在USB中断的驱动下执行。USB中断函数:void USB_LP_CAN1_RX0_IRQHa ndler(void)u16 wistr;/USB中断状态寄存器wIstr = (u16)ISTR;/【USB复位中断】 if(wIstr & I_RESET) USB_RST_ Process。;
6、 return;【正确传输中断】/if (wIstr & I_CTR)USB_CTR_ Process。; return;USB中断函数中就是判断中断源,并转向相应的中断服务函数。USB总线复位后,USB相关的一些寄存器会复位。在void USB_RST_ Process(void)/清除中断ISTR = (u16)(I_RESET);/ 清除 ISTR 寄存器中断USB总线复位中要配置一下寄存器和数据收发的缓冲区。程序如下RESET位。写0清除,写1寄存器位内容不变。/USART_send_str(”【USB 】【复】【位】【中】【断】rn “);usb_status = 0;复位处
7、理DADDR = 0x0080;BTABLE = 0;EP 0REG = (u16)(0x0220);/USB模块使能位。EF必须置1/复位后默认为0/0000 0010 0010 0000 端点 0 初始化:控制端点,NAK主机的IN令牌,端点号0设置TX/RX起始地址USB_ADDR0_TX = 32;/32-95端点0的发送缓冲区从 32开始到USB_ADDR0_RX = 96;/96-159端点0的接收缓冲区从 96开始到95,共64字节159,共64字节设置端点0接收缓冲区大小:64ByteUSB_CNT0_RX = 0x8400;/1000,0100,0000,0000/【端点1】
8、EP 1REG = (u16)(0x0621);/0000 0110 0010 0001 端点 0 初始化:中断端点,NAK主机的IN令牌,端点号1223,共64字节287,共64字节设置TX/RX起始地址USB_ADDR1_TX = 160;/160-223USB_ADDR1_RX = 224;/224-287端点1的发送缓冲区从160开始到 端点1的接收缓冲区从224开始到设置端点1接收缓冲区大小:64ByteUSB_CNT1_RX = 0x8400;/1000,0100,0000,0000设置RX Valid .端点0可用于接收由于t位写0不影响原来的值,写 1翻转,所以把t位都设置为0
9、 由于w0位写0清除,写1无影响,所以w0位都设置为1SRAT_RX1:0设置为1,通过写1翻转来实现。U16 t = EP0REG;/读出端点0寄存器值 t &= 0x8F8F;/1000 1111 1000 1111 t |= 0x8080;/1000 0000 1000 0000 t |= 0x3000;/0011 0000 0000 0000 EP 0REG = t;下面是正确传输中断/USB分组正确传输处理void USB_CTR_ Process(void)端点 0 】*/*if(ISTR & 0x0F) = 0)/ 端点 0 if(ISTR & 0x10)
10、 = 0)/i n分组/USART_se nd_str("*端点0的IN分组发送完成*“n");/if(usb_status = 1)usb_status = 2;DADDR = 0x80 | (usb_addr&0xFF);/设置地址一定要找控制传输的状态完成后写入地址寄存器 USART_send_str(”rn【写入地址完成】rn");/发送剩余数据USB_e p0_se nd();清除 CTR_TX u16 t = EP 0REG;t &= 0x8F8F;/1000 1111 1000 1111t |= 0x8080;/1000 0000 1
11、000 0000 把 w0 位都设置为 1t &= 0xFF7F;/1111 1111 0111 1111EP 0REG = t;把t位都设置为0把CTR_TX设置为0,清除CTR_RX位if(ISTR & 0x10)/【OUT 】分组 or【SETUP 】分组u16 ep0r= EP 0REG;/清除 CTR_RXu16 t = EP 0REG;t &= 0x8F8F;/1000 1111 1000 1111 t |= 0x8080;/1000 0000 1000 0000t &= 0x7FFF;/0111 1111 1111 1111 EP 0REG = t
12、;把t位都设置为0把w0位都设置为1把CTR_RX设置为0,清除CTR_RX位if(ep0r & 0x0800)/SET UP 令牌包USART_send_str(” 端点 0 收到【SETUP】分组 rn");默认控制端点处理一一枚举处理ep0 _set up _Process();memset(USB_rcv_buffer, 0x00, sizeof(USB_rcv_buffer);USB_e nable_e p0_rx(); elseUSART_send_str(”控制读传输:状态阶段 rn");USB_read_E P0_buf(USB_rcv_buffer
13、, (u32*)( PM AAddr+96*2);USB_e nable_e p0_rx();/else/【IN分组传输成功】/*端点 1 】*/else if(ISTR & 0x0F) = 1)USART_send_str(”端点1数据完成传输rn");if(ISTR & 0x10)/ OUT 分组】清除 CTR_RXu16 t = EP 1REG;t &= 0x8F8F;/1000 1111 1000 1111 t |= 0x8080;/1000 0000 1000 0000t &= 0x7FFF;/0111 1111 1111 1111 EP 1
14、REG = t;把t位都设置为0把w0位都设置为1把CTR_RX设置为0,清除CTR_RX位USB_read_E P1_buf(USB_rcv_buffer, (u32*)( PM AAddr+224*2);/USB_e nable_e p1_rx(); else/ IN分组】/【读取】端点【处 理】端点【继续接受】端点1数据1数据1数据清除 CTR_TX把t位都设置为0t |= 0x8080;/1000 0000 1000 0000 把 w0 位都设置为 1把CTR_TX设置为0,清除CTR_RX位u16 t = EP 1REG;t &= 0x8F8F;/1000 1111 1000
15、 1111 t &= 0xFF7F;/1111 1111 0111 1111EP 1REG = t;/标记发送完成/*端点 ERR 】*/elseUSART_send_str(”出错!端点号是没有开启对端点。rn");其他代码:设置RX Valid .使端点继续接收 void USB_e nable_e p0 _rx(void)u16 t = EP OREG;/USART_se nd_str("E POREG = ”);USART_se nd_HEX(t>>8);USART_se nd_HEX(t&O xff);USART_se nd_str(&
16、quot;rn");t &= 0x8F8F;/1000 1111 1000 1111 把 t 位都设置为 0t |= 0x8080;/1000 0000 1000 0000 把 w0 位都设置为 1switch(E P0REG & 0x3000)case 0x0000: t |= 0x3000;break;case 0x1000: t |= 0x2000;break;case 0x2000: t |= 0x1000;break;case 0x3000: t |= 0x0000;break; EP 0REG = t;/t = EP 0REG;USART_se nd_st
17、r("E P0REG = ");USART_se nd_HEX(t>>8);USART_se nd_HEX(t&0 xff);USART_se nd_str("rn");/设置RX Valid .使端点继续接收 void USB_e nable_e p1_rx(void) u16 t = EP 1REG;t &= 0x8F8F;/1000 1111 1000 1111 把 t 位都设置为 0t |= 0x8080;/1000 0000 1000 0000 把 w0 位都设置为 1switch(E P1REG & 0x3
18、000)case 0x0000: t |= 0x3000;break; case 0x1000: t |= 0x2000;break;case 0x2000: t |= 0x1000;break;case 0x3000: t |= 0x0000;break;EP 1REG = t;/读取端点0收到的数据u8 USB_read_E P0_buf(u8 *buf, u32 *USB_buf) u16 rcv_num; u8 read_c nt; u8 i;u16 temp; u8 j = 0;/接收到的数据rcv_n um = USB_CNT0_RX & 0x03FF;/un sig ne
19、d char s32 = 0;sprintf(char*)s,"端点 0 读取【d】字节数据:",rcv_num);USART_se nd_str(s);USART_se nd_str("rnrn “);/读取次数read_c nt = (rcv_nu m+1)>>1;for(i=0;i<read_c nt;i+) temp = *USB_buf+; bufj+ = temp & OxFF; bufj+ = temp >> 8;/for(i=0;i<j;i+)/USART_se nd_HEX(bufi); if(i+1)
20、%16 = 0)USART_se nd_str(”r n");/USART_se nd_str("rnrnrn ”);return(j);/读取端点1收到的数据u8 USB_read_E P1_buf(u8 *buf, u32 *USB_buf) u16 rcv_ num;u8 read_c nt;u8 i;u16 temp;u8 j = 0;/接收到的数据rcv_num = USB_CNT1_RX & 0x03FF;un sig ned char s32 = 0;sprintf(char*)s,"【端点1】读取【d】字节数据:",rcv_num
21、);USART_se nd_str(s);USART_se nd_str("rnrn");/读取次数read_c nt = (rcv_ nu m+1)>>1;for(i=0;i<read_c nt;i+)temp = *USB_buf+; bufj+ = temp & 0xFF; bufj+ = temp >> 8;for(i=0;i<j;i+)USART_se nd_HEX(bufi); if(i+1)%16 = 0)USART_se nd_str(”r n");USART_se nd_str("rnrnrn
22、");return(j);/通过端点0发送数据void USB_write_E P0_buf(u8 *buf, u32 *USB_buf, u8 len) u8 send_cnt;u8 i;u8 j = 0;u16 h,l;/un sig ned char s32 = 0;sprintf(char*)s,"端点0发送【d】字节数据:",len);USART_se nd_str(s);USART_se nd_str("r n+ +r n");/for(i=0;i<le n;i+)/USART_se nd_HEX(bufi); if(i+1)
23、%16 = 0)USART_se nd_str(”r n");/USART_se nd_str("r n+r nrn “);II发送次数send_cnt = (le n+1) >> 1;for(i=0;i<se nd_cn t;i+) l = bufj+;h = bufj+<<8; *USB_buf = (h|l); USB_buf+;/要发送数据的长度USB_CNT0_TX = len;/使能发送:设置VALIDu16 t = EP 0REG;t &= 0x8F8F;/1000 1111 1000 1111 把 t 位都设置为 0t
24、|= 0x8080;/1000 0000 1000 0000 把 w0 位都设置为 1 switch(E P0REG & 0x0030)case 0x0000: t |= 0x0030;break;case 0x0010: t |= 0x0020;break;case 0x0020: t |= 0x0010;break;case 0x0030: t |= 0x0000;break; EP 0REG = t;通过端点1发送数据void USB_write_E P1_buf(u8 *buf, u32 *USB_buf, u8 len) u8 send_cnt;u8 i;u8 j = 0;u
25、16 h,l;un sig ned char s32 = 0;sprintf(char*)s,"端点1发送【d】字节数据:",len);USART_se nd_str(s);USART_se nd_str("r n+ +r n");for(i=0;i<le n;i+)USART_se nd_HEX(bufi);if(i+1)%16 = 0)USART_se nd_str(”r n");USART_se nd_str("r n+r nrn “);/发送次数send_cnt = (le n+1) >> 1;for(i=0
26、;i<se nd_cn t;i+) l = bufj+;h = bufj+<<8; *USB_buf = (h|l); USB_buf+;/要发送数据的长度USB_CNT1_TX = len;/使能发送:设置 VALIDu16 t = EP 1REG;t &= 0x8F8F;/1000 1111 1000 1111 把 t 位都设置为 0t |= 0x8080;/1000 0000 1000 0000 把 w0 位都设置为 1 switch(E P1REG & 0x0030)case 0x0000: t |= 0x0030;break;case 0x0010:
27、 t |= 0x0020;break;case 0x0020: t |= 0x0010;break;case 0x0030: t |= 0x0000;break; EP 1REG = t;/发送数据给主机,提供端点0void USB_e p0_sen d(void)if(send_len_ep0 > dev_d7)/如果需要发送数据长度大于端点0的最大长度:分包发送USB_write_E PO_buf(p_se nd_epO, (u32*)( PM AAddr+32*2), dev_d7); sen d_le n_ep0 -= dev_d7;p_send_ep0 += dev_d7;el
28、se/需要发送的数据长度小于等于端点0的最大包长if(send_len_ep0 != 0)/ 一次能够发送完成USB_write_E P0_buf(p_se nd_ep0, (u32*)( PM AAddr+32*2), sen d_len_e p0); sen d_le n_ep0 = 0;else/等于 0if(n eed_0_ pack_e p0 = 1)n eed_ 0_p ack_e p0 =0;USB_write_E P0_buf(p_se nd_ep0, (u32*)( PM AAddr+32*2), 0);端点0枚举过程处理void ep0 _set up_Pro cess(v
29、oid)/读取接收到的数据USB_read_E P0_buf(USB_rcv_bufer, (u32*)( PM AAddr+96*2);req_ty pe = USB_rcv_buferO;req = USB_rcv_buffer1;w_value = (USB_rcv_buffer3<<8) | USB_rcv_buffer2; w_i ndex = (USB_rcv_bufer5<<8) | USB_rcv_buffer4; w_le ngth = (USB_rcv_buffer7<<8) | USB_rcv_buffer6;if(req_type &
30、amp; 0x80)/ 输入请求switch(req_type>>5) & 0x03)/ 请求的类型case 0:/标准请求省略了对“请求的接收者”的判断/USART_send_str("USB 标准输入请求:”);switch(req)/标准请求代码case 0:/获取状态/USART_send_str(” 获取状态 rn");break;case 6:/获取描述符”);/USART_send_str(” 获取描述符switch(w_value>>8) & 0xFF)/ 描述符类型case 1:/设备描述符/USART_send_s
31、tr(” 设备描述符 rn");p_se nd_epO = (u8*)dev_d;/ 设备描述符数组if(w_length > dev_d0)/如果请求的数据大于描述符长度,返回描述符长度最大长度 se nd_len_e p0 = dev_d0;/18if(se nd_len_e p0 % dev_d7) = 0)need_0_pack_ep0 = 1;/是包长的整数倍,需要发送0长度数据包else/请求长度小于等于描述符长度,则返回请求长度sen d_le n_ep0 = w_le ngth;USB_e p0_sen d();break;case 2:/配置描述符/USART
32、_send_str(” 配置描述符 rn");p_send_ep0 = (u8*)cfg_d;/ 设备描述符数组send_len_ep0 = (cfg_d3<<8) | cfg_d2;/ 发送长度等于配置集合长度if(w_length > send_len_ep0)/如果请求的数据大于端点0,if(se nd_len_e p0 % dev_d7) = 0)n eed_0_ pack_e p0 = 1;/是包长的整数倍,需要发送else/请求小于等于端点0,返回请求长度sen d_le n_ep0 = w_len gth;返回端点0最大长度0长度数据包USB_e p0
33、_se nd();break;case 3:/字符串描述符/USART_send_str(” 字符串描述符 rn");break;case 0x22:/报告描述符/USART_send_str(” 报告描述符 rn");p_send_ep0 = (u8*)r pt_d; sen d_le n_ep0 = sizeof(r pt_d);if(w_length > send_len_ep0)/如果请求的长度大于实际长度if(se nd_len_e p0 % dev_d7) = 0)n eed_0_ pack_e p0 = 1;/是包长的整数倍,需要发送else0长度数据包
34、se nd_len_e p0 = w_le ngth;/返回长度等于请求长度USB_e p0_se nd();break;default:/其他描述符/USART_send_str(” 其他描述符:”);USART_se nd_HEX(w_value>>8)&0xFF);USART_se nd_str("rn");break;break;case 8:获取配置/USART_send_str(” 获取配置 rn");break;case 10:/获取接口/USART_send_str(” 获取接口 rn");break;case 12:
35、/帧同步/USART_send_str(” 帧同步 rn");break;default:/USART_send_str("USB 未定义输入请求 rrr);break; break;case 1:/类请求/USART_send_str("USB 类输入请求 rn");break;case 2:/厂商请求/USART_send_str(” 厂商输入请求 rrr);break;case 3:/保留/USART_send_str("USB 输入请求:保留 rrr);break;出请*/else/* switch(req_type>>5)
36、 & 0x03)/ 请求的类型case 0:/标准请求省略了对“请求的接收者”的判断/USART_send_str("USB 标准输出请求:”);switch(req)/标准请求代码【GET】case 1:/清除特性/USART_send_str(” 清除特性 rn");sen d_le n_epO = 0; need_0_pack_epO =1;USB_e pO_se nd();/ 发送数据 break;case 5:/设置地址USART_send_str(” 设置地址 rrr);/USART_se nd_HEX(w_value&0xFF);/USART_
37、se nd_str("rn");usb_status = 1;/表示主机设置了地址 usb_addr = w_value & 0xFF;sen d_le n_epO = 0; need_0_pack_epO =1;USB_e pO_se nd();/ 发送数据 break;case 9:/设置配置USART_send_str(” 设置配置 rrr);设置RX Valid .【端点1】可用于接收u16 t = EP 1REG;把t位都设置为0把w0位都设置为1把 SRAT_RX1:0设置为 1t &= 0x8F8F;/1000 1111 1000 1111t
38、|= 0x8080;/1000 0000 1000 0000t |= 0x3000;/0011 0000 0000 0000 EP 1REG = t;sen d_le n_ep0 = 0;need_0_pack_ep0 =1;USB_e p0_se nd();/发送剩余数据 usb_status = 3;case 7:/设置描述符/USART_send_str(” 设置描述符 rn");break;case 3:/设置特性/USART_send_str(” 设置特性 rn");break;case 11:/设置接口/USART_send_str(” 设置接口 rn"
39、;);break;default:/ 出错/USART_send_str(”标准输出请求代码出错 rn");break;break;case 1:/类请求/USART_send_str("USB 类输出请求:");switch(req)case OxOA: USART_send_str(” 设置空闲 rrr);sen d_le n_epO = 0; need_O_pack_epO =1;USB_e pO_se nd();/发送剩余数据break;default: #ifdef HEEY_DEBUG/UART_send_str(” 未知请求 rn");#e
40、n dif break; break;case 2:/厂商请求/USART_send_str(” 厂商输出请求 rrr);break;case 3:/保 留/USART_send_str(” 输出请求:保留 rn");break;/描述符的话用数组实现的这里就不给出来。源程序的kile 4 - arm写的,可以向我要。奋斗 STM32迷你板应该下载后可以直接使用。上位机软件使用vb。一下是枚举过程USB断开USB连接【U】【S】【B】【U】【S】【B】【复】【复】【位】【位】【中】【断】【中】【断】端点0【SETUP】分组接收完成端点0读取【8】字节数据:0x80 0x06 0x00
41、 0x01 0x00 0x00 0x40 0x00USB标准输入请求:获取描述符一一设备描述符 端点0发送【18】字节数据:+ 0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x40 0xAA 0xAA 0x02 0x00 0x00 0x01 0x00 0x00 0x00 0x01 +0x62 0x60tx=2 tx2=3rx=2*rx2=3端点0的IN分组发送完成*rx=0 rx2=0端点0的【OUT】分组接收完成端点0读取【0】字节数据:rx=0+rx2=0【U】【S】【B】【复】【位】【中】【断】端点0【SETUP】分组接收完成端点0读取【8】字节数据:0x00
42、0x05 0x16 0x00 0x00 0x00 0x00 0x00USB标准输出请求:设置地址。地址为:0x16端点0发送【0】字节数据:+0x62 0x60tx=2 tx2=3*rx=2 rx2=3端点0的IN分组发送完成*写入地址完成 =rx=3rx2=3端点0【SETUP】分组接收完成端点0读取【8】字节数据:0x80 0x06 0x00 0x01 0x00 0x00 0x12 0x00USB标准输入请求:获取描述符一一设备描述符 端点0发送【18】字节数据:+ 0x12 0x01 0x10 0x01 0x00 0x00 0x00 0x40 0xAA 0xAA 0x02 0x00 0x
43、00 0x01 0x00 0x000x00 0x01 +0x62 0x60 tx=2 tx2=3 rx=2 rx2=3端点0的【OUT】分组接收完成端点0读取【8】字节数据:0x80 0x06 0x00 0x02 0x00 0x00 0x09 0x00 rx=2 rx2=3端点0【SETUP】分组接收完成端点0读取【8】字节数据:0x80 0x06 0x00 0x02 0x00 0x00 0x09 0x00USB标准输入请求:获取描述符一一配置描述符 端点0发送【9】字节数据:0x09 0x02 0x29 0x00 0x01 0x01 0x00 0x80 0x32 +0x72 0xE0 tx=
44、2 tx2=3 rx=3 rx2=3端点0的【OUT】分组接收完成 端点0读取【8】字节数据:0x80 0x06 0x00 0x02 0x00 0x00 0xFF 0x00 rx=2 rx2=3端点0【SETUP】分组接收完成端点0读取【8】字节数据:0x80 0x06 0x00 0x02 0x00 0x00 0xFF 0x00USB标准输入请求:获取描述符一一配置描述符 端点0发送【41】字节数据:+ 0x09 0x02 0x29 0x00 0x01 0x01 0x00 0x80 0x32 0x09 0x04 0x00 0x00 0x02 0x03 0x00 0x00 0x00 0x09 0x21 0x10 0x01 0x21 0x01 0x22 0x1B 0x00 0x07 0x05 0x81 0x03 0x40 0x00 0x0A 0x07 0x05 0x01 0x03 0x40 0x00 0x0A +0x72 0xE0 tx=2 tx2=3 rx=3*rx2=3端点0的IN分组发送完成*rx=2 rx2=3端点0的【OUT】分组接收完成端点0读取【0】字节数据:rx=2 rx2=3端点0【SETUP】分组接收完成 端点0读取【8】字节数据:0x80 0x06 0x00 0x01 0x00
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度退休人员特殊岗位聘用劳动合同
- 2025年度西餐厅租赁合同及经营规范
- 二零二五年度企业财务内部控制体系建设合同
- 2025年度酒水行业品牌策划与推广合同
- 2025年度肥料产品研发与技术转移合同
- 二零二五年度电子借条合同模板(适用于教育培训)
- 2025年度河道清淤与地下水位监测合同
- 2025年代理合同解约
- 2025年城市绿化养护合同
- 2025年影视演员演出合同
- 《环境管理学》教案
- 2025年蛇年年度营销日历营销建议【2025营销日历】
- (一模)宁波市2024学年第一学期高考模拟考试 数学试卷(含答案)
- 父母赠与子女农村土地协议书范本
- 集团母子公司协议书
- 中医病证诊断疗效标准
- 南安市第三次全国文物普查不可移动文物-各乡镇、街道分布情况登记清单(表五)
- ITSMS-D-038 问题记录表范本
- 第1课+古代亚非(教学设计)【中职专用】《世界历史》(高教版2023基础模块)
- 物业客服管家的培训课件
- 2024年房地产行业的楼市调控政策解读培训
评论
0/150
提交评论