版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CKS32F103微控制器教学课件05编程与调试C语言基础
·CKS32固件库
·调试工具实操嵌入式C和汇编语言。嵌入式开发中,可单独使用,也可以混合编程。一般C语言为主、汇编为辅,二者互补。源代码文件通常以.c、.h、.s为扩展名,如main.c、adc.s等。源代码采用人类可读的语法,便于理解和维护,但MCU只能执行其指令集对应的机器语言,因此源代码须经过编译、汇编、链接等步骤转换后才能运行C语言是嵌入式开发领域的王者语言,掌握其核心特性对于写出高效、可靠的代码至关重要。从C与汇编语言的对比开始,逐步深入其程序结构和核心语法。01
编程语言C语言(High-Level)•可读性强:接近自然语言,代码逻辑清晰,易于理解维护。•可移植性高:稍作修改即可在不同处理器架构上编译运行。•开发效率高:提供丰富的函数库和数据结构,显著缩短开发周期。•抽象层次高:屏蔽底层硬件细节,专注于业务逻辑实现。汇编语言(Low-Level)•执行效率极高:直接操作硬件,代码精简,运行速度达到极致。•硬件控制精确:支持位级操作,对寄存器、内存等硬件拥有绝对控制权。•可读性与移植性差:指令与硬件架构强绑定,代码晦涩难懂。•开发成本高:开发周期长,对开发者硬件功底要求高,易出错。综合应用策略:在现代嵌入式及系统开发中,通常采用“C语言为主,汇编为辅”的模式。主体逻辑与业务代码用C语言实现,以保证代码的可维护性与开发效率;仅在启动代码、中断服务函数、上下文切换、关键性能优化点等需要极致性能或直接硬件控制的场景使用汇编。00
编程语言-C语言与汇编语言比较
类别
语言嵌入式C语言C语言开发目标主要用于开发运行在资源受限的嵌入式系统上的程序如单片机、MCU等,目标是高效地控制硬件和实现实时性。通常用于开发桌面应用程序,运行在操作系统上,如Windows、Linux、macOS,目标是高性能、复杂功能的软件内存资源芯片自身的SRAM和Flash电脑的主存(RAM/硬盘)运行环境程序通常运行在没有操作系统的裸机或实时操作系统RTOS的小型设备上,需要直接操作硬件寄存器和外设。程序运行在有完整操作系统支持的环境中,可以依赖操作系统的库和服务。硬件依赖强烈依赖硬件,代码需要直接操作I/O端口、定时器、中断和外设寄存器等一般和硬件无直接交互,主要通过操作系统提供的API间接控制硬件。开发工具需要专门的工具链,如Keil、IAR、STM32CubeIDE、AVR-GCC等。还包括硬件调试工具,如JTAG、SWD常用的开发工具有GCC、Clang等通用编译器和IDE,如VisualStudio、VSCode等编译与链接编译生成的程序是直接运行在目标硬件上的二进制文件,如.hex或.bin文件编译生成的程序是运行在通用操作系统上的可执行文件,如.exe或LinuxELF语言扩展经常使用硬件相关的语言扩展,如关键字volatile、register等,以及硬件平台的头文件,如cs32F10x.h等通常使用标准C语言特性,较少涉及硬件相关扩展实时性程序必须满足实时性要求,如中断处理、定时任务调度等通常不需要严格的实时性调试方式调试多通过硬件仿真器,如ST-Link、J-Link直接调试目标硬件,甚至需要逻辑分析仪和示波器协助调试工具如GDB,运行时可以通过控制台和操作系统调试工具调试/*1.头文件(包含硬件寄存器、库函数声明)*/#include"cs32f10x.h"//对应的芯片头文件#include<stdint.h>//标准整型定义#include<stdbool.h>//布尔类型支持/*2.宏定义和全局变量*/#defineLED_PIN(1<<5)//定义LED位#defineKEY_PIN(1<<0)//PA0对应的位(用户按键)uint8_tcounter=0;//全局变量/*3.硬件初始化函数*/voidLED_Init(void){RCC->APB2ENR|=RCC_APB2ENR_IOPCEN;//使能GPIOC时钟GPIOC->CRH&=~(0xF<<20);//清除配置GPIOC->CRH|=(0x1<<20);//配置为推挽输出}/*硬件初始化函数:按键外部中断初始化(PA0->EXTI0)*/voidKEY_EXTI_Init(void){//略}程序例程/*4.外部中断服务函数(ISR)*/voidEXTI0_IRQHandler(void){if(EXTI->PR&KEY_PIN)//检测是否是PA0中断{EXTI->PR=KEY_PIN;//清除中断挂起位
led_state=!led_state;//切换状态if(led_state)GPIOC->ODR&=~LED_PIN;//低电平亮灯elseGPIOC->ODR|=LED_PIN;//高电平灭灯}}/*5.主函数(main)*/intmain(void){
LED_Init();//初始化硬件while(1)//主循环(死循环){GPIOC->ODR^=LED_PIN;//翻转LEDfor(volatileuint32_ti=0;i<100000;i++);//延时}}程序例程预处理指令以`#`开头,如#include。编译前由预处理器处理,用于引入头文件、定义宏等。全局声明定义全局变量和函数原型,其作用域通常贯穿整个程序的生命周期。主函数(main)程序的唯一入口点,系统从`intmain()`开始执行代码逻辑。函数定义封装具体功能的代码块。一个程序可以包含多个自定义函数,实现代码的模块化和复用。语句与表达式程序的核心执行体。由变量操作、逻辑判断、循环控制等基本指令构成,共同完成计算和业务操作。01
C语言编程-C程序结构预处理命令是在编译之前对源代码进行处理的指令,均以符号#开头,是C/C++代码中实现灵活性与可维护性的重要工具。01
C语言编程-预处理命令预处理命令是C语言的一大特色,它让代码更具灵活性和可维护性。最常用的就是#include,用来引入头文件。#define用来定义宏,可以是常量也可以是函数。此外,条件编译指令如#ifdef,可以帮助我们编写更通用的代码,适应不同的编译环境01
C语言编程-预处理命令#include引入头文件•<stdio.h>:引入系统标准库头文件。
•"myheader.h":引入自定义的本地头文件。#define定义宏•定义常量:如#definePI3.14159
•定义宏函数:如MAX(a,b)((a)>(b)?a:b),用于代码复用。01
C语言编程-基本数据类型分类类型内存占用(byte)取值范围典型应用无符号整数uint8_t10~2558位传感器数据,如温湿度值、GPIO引脚状态(0/1)uint16_t20~6553516位ADC/DAC采样值、SPI/I²C通信数据帧uint32_t40~429496729532位外设寄存器,FLASH地址等uint64_t80~18446744073709551615高精度时间戳、大尺寸数据存储(较少用,占内存大)有符号整数int8_t1-128~1278位有符号数据(如误差值、偏移量)int16_t2-32768~3276716位有符号,如加速度、角速度传感器数值int32_t4-2147483648~214748364732位有符号运算,如坐标计算、温度补偿等浮点类型float4±3.4×10³⁸(精度6~7位)浮点运算,如比例系数、温度转换double8±1.7×10³⁰⁸(精度15~17位)高精度浮点计算,少用•整型:也可以用char、int、short、long等结合signed有
符号和unsigned无符号修饰。不指定signed/unsigned时默认为signed有符号类型浮点型:float,double(用于存储小数);使用double类型时要注意平台对浮点数支持的程度,特别是在资源受限的系统中,可能需要考虑性能和存储的优化•布尔型Bool,需引入<stdbool.h>头文件01
C语言编程-基本数据类型上表中的数据类型在stdint.h
头文件中定义,所以使用时需要用#include<stdint.h>引入
01
C语言编程-关键字关键字:是编译器预先定义并保留的、具有特定语法意义的单词。关键字用于定义程序的语法结构、数据类型、控制逻辑及特殊功能,是编译器解析和理解代码的基础。在嵌入式C中,大部分关键字与标准C语言相同,但volatile、interrupt、register、static等在嵌入式场景中尤为重要,直接影响硬件寄存器访问、内存控制以及编译器优化策略。常用的嵌入式C语言关键字包括数据类型关键字、类型限定符和修饰符关键字、函数关键字、中断与硬件相关关键字、控制语句类以及运算符与逻辑相关关键字。数据类型关键字Typedef,
struct,enum01
C语言编程-关键字Typedef:用于为已有的数据类型定义一个别名,从而提高代码的可读性和可移植性。typedefunsignedcharu8;/*无符号8位变量**/0~255一字节typedefvolatileunsignedcharvu8;/*易变的8位无符号变量**/typedefunsignedcharconstuc8;/*只读的8位无符号变量*/typedefsignedcharconstsc8;/*只读的8位有符号变量*/Struct:
结构体是一种复合数据类型,可以将不同类型的变量组合在一起,形成一个集合,用于描述某一对象的完整属性。方式1:struct结构体名
{成员列表};方式2:typedefstruct
{成员列表}结构体名;结构体定义typedefstruct{uint32_tPin;/*需要配置的GPIO管脚*/uint32_tMode;/*GPIO的操作模式*/uint32_tPull;/*GPIO的上拉或者下拉模式*/uint32_tSpeed;/*GPIO的速度*/uint32_tAlternate;/*GPIO的引脚复用*/}GPIO_InitTypeDef;该结构体的实例化:GPIO_InitTypeDefGPIO_Init;//创建结构体对象,名称为GPIO_InitGPIO_Init.Pin=GPIO_PIN_9;//PA9GPIO_Init.Mode=GPIO_MODE_AF_PP;//复用推挽输出GPIO_Ini.Pull=GPIO_PULLUP;//上拉GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;//高速GPIO_Ini.Alternate=GPIO_AF7_USART1;//复用为USART101
C语言编程-关键字Enum:枚举关键字用于定义枚举类型,为一组相关的常量定义一个名称,使代码更具可读性。枚举通常用于需要一组整数值的场景,而这些整数值有明确的意义和范围,如状态机、错误码、通信协议指令等。如GPIO速度定义如下:typedefenum{GPIO_Speed_10MHz=1,GPIO_Speed_2MHz,GPIO_Speed_50MHz}GPIOSpeed_TypeDef;嵌入式编程中,应避免使用枚举定义过大的整数范围,以减少内存开销,尤其是在资源受限的系统中01
C语言编程-关键字类型限定符和修饰符关键字序号关键字名称功能描述
const常量,声明不可修改的变量或指针、只读的变量,不允许再次赋值。
void声明函数无返回值或无参数,声明无类型指针
volatile不允许编译器优化,表示变量的值可能会在程序外部被改变
static声明静态变量
extern声明外部变量
auto分配的内存都是可读可写的区域
register限制变量定义在寄存器上,访问快速
restrict一种指针优化声明,告知编译器该指针是唯一指向某内存区域的引用,避免指针之间的冲突,指示指针在特定作用域内不会与其他指针重叠。01
C语言编程-关键字类型限定符和修饰符关键字Const:用于修饰变量、数组、指针或函数形参,表示该对象在程序运行过程中不可被修改或二次赋值,提高代码的安全性与可读性.const常见应用:硬件寄存器或外设访问时定义,如将GPIO配置为输入时,用const修饰对应参数,表示引脚只读;定义只读数据,如用const定义查找表、字符串常量、配置参数等不可修改的数据,防止其在运行时被更改;定义函数参数,如在函数形参中使用const,可避免函数体内意外修改传入的数据,提高接口的健壮性和可读性。#include<stdio.h>#include"cs32f10x.h"//假设使用cks32库//查找表(只读)constintsin_table[4]={0,707,1000,707};//配置参数(只读)constintbaud_rate=9600;//函数参数保护(只读字符串)01
C语言编程-关键字类型限定符和修饰符关键字,Const//GPIO输入读取(只读访问寄存器)intread_gpio(constGPIO_TypeDef*GPIOx,uint16_tpin){return(GPIOx->IDR&pin)?1:0;}intmain(void){//使用查找表和配置参数printf("Baud=%d,sin(90°)=%d\n",baud_rate,sin_table[2]);//打印只读字符串print_msg("SystemInitOK");//假设读取GPIO输入intkey_state=read_gpio(GPIOA,GPIO_Pin_0);printf("Key=%d\n",key_state);return0;}01
C语言编程-关键字类型限定符和修饰符关键字Void:表示无类型,声明无返回值的函数或无参数、无类型的指针。void不能用来声明变量或常量。嵌入式系统中一般将指针定义为void类型,如void*ptr,以便在需要指针指向不同类型数据时灵活复用voidsetOutput(boola);//函数无返回值intmain(void){ inti=10; charC='A'; floatf=12.34; doubled=56.78;
void*p;//声明无类型指针 p=&i; //整数变量的地址赋给指针 printf("valueofi:%d\r\n",*(int*)p);p=&C; //字符变量的地址赋给指针 printf("valueofC:%d\r\n",*(char*)p); p=&f; //单精度变量的地址赋给指针 printf("valueoff:%d\r\n",*(float*)p); p=&d; //双精度变量的地址赋给指针 printf("valueofd:%d\r\n",*(double*)p);return0;}01
C语言编程-关键字类型限定符和修饰符关键字:Void程序运行结果:Valueofi:10ValueofC:AValueoff:12.340000Valueofd:56.780000在C语言中,指针的声明形式灵活。但*仅作用于紧随其后的变量名,建议写代码时采用void*ptr书写方式,统一将星号靠近变量名,以提升代码的可读性与一致性void*ptr;ptr=(int*)0x2FFA;*ptr=0xAA55;01
C语言编程-关键字类型限定符和修饰符关键字Volatile:是一种类型修饰符,告诉编译器该变量的值可能在程序的正常执行流程之外发生变化,例如被硬件寄存器、中断服务程序或其他线程修改。没有volatile修饰的变量在编译器优化时,可能将其值缓存在CPU寄存器中,后续直接使用缓存,而不再访问真实地址。用volatile修饰的变量,则要求编译器每次都从内存或外设寄存器的真实地址读取,禁止使用寄存器副本,从而避免优化带来的风险。如GPIO、USART、ADC等外设状态寄存器的值会随硬件状态经常改变,中断服务程序访问的全局变量如标志位、计数器等,多任务/多线程的共享变量等,都必须用volatile修饰若某个引脚用于检测锅炉水位限位状态,需要实时反馈,使用volatile修饰后,每次循环都会重新读取引脚状态,确保水位变化能够被正确检测。锅炉水位检测代码:01
C语言编程-关键字//水位状态标志,使用volatile保证每次访问都从寄存器/内存读取volatileuint8_twaterLevel;//启动GPIOB时钟(假设RCC_APB2ENR对应GPIOB)RCC->APB2ENR|=(1<<3);//时钟开启//配置PB0为输入浮空GPIOB->CRL&=~(0xF<<0);//清除PB0配置位GPIOB->CRL|=(0x4<<0);//输入浮空模式//主程序while(1){//读取PB0电平,1表示水位到达限位,0表示未到waterLevel=(GPIOB->IDR&0x01);if(waterLevel){//水位到达,停止锅炉stopBoiler();}}定义为volatile的变量不会被编译器优化。01
C语言编程-关键字类型限定符和修饰符关键字Static:用于声明静态变量或静态函数,控制变量或函数的生命周期和作用域静态变量分为函数内部的静态变量和函数外的静态变量两类。函数内静态变量的生命周期贯穿整个程序运行期间,但作用域仅限于函数内部。在函数被调用过程中初始化指令只执行一次,多次调用时不会重复初始化。#include<stdio.h>voidfunc(){
staticintx=10;//在对func的三次调用中,x只进行一次初始化 printf("%d\n",x);//输出x的值 x=x+1;}intmain(intargc,char*constargv[]){ func();//输出10 func();//输出11 func();//输出12
return0;}01
C语言编程-关键字类型限定符和修饰符关键字函数关键字:Return和inlineReturn用于终止当前函数的执行,并将控制权交还给调用者。如果函数有返回值类型则return后必须带上相应的值,如果函数返回类型为void,则return仅表示结束函数执行Inline为内联函数,提示编译器将函数在调用处直接展开,以减少函数调用开销。适用于小型函数,在嵌入式开发中,通常会将一些GPIO位操作函数或寄存器读写函数声明为staticinline,放在头文件中,既能保证高效,又能避免函数调用开销。inline是一种以空间换时间的做法,内联展开后速度快,但会增加代码体积。在Flash容量有限的MCU中,需平衡使用。代码很长或者有循环/递归的函数不适宜作为内联函数,编译器自动优化时会忽略掉相应的内联。01
C语言编程-关键字控制流关键字序号关键字名称功能描述
if条件判断语句,用于执行条件测试
else与if配合使用,指定条件不成立时的执行代码块
switch多重选择语句,用于在多个可能的条件之间选择一个
caseswitch语句中的具体选项
defaultswitch语句中的默认选项,当没有匹配的case时执行
while用于执行循环语句,直到条件不满足时退出
dodo-while循环语句的起始部分,用于确保循环至少执行一次
for标准的for循环语句,适用于已知循环次数的情况
continue跳过本次循环的剩余部分,继续执行下一次循环
break终止当前循环,跳出循环体
goto跳转到程序中指定的标签位置,但使用时要小心,避免破坏程序结构01
C语言编程-关键字控制流关键字序号关键字名称功能描述
if条件判断语句,用于执行条件测试
else与if配合使用,指定条件不成立时的执行代码块
switch多重选择语句,用于在多个可能的条件之间选择一个
caseswitch语句中的具体选项
defaultswitch语句中的默认选项,当没有匹配的case时执行
while用于执行循环语句,直到条件不满足时退出
dodo-while循环语句的起始部分,用于确保循环至少执行一次
for标准的for循环语句,适用于已知循环次数的情况
continue跳过本次循环的剩余部分,继续执行下一次循环
break终止当前循环,跳出循环体
goto跳转到程序中指定的标签位置,但使用时要小心,避免破坏程序结构01C语言编程-函数函数:是完成特定功能的代码模块,是C语言的基本组成,每个C程序至少包含一个main()函数。函数将一组相关语句封装在一起,实现特定任务或操作,具有独立性、参数传递、返回值、封装性和调用性等特点。函数的基本结构:返回值类型函数名(参数列表)//函数声明{//函数体:局部变量声明
类型变量名;...//函数体:语句序列,完成特定功能
语句;...return表达式;//返回值(若返回类型为void,可省略)}01C语言编程-函数函数:是完成特定功能的代码模块,是C语言的基本组成,每个C程序至少包含一个main()函数。函数将一组相关语句封装在一起,实现特定任务或操作,具有独立性、参数传递、返回值、封装性和调用性等特点。函数的基本结构:返回值类型函数名(参数列表)//函数声明{//函数体:局部变量声明
类型变量名;...//函数体:语句序列,完成特定功能
语句;...return表达式;//返回值(若返回类型为void,可省略)}01
编程语言-关键字uint_8led_on(uint_8pin); //函数原型声明
voidGPIO_SetPinHigh(void); //函数原型声明voidGPIO_SetPinHigh(void)//函数声明,无参数,无返回值{ //假设GPIOx_BSRR是某MCU的端口置位寄存器GPIOA->BSRR=(1<<5);//将PA5置为高电平}uint_8led_on(uint_8pin)//函数名led_on,输入参数为引脚号,返回值为整型。{//设置引脚为输出GPIO_SetBits(GPIOC,pin);return0;}01C语言编程-函数函数调用:函数调用必须在函数原型声明之后。被调用的函数称为被调函数,调用该函数的函数为主调函数,main函数就是一个典型的主调函数。没有函数原型声明的函数只能被位于该函数后面的函数调用,所以一般在程序的开始对所有被调函数进行原型声明#include"cs32f10x.h"intLED_GPIO_Config(void);{ //GPIO时钟和引脚配置初始化,略 GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);/*点亮led1灯*/
ReturnLED1_GPIO_PIN; }intmain(void){ intLed1State;//局部变量声明;
Led1State=LED_GPIO_Config();
while(1);}02CKS32固件库CKS32固件库是程序开发的得力助手。简单来说,就是把操作硬件寄存器的复杂过程,封装成了一个个简单的函数。比如要点亮一个LED,不需要去查手册找对应的寄存器地址和位,只需要调用一个GPIO初始化函数即可。这极大地简化了开发,提高了效率和代码的可靠性。屏蔽底层硬件差异,统一API接口,让开发者专注于业务逻辑,而非寄存器配置。什么是固件库?固件库是由芯片厂商提供的、对底层硬件寄存器操作进行封装的函数集合。固件库将复杂的硬件操作抽象为简单的API函数,让开发者无需深入了解寄存器细节,即可快速配置和使用GPIO、UART等片上外设。CKS32F103C8T6微控制器简化开发流程提供GPIO、SPI等标准外设驱动,即拿即用。显著提升效率避免重复造轮子,专注业务逻辑开发。官方保障稳定性经过严格测试验证,比自研驱动更可靠。标准化易于维护统一API接口规范,降低团队协作成本。快速上手使用只需包含头文件(如cs32f10x_gpio.h),并直接调用库函数(如GPIO_Init())即可轻松控制硬件。02CKS32固件库优点:CKS32固件库采用CMSIS标准。CMSIS由ARM公司推出,是一套用于简化MCU软件开发的标准化接口。CMSIS位于硬件层与操作系统或用户应用层之间,提供与芯片厂商无关的硬件抽象层,为外设接口和RTOS实时操作系统提供统一的处理器软件接口,屏蔽底层硬件差异,从而提高代码的可移植性和复用性▍Cortex-M3内核核心特性哈佛架构总线分离,并行访问效率高三级流水线取指/译码/执行,指令提速Thumb-2指令集16/32位结合,密度效率兼顾NVIC中断控制支持嵌套中断与动态优先级▍CMSIS软件接口标准📌定义:ARM联合芯片厂商制定的标准,旨在屏蔽硬件差异,大幅提升嵌入式软件的跨平台可移植性。核心层次Core(内核通用)+Device(厂商外设)核心价值统一接口规范,支持代码复用,HAL库构建基础02CKS32固件库-CMSIS软件接口标准CMSIS软件层次详解用户层UserLayer架构最顶层,承载开发者编写的应用代码,直接面向具体的业务逻辑与功能实现,与底层硬件解耦。CMSIS应用程序的基本结构,包括用户应用层、操作系统层、CMSIS层和硬件寄存器层。CMSIS层位于系统程序结构的中间位置,向下负责直接访问内核和各类外设硬件,向上为用户程序或操作系统提供标准化函数接口CMSIS核心标准层(中间枢纽)MCU硬件基础层架构最底层,包含Cortex内核、NVIC中断控制器、SysTick定时器及各类片上外设,是软件运行的物理基础。通过这三层结构,CMSIS为内核和外设寄存器提供了标准化的访问方法,并统一了异常向量名称,提供了独立于具体设备的接口。CMSIS建立了Cortex-MMCU的编程标准,既保证了互操作性和可移植性,又使芯片厂商能够专注于外设差异化设计,从而降低开发成本并提升软件复用性02CKS32固件库-固件库的命名规则源程序和头文件命名源程序和头文件命名统一以cs32f10x_为前缀。如cs32f10x_adc.h为ADC模块头文件,cs32f10x_gpio.h为GPIO模块头文件,cs32f10x_conf.h为配置文件常量命名规则所有常量均使用大写英文字母命名。单个源文件使用的常量定义在对应的.c文件中,多个文件共享的常量定义在对应的.h头文件中。如#defineGPIO_MODE_INPUT0x00000000GPIO_MODE_INPUT是常量名,表示GPIO的输入模式,数值0x00000000为该模式对应的参数值。寄存器命名规则寄存器或寄存器字段通常作为常量处理,命名规则和常量一样使用大写英文字母,并采用缩写以直观反映功能。如GPIO_Mode_IPU表示将GPIO口配置为输入模式并启用上拉电阻,IPU=InputPull-Up,清晰说明寄存器配置的具体含义02CKS32固件库-固件库的命名规则源程序和头文件命名源程序和头文件命名统一以cs32f10x_为前缀。如cs32f10x_adc.h为ADC模块头文件,cs32f10x_gpio.h为GPIO模块头文件,cs32f10x_conf.h为配置文件常量命名规则所有常量均使用大写英文字母命名。单个源文件使用的常量定义在对应的.c文件中,多个文件共享的常量定义在对应的.h头文件中。如#defineGPIO_MODE_INPUT0x00000000GPIO_MODE_INPUT是常量名,表示GPIO的输入模式,数值0x00000000为该模式对应的参数值。寄存器命名规则寄存器或寄存器字段通常作为常量处理,命名规则和常量一样使用大写英文字母,并采用缩写以直观反映功能。如GPIO_Mode_IPU
表示将GPIO口配置为输入模式并启用上拉电阻,IPU=InputPull-Up,清晰说明寄存器配置的具体含义02CKS32固件库-固件库的命名规则外设函数命名规则名称功能PPP_Init根据PPP_InitTypeDef中指定的参数初始化外设PPP,例如TIM_Init,ADC_InitPPP_DeInit复位外设PPP的所有寄存器至缺省值,例如TIM_DeInit.PPP_Cmd使能或者失能外设PPP,例如:SPI_CmdPPP_ITConfig使能或者失能来自外设PPP的某中断源,如:RCC_ITConfig。以字符串Config结尾的函数为配置外设功能的函数,例如GPIO_PinRemapConfigPPP_DMAConfig使能或者失能外设PPP的DMA接口,例如:TIM1_DMAConfigPPP_GetFlagStatus检查外设PPP某标志位被设置与否,例如:I2C_GetFlagStatusPPP_ClearFlag清除外设PPP标志位,例如:I2C_ClearFlagPPP_GetITStatus判断来自外设PPP的中断发生与否,例如:I2C_GetITStatusPPP_ClearITPendingBit清除外设PPP中断待处理标志位,例如:I2C_ClearITPendingBit以外设缩写开头,每个单词首字母大写,函数名中只允许存在一个下划线,用于分隔外设缩写和函数其他部分。03用户程序生成MCU可执行程序的流程
MCU只能执行二进制机器码即机器语言用C语言编写的用户程序必须经过预处理、编译、汇编、链接和格式转换,生成最终在芯片中运行的机器码,然后通过专用工具下载到MCU中,MCU才能执行程序指令。汇编语言编写的代码只需经过汇编、链接、格式转换和下载等即可运行。01预处理(Preprocessing)•处理所有以#开头的指令,如展开头文件、替换宏定义。
•输出:生成.i
后缀的预处理文件。02编译(Compile)•对预处理后的代码进行词法/语法分析,翻译为特定架构的汇编指令。
•输出:生成.s后缀的汇编代码文件03汇编(Assembly)•将人类可读的汇编代码,转换为机器能识别的二进制机器指令。
•输出:生成.o后缀的二进制目标文件(ObjectFile)。04链接(Linking)•由链接器把多个.o文件和库文件等合并。
•输出:生成.elf或.axf05格式转换
•用工具objcopy从.elf文件中剥离调试信息,提取纯指令/数据
•输出:最终转为可烧录的.hex/.bin文件。03用户程序生成MCU可执行程序的流程
预处理:由预处理器对源代码进行文本替换、文件合并、条件编译等操作,最终生成纯净的扩展名为.i的C源文件编译:由编译器将.i文件翻译成扩展名为.s的汇编语言。汇编:由汇编器把.s文件转换成扩展名为.o的目标文件,文件里面是MCU能识别的二进制机器码指令链接:由链接器把多个.o文件和库文件等合并,按照链接脚本分配代码、变量在Flash和SRAM中的位置,生成扩展名为.elf的可执行映像文件。格式转换:用工具objcopy从.elf文件中剥离调试信息,提取纯指令/数据,把.elf转成扩展名为.bin或.hex的二进制文件。KeiluVision
是专为ARM系列微控制器设计的集成开发与调试环境(IDE),功能强大且易于上手。▌核心调试功能单步执行(Step)逐行执行代码,细致观察程序流程断点(Breakpoint)代码行暂停运行,检查变量状态观察/堆栈窗口实时查看变量、寄存器值及函数调用外设与性能分析图形化配置外设,定位性能瓶颈04开发环境搭建-KeiluVision
调试环境04开发环境搭建-KeiluVision
调试环境功能类别具体功能集成开发环境(IDE)μVisionIDE,集编辑、编译、调试一体化,具有项目管理、多配置支持、代码高亮、自动补全、模板与芯片向导、版本控制等功能编译工具链ArmCompiler(AC6)、支持C/C++与ARM汇编、优化选项、宏定义与条件编译、内置CMSIS标准调试功能单步、断点、变量监视等源代码级调试、指令级调试、内存/寄存器实时查看、硬件调试器支持J-Link、ULINK、CMSIS-DAP等、具有性能分析工具芯片支持与外设配置数千种MCU的设备数据库、CMSIS-Pack外设驱动与例程、外设配置向导仿真与测试软件仿真器、事件记录、支持RTX、FreeRTOS等RTOS调试代码分析与优化静态代码分析、代码覆盖率检测、执行时间分析下载与部署内置Flash烧录工具、JTAG、SWD、串口等多种下载方式04开发环境搭建-KeiluVision
调试环境KeilMDK安装和注册01安装•keil官网02添加器件库安装包注册以管理员身份运行KeilMDK软件和注册机。在KeilMDK中,点击“File”->“LicenseManagement”获取CID0304开发环境搭建-KeiluVision
调试环境CKS32F103调试环境配置01Device选项--选择芯片02Target选项-MCU目标系统配置04开发环境搭建-KeiluVision
调试环境CKS32F103调试环境配置03Output选项――输出设置04Debug选项――调试器配置选择调试器04开发环境搭建-KeiluVision
调试环境CKS32F103调试环境配置05Utilities选项――编程工具04Debug选项――调试器配置调试接口和速度选择04开发环境搭建-KeiluVision
调试环境CKS32F103调试环境配置06Utilities选项―编程工具芯片下载方式Utilities选项―编程工具芯片信息图形化配置工具STM32CubeMX是ST公司推出的一款强大的图形化配置工具,同样完美兼容国产CKS32系列芯片,是嵌入式开发的必备利器。CubeMX是一个图形化工具,在上面像画图一样配置芯片的引脚功能、时钟树和各种外设。配置完成后,它能自动为我们生成项目的初始化代码。这大大降低了开发门槛,让我们能更快地进入业务逻辑的实现“如果固件库是武器,CubeMX
就是智能管理系统”将复杂的底层配置转化为可视化操作,让嵌入式开发流程更现代化、更高效。04开发环境搭建-STM32CubeMX工具✨芯片与时钟配置•直观检索并选定目标MCU型号
•图形化构建系统时钟树,自动计算分频系数🛠️外设与代码生成•拖拽式配置
GPIO、UART、定时器等外设功能
•一键生成标准化初始化代码,支持Keil/IAR/VSCode降低门槛无需死记寄存器,图形化操作轻松上手。减少错误自动生成标准代码,规避底层配置错误。提升效率快速搭建项目框架,聚焦应用层开发。04开发环境搭建-STM32CubeMX工具▍工具简介ST官方推出的免费集成开发环境(IDE),基于Eclipse框架深度定制,无缝整合了STM32CubeMX图形化配置工具,实现了“配置-生成-编码-调试”的一站式开发。▍核心功能特性图形化配置:引脚/时钟/外设可视化自动代码生成:HAL/LL库工程框架开发编译:集成GCC与智能编辑器硬件调试:ST-Link/J-Link全支持▍标准新建工程流程01下载安装:获取官方安装包02新建项目:File>New>Project03选型配置:选择芯片与参数04生成代码:进入IDE开始编程工欲善其事,必先利其器。CKS32CubeIDE最大的特点是整合了图形化配置工具CKS32CubeMX。可以通过简单的鼠标点击来配置芯片的各种参数,然后自动生成项目框架和初始化代码。这极大地简化了开发流程,使用户更快地进入应用逻辑的编写。新建工程的流程也非常直观,只需选择芯片、配置参数、生成代码这几步即可。高效开发利器告别繁琐的底层寄存器配置,通过CubeMX图形化界面即可完成90%的初始化工作,专注上层应用逻辑开发。04开发环境搭建-STM32CubeIDE05Keil中仿真调试仿真调试:指的是在调试过程中选择使用Keil提供的仿真器来模拟目标硬件,而不需要实际的物理硬件设备。仿真器调试通常用于程序开发和测试时,确保代码在硬件上运行之前的正确性。keil主菜单中选择Debug,Debug选项展开如图所示,选项中有运行、单步、断点等调试选项,可根据调试情况选择,一般是在某个关键位置设断点进行调试。选择Start/StopDebugSession启动调试,程序运行后Peripherals菜单下的选项会由空白状态变为出现许多可点击的选项
•05Keil中仿真调试使用仿真调试功能时一定要注意设断点或单步运行。当程序停在断点或单步停顿时,才可手动修改寄存器值,以测试程序对不同寄存器状态的响应,同时可以通过寄存器窗口、内存窗口或外设视图查看各寄存器的当前值、中断标志位、定时器计数值、GPIO输入输出状态等。•06程序调试和下载:J-Link与ST-Link下载器是连接电脑和目标芯片的关键桥梁,承担程序下载、硬件断点调试与性能分析的核心任务,是嵌入式开发的必备工具。J-Link(SEGGER)-专业级标杆•性能强悍:极速下载与调试响应,支持RTT高带宽实时终端输出。
•生态完备:兼容ARM全系内核,拥有最丰富的Flash烧写算法支持。ST-Link(STMicro)-高性价比首选•极致适配:专为ST/CKS32芯片设计,开发板标配,即插即用。
•成本优势:价格亲民,功能足以覆盖绝大多数基础开发与调试需求。选型建议:初学者或仅开发CKS或者ST系列芯片,ST-Link完全够用且经济;若需跨平台开发、追求毫秒级调试响应或复杂项目开发,推荐使用专业级的J-Link。07程序调试实例基于KeilMDK和CKS32F103芯片实现LED流水灯控制。LED依次点亮,然后全灭,再重新开始,形成流水的效果。GPIOC的Pin13、Pin14、Pin15用于控制LED,LED的阴极接GPIO引脚,阳极通过限流电阻接VCC,低电平点亮//LED.C源文件#include"cs32f10x.h"#include"cs32f10x_gpio.h"//延时函数voidDelay(uint32_tnCount){for(;nCount!=0;nCount--);}//LED初始化voidLED_Init(void){GPIO_InitTypeDefGPIO_InitStructure;//时钟配置:使用默认内部时钟(HSI8MHz),若需更高性能,可配置外部晶振(HSE)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能GPIOC时钟//配置PC13、PC14、PC15为推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);//初始状态:全部熄灭(高电平)//通过cs32f10x_gpio.h引用该函数,置位指定位GPIO_SetBits(GPIOC,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);}intmain(void){LED_Init();while(1){//LED1亮(PC13低电平),//通过cs32f10x_gpio.h引用该函数,清零指定位GPIO_ResetBits(GPIOC,GPIO_Pin_13);//使用简单循环延时,实际项目建议使用定时器,调整Delay参数值改变流水速度;Delay(0xFFFFF);GPIO_SetBits(GPIOC,GPIO_Pin_13);//LED1灭GPIO_ResetBits(GPIOC,GPIO_Pin_14);//LED2亮(PC14低电平)Delay(0xFFFFF);GPIO_SetBits(GPIOC,GPIO_Pin_14);GPIO_ResetBits(GPIOC,GPIO_Pin_15);//LED3亮(PC15低电平)Delay(0xFFFFF);GPIO_SetBits(GPIOC,GPIO_Pin_15);Delay(0xFFFFF);//全灭延时
}}第5章作业说明CKS32F103系列MCU常用的编程语言及特点。请简述Thumb-2指令集的特点请说明常用的基本数据类型。读懂书中的程序。请写出包含struct,typedef,define,include,const,volatile,Void,static,extern关键字的单独或者组合代码。在某个项目中需要将绝对地址0x2FFA0000处整型变量的值设为0xAA55,请写出完成这个任务的代码。什么是固件和固件库?CMSIS标准的优点。请说明裸机程序与采用固件库编写程序的优缺点。请说明固件库中常量、寄存器和函数的命名规则,并给出实例。请说明如何根据用户程序生成CKS32F103能执行的机器码。请在计算机上安装keilMDK,学习如何建立工程和进行环境配置,调试5.8节程序,检查是否有错误或警告提示,找到生成的Hex文件位置。根据5.8节程序,写出按照PA13->PA14->PA15->PA14->PA13模式循环点亮LED的程序并调试。熟悉JLink和ST-Link硬件调试器的功能和使用方法,尝试将其与开发板相连,并在KeilMDK中下载HEX文件到开发板。感谢观看CKS32F103微控制器教学课件06通用GPIO和复用AFIO接口GPIO(General-PurposeInput/Output)通用输入输出接口,以及强大的复用功能6.1GPIO的主要功能解析GPIO的核心定义,深入理解输入、输出及引脚复用的基础概念,建立对通用输入输出口的完整认知。📌GPIO通用输入/输出端口:是微控制器MCU与外部世界交互的基础通道,每一个GPIO引脚都能通过软件灵活配置为输入或输出模式,是嵌入式开发中最最基础的硬件资源,承担着数据感知与执行控制的双重职责。📥功能1:数据输入(InputMode)实时检测外部引脚的高低逻辑电平,常用于读取按键状态、传感器数据;支持外部中断触发(上升/下降沿),部分引脚还可复用为ADC模拟信号的输入通道,实现对模拟量的采集。通过编程控制引脚上的高低电平,实现与各类外部设备(如传感器、LED、电机等)的交互,是连接数字逻辑与物理世界的关键纽带。6.1GPIO的主要功能📤功能2:数据输出(OutputMode)输出稳定的高低电平,直接驱动LED指示灯、继电器等外设。支持最高50MHz的高速电平翻转,能够快速响应控制指令,是实现硬件执行动作的最直接手段。🔀功能4:复用功能(AlternateFunction-AF)突破基础IO的限制,大部分引脚拥有第二功能。可被分配给UART串口、SPI总线、I2C通信等硬件外设,实现更高效、更专业的设备间数据传输,是拓展微控制器功能的关键。🧩功能3:
位操作能力支持对单个引脚进行独立的置1、置0或翻转操作,无需操作整个寄存器。这种精细化的控制方式不仅简化了代码逻辑,还能避免误操作其他引脚,极大提升了编程的灵活性与安全性。6.1GPIO的主要功能-工作模式类别模式描述应用输入模式浮空输入默认输入模式,输入状态由外部电平决定用于需要精确电平检测的场景,如按键检测,需外接电阻上拉输入内部上拉电阻,保持高电平状态适合简化外部电路设计,如按键直接接地避免引脚浮空引入噪声下拉输入内部下拉电阻,保持低电平状态模拟输入连接到ADC或模拟外设,数字输入缓冲器被关闭,降低功耗连接模拟传感器等外设,采集模拟电压信号输出模式通用推挽输出驱动能力强,最大可达25mA,可输出高电平/低电平适用于驱动LED、继电器等数字负载通用开漏输出仅输出低电平或高阻态,需外接上拉电阻才能输出高电平适用于总线通信,如I²C,避免电平冲突复用推挽输出引脚由片上外设控制,输出模式为推挽式用于功能复用如USART、SPI等需要高速、强驱动场合,满足外设的输出需求复用开漏输出引脚由片上外设控制,输出模式为开漏式用于复用功能的开漏模式如I2C_SDA等引脚,满足外设的特殊输出要求GPIO的输入输出工作模式GPIOA端口的16个引脚可表示为GPIOA0~GPIOA156.1GPIO的主要功能-引脚指标引脚指标1:GPIO
单个引脚的承载电压为3.3V,部分引脚具备5V容忍能力,所有I/O端口都是CMOS和TTL兼容引脚指标2:单个引脚灌入或输出的最大电流通常为±25mA,所有I/O的总电流不可超过150mA,所有VDD/VSS引脚总电流不可超过±150mA。为保证电平可靠,单个I/O推荐工作电流≤8mA引脚指标3:引脚的最低输入高电平为0.7×VDD,最高输入低电平为0.35×VDD。引脚输出高电平在8mA负载下能保证≥VDD-0.4V,例如在3.3V供电时大于2.9V,低电平≤0.4V6.2GPIO的结构及工作流程每个I/O引脚都带有上下保护的两个二极管,用于防止外部输入电压超过供电范围而损坏芯片I/O引脚还配有可控的上拉/下拉电阻,实现上拉、下拉和浮空三种输入状态6.3GPIO的结构及工作流程-输入流程GPIO引脚可配置为数字输入、模拟输入或片上外设复用功能输入数字量输入:GPIO配置为数字输入时,主要用于检测外部电路施加在引脚上的高、低电平状态,如按键、开关量或状态信号采集模拟信号输入:GPIO配置为模拟输入时,引脚上的模拟电压直接进入ADC模块的采样保持电路,实现模拟量到数字量的转换
片上外设复用功能输入:如串口接收、定时器捕获、外部中断、I²C/SPI的数据输入等。引脚上的信号经配置的上拉/下拉电阻和肖特基触发器整形后送入对应的外设模块。6.3GPIO的结构及工作流程-输出流程GPIO引脚可配置直接数字量输出和复用功能输出两类。为确保输出可靠,在关键应用中常需对输出状态进行检测直接数字量输出:GPIO配置为数字信号输出端,控制LED、蜂鸣器、继电器、片选信号等。开漏输出或推挽输出模式推挽模式(Push-Pull):主动式双驱通过内部上下两个互补的MOS管轮流导通,主动输出强高电平和强低电平。拥有极强的电流驱动能力,是最常用的通用输出模式,适用于直接驱动LED、继电器等负载。开漏模式(Open-Drain):被动式集电极仅能主动拉低电平,无法主动输出高电平,需依赖外部上拉电阻才能实现高电平输出。支持“线与”逻辑,允许多个设备共享同一总线,是I2C、SMBus等通信协议的标准配置。6.3GPIO的结构及工作流程-输出流程复用功能输出:当GPIO配置为片上外设复用功能引脚时,引脚电平状态由片上外设的硬件逻辑驱动,用户无法控制引脚的输出电平。例如串口USART的TX引脚、定时器PWM输出等。复用功能输出时根据应用需要,必须在GPIO配置寄存器中选择推挽复用输出或开漏复用输出模式。片上外设负责驱动数据,但输出特性须由GPIO配置决定。GPIO的输出速度:指输出驱动电路的响应速度,支持2、10、50MHz三档,输出速度决定了I/O驱动电路的响应能力。速度越高,信号翻转越快,但功耗、噪声及EMI电磁干扰也随之增加。速度越低,功耗更低,EMI更小,有利于提升系统的抗干扰性能开漏输出模式下,读取结果为引脚上的实际电平,状态取决于外部电路及上拉电阻。推挽输出模式下,读取结果等于MCU最近写入的输出值,即由MCU驱动的电平输出状态检测:软件在向GPIOx_ODR写入数据的同时,也可以通过读取输入数据寄存器GPIOx_IDR来检测输出状态是否正确。6.3GPIO的位带操作💡核心原理:化“位”为“字”
位带:是一种将存储器或片上外设寄存器中的单个位映射为内存中的一个字地址的技术。位带操作是Cortex-M3内核的独特特性,它将寄存器中的单个比特位,映射为内存中的一个32位字。通过普通的读写指令,即可实现对单个引脚的精准控制,告别繁琐的位运算。💡一句话总结:将“操作某一位”转化为“操作某一个地址”,实现原子化的位访问。6.3GPIO的位带操作位带区(Bit-bandRegion)支持位带操作的内存区域,通常为外设寄存器区与SRAM的最低1MB空间。Cortex-M3中有两个空间可实现位带操作,SRAM区的最低1MB共8M个bit空间,片上外设区最低1MB空间共8M个bit,对应地址为0x20000000~0x200FFFFF和0x40000000~0x400FFFFF6.3GPIO的位带操作
位带别名区中的每4个字节对应位带区的一位,所以1MB位带区的8M位,需要32MB的位带别名区与之对应。而4字节地址中的数据只有最低一位LSB代表位地址的数据。若位带别名区某地址中数据的最低位为1,则其对应的位带区的位数据为1。操作位带别名区等价于操作位带区,在位带别名区写入一个字等同于对位带区的目标位执行读-改-写操作SRAM位带区映射图6.3GPIO的位带操作位带别名区地址与位带区地址映射关系
AliasAddr为位带别名区中的32位地址,它映射到某个目标位;bit_band_base是位带别名区的起始地址, SRAM区:bit_band_base=0x22000000,
外设区:bit_band_base=0x42000000;byte_offset是包含目标位的字节在位带里的序号, SRAM区:byte_offset=位带地址-0x20000000,
外设区:byte_offset=位带地址-0x40000000;bit_number是目标位在字节中的位置,数值为(0~31),代表D0~D31位6.3GPIO的位带操作例:如映射位带区SRAM地址为0x20000300字节中的D2位,bit_band_base=0x22000000,byte_offset=0x20000300-0x20000000=300,bit_number=2,所以位带别名区地址为:AliasAddr=0x22000000+(0x300×32)+(2×4)=0x22006008若操作GPIOA的PA0,GPIOA的端口寄存器地址为0x40010800,则代码如下//定义指向位带别名地址的指针volatileuint32_t*bitBandAlias=(volatileuint32_t*)(0x42000000+((0x40010800-0x40000000)<<5)+(0<<2));//左移操作实现乘法运算//设置该位为1*bitBandAlias=1;//读取该位的值uint32_tvalue=*bitBandAlias;6.4最小系统最小系统也称最小应用系统,是用最少的元器件组成可以工作的CKS32F103系统。最小系统是MCU工作的最低要求,不包含芯片CKS32F103之外的外围设备。设计和分析最小系统是学习CKS32F103系列的入门基础。CKS32F103最小系统包括CKS32F103C8T6芯片、供电电源、复位电路、外部振荡电路、启动模式选择、调试和程序下载接口等6个部分为方便调试和状态观察,一般在GPIO引脚连接若干LED指示灯,配备串口或USB接口。LED指示灯用来指示电源和程序的运行状态,串口电路或者USB接口电路用于实现CKS32F103系统与计算机通讯以显示程序的调试信息并监测程序的执行状况等6.4最小系统最小系统电路图6.4最小系统供电电源一般选择3.3V供电,并在每个电源引脚增加0.1uf
去耦电容。设计时通常配备5V电源做为基础电源,方便需5V供电的设备,所以需要5V到3.3V的稳压电源芯片为CKS32F103提供3.3V电源。图中U2为XC6201是5V到3.3V的LDO线性低压差稳压电源芯片。VDDA和VSSA必须分别连接到VDD和VSS。VBAT供电范围1.8V~3.6V,可外接电池,当VDD掉电时,为RTC、LSI和后备数据寄存器等供电。手动复位电路CKS32F103自身有POR上电复位,不增加外部器件就可以正常工作,但为了调试方便一般会设计手动复位电路。外部振荡电路系统时钟可以选择芯片内部的RC振荡器HSI。为保证时钟源的精度和稳定性,最小系统配备了外部振荡电路,用于产生32.768KHz的LSE和8MHz的HSE时钟。6.8GPIO相关寄存器及关键位GPIO寄存器:是软件与GPIO硬件电路之间的接口,用于配置、控制和读取引脚状态。通过对寄存器的读写,能够灵活设置GPIO的工作模式、电气特性,并实现与外部设备的输入输出交互每个GPIO端口的寄存器7个:高、低配置寄存器GPIOx_CRL
和GPIOx_CRH,输入/输出数据寄存器GPIOx_IDR和GPIOx_ODR,置位/复位(设置/清零)寄存器GPIOx_BSRR,复位(清零)寄存器GPIOx_BRR锁定寄存器GPIOx_LCKR。GPIOA~E的基地址分别为0x40010800、0x40010C00、0x40011000、0x40011400和0x400118006.8GPIO相关寄存器及关键位序号寄存器名称偏移地址复位值功能及关键位描述1
GPIO配置低寄存器:GPIOx_CRL0x000x44444444RW;配置端口x的的输入/输出模式及速度,x=A~E,y=0~7D[4y+3:4y+2]:MODEy[4y+3:4y+2],模式位,00=输入,01=10MHz输出,10=2MHz输出,11=50MHz输出;D[4y+1:4y]:CNFy[4y+1:4y],配置位,输入时01=浮空、10=上拉/下拉;输出时00=推挽、01=开漏、10=复用推挽、11=复用开漏2
GPIO配置高寄存器:GPIOx_CRH0x040x44444444RW:配置端口的8~15位的输入/输出模式及速度;结构与CRL完全相同,y=8~153
GPIO输入数据寄存器:GPIOx_IDR0x080x0000xxxxR:输入端口x的引脚y的输入状态,y=0~15;D[y]:IDRy,端口输入数据,1=引脚y输入高电平,0=低电平;高16位D31~D16保留,始终读为0;4
GPIO输出数据寄存器:GPIOx_ODR0x0C0x00000000RW:控制端口
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026电子基础面试题及答案
- 工业机器人视觉系统安装合同2026年自动化生产线部署
- 九年级历史下册第六单元作业设计 (案例)
- 《商铺租赁业态规划管理手册》
- 水电安装工程监理质量控制要点手册
- GMP规范与质量保证手册-1
- 加油站非油品业务营销推广手册
- 大型游乐场用电安全管理规范手册
- 公司员工考勤与排班管理规范手册
- 高考语文培优增分一轮全国经典版课件:专题十六古代诗歌鉴赏-16
- 2026湖南怀化市经投实业集团有限责任公司子公司招聘15人笔试备考试题及答案详解
- 2026年江苏苏州吴中吴江相城区初三数学一模试题含答案
- 南通市2026届高三(四模)英语试卷(含答案)
- 浙江省杭州市萧山区2024-2025学年六年级下学期语文期末试卷(含答案)
- 电子书 -如何对付蠢人 马克西姆·罗维尔
- 广东省深圳市光明区2024-2025学年六年级下学期语文期末试卷(含答案)
- (2026版)新《中华人民共和国渔业法》核心要点解读培训
- 中国兵器审计中心招聘笔试题库2026
- (二模)烟台市2026年5月高三高考适应性测试英语试卷(含答案)+听力音频
- 2025年安徽省检察机关书记员真题(附答案)
- 肿瘤科运用PDCA降低癌痛患者爆发性疼痛发生率品管圈成果汇报
评论
0/150
提交评论