《毕业设计(论文)-基于stm32的仿生机械手的设计与实现(26页).docx》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于stm32的仿生机械手的设计与实现(26页).docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-毕业设计(论文)-基于stm32的仿生机械手的设计与实现-第 24 页学年论文题目:基于stm32的仿生机械手的设计与实现学生姓名:学 号:专业班级:14级自动化1班指导教师:2016年8月5日目录第1章 引言1第2章 STM32的基本理论知识3 2.1 STM32芯片的介绍.3 2.2 STM32的库函数10第3章 设计的主体内容12 3.1 大脑STM32开发板12 3.2 思想用库函数写程序.12 3.3 实物的机械设计273.4 实物的花样展示27第4章 结果的分析与讨论28第5章 结论28参考文献 .29第1章 引言世界首个走向市场的最先进的仿生手“i-LIMB”赢得英国科技创新头
2、奖。仿生手手有5根可自由活动的手指,它击败了其他进入决赛的三项发明,荣获英国皇家工程学院2008年的麦克罗伯特(MacRobert)杰出科技创新奖。在此次评奖中,其它进入决赛的三项发明包括一套照看保存在零度以下的数百万份生物样品的机器人系统、一个可以探测早期疾病迹象的化学传感器和一种专为柴油汽车设计的压缩型过滤器。截至2007年7月,这项仿生手技术已用在200多人身上,包括在伊拉克战争中失去四肢的美国士兵和截肢者协会首席执行官雷爱德华兹等。英国最早配备这种装置的爱德华兹1987年因患霍奇金病而导致手脚都截肢了,他在装上i-LIMB仿生手1个月后说它改变了他的生活。触摸仿生公司首席执行官斯图亚特
3、米德说:“i-LIMB仿生手是世界假肢市场中最引人注目的产品之一。这种仿生手有2个主要的独特特点。一是我们把发电机放进每个手指,让每个手指通过关节连接具有独立性;二是它的拇指能像我们的拇指一样弯曲90度。它是首个在形状和功能上模仿人手的仿生手。”触摸仿生公司小组的努力获得了英国科技界的认可,他们这次获得5英镑的奖金和一块金牌。公众可以在2008年9月前到伦敦科学博物馆观看i-LIMB仿生手。仿生手最早是为了帮助受镇静催眠药撒利多胺危害的儿童,作为一项研究项目的一部分,i-LIMB看起来和动起来就像真手一样。之后,世界第一家“仿生手”工厂触摸仿生公司在英国苏格兰正式成立,并开始为客户量身定做这种
4、假手。如今经过改进的仿生手采用了最前沿的电子和机械技术,并由高强度的塑料制成,此轻便手首次成了世界新一代假肢产品。第2章 STM32的基本理论知识2.1 STM32芯片的介绍STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核,按内核架构分为不同产品:其中STM32F1系列有:STM32F103“增强型”系列STM32F101“基本型”系列STM32F105、STM32F107“互联型”系列增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的
5、最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。内核:ARM32位Cortex-M3 CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。存储器:片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。时钟、复位和电源管理:2.0-3.6V的电源供电和I/O接口的驱动电压。上电复位(POR)、掉电复位(PDR)和可编程的电压探测器(PVD)。4-16MHz的晶振。内嵌出厂前调校的8MHz
6、 RC振荡电路。内部40 kHz的RC振荡电路。用于CPU时钟的PLL。带校准用于RTC的32kHz的晶振。低功耗:3种低功耗模式:休眠,停止,待机模式。为RTC和备份寄存器供电的VBAT。调试模式:串行调试(SWD)和JTAG接口。DMA:12通道DMA控制器。支持的外设:定时器,ADC,DAC,SPI,IIC和UART。3个12位的us级的A/D转换器(16通道):A/D测量范围:0-3.6V。双采样和保持能力。片上集成一个温度传感器。最多高达112个的快速I/O端口:根据型号的不同,有26,37,51,80,和112的I/O端口,所有的端口都可以映射到16个外部中断向量。除了模拟输入,所
7、有的都可以接受5V以内的输入。最多多达11个定时器:4个16位定时器,每个定时器有4个IC/OC/PWM或者脉冲计数器。2个16位的6通道高级控制定时器:最多6个通道可用于PWM输出。2个看门狗定时器(独立看门狗和窗口看门狗)。Systick定时器:24位倒计数器。2个16位基本定时器用于驱动DAC。最多多达13个通信接口:2个IIC接口(SMBus/PMBus)。5个USART接口(ISO7816接口,LIN,IrDA兼容,调试控制)。3个SPI接口(18 Mbit/s),两个和IIS复用。CAN接口(2.0B)。USB 2.0全速接口。SDIO接口。ECOPACK封装:STM32F103x
8、x系列微控制器采用ECOPACK封装形式。系统作用1、集成嵌入式Flash和SRAM存储器的ARM Cortex-M3内核。和8/16位设备相比,ARM Cortex-M3 32位RISC处理器提供了更高的代码效率。STM32F103xx微控制器带有一个嵌入式的ARM核,所以可以兼容所有的ARM工具和软件。2、嵌入式Flash存储器和RAM存储器:内置多达512KB的嵌入式Flash,可用于存储程序和数据。多达64KB的嵌入式SRAM可以以CPU的时钟速度进行读写(不待等待状态)。3、可变静态存储器(FSMC):FSMC嵌入在STM32F103xC,STM32F103xD,STM32F103x
9、E中,带有4个片选,支持四种模式:Flash,RAM,PSRAM,NOR和NAND。3个FSMC中断线经过OR后连接到NVIC。没有读/写FIFO,除PCCARD之外,代码都是从外部存储器执行,不支持Boot,目标频率等于SYSCLK/2,所以当系统时钟是72MHz时,外部访问按照36MHz进行。4、嵌套矢量中断控制器(NVIC):可以处理43个可屏蔽中断通道(不包括Cortex-M3的16根中断线),提供16个中断优先级。紧密耦合的NVIC实现了更低的中断处理延迟,直接向内核传递中断入口向量表地址,紧密耦合的NVIC内核接口,允许中断提前处理,对后到的更高优先级的中断进行处理,支持尾链,自动
10、保存处理器状态,中断入口在中断退出时自动恢复,不需要指令干预。5、外部中断/事件控制器(EXTI):外部中断/事件控制器由用于19条产生中断/事件请求的边沿探测器线组成。每条线可以被单独配置用于选择触发事件(上升沿,下降沿,或者两者都可以),也可以被单独屏蔽。有一个挂起寄存器来维护中断请求的状态。当外部线上出现长度超过内部APB2时钟周期的脉冲时,EXTI能够探测到。多达112个GPIO连接到16个外部中断线。6、时钟和启动:在启动的时候还是要进行系统时钟选择,但复位的时候内部8MHz的晶振被选用作CPU时钟。可以选择一个外部的4-16MHz的时钟,并且会被监视来判定是否成功。在这期间,控制器
11、被禁止并且软件中断管理也随后被禁止。同时,如果有需要(例如碰到一个间接使用的晶振失败),PLL时钟的中断管理完全可用。多个预比较器可以用于配置AHB频率,包括高速APB(PB2)和低速APB(APB1),高速APB最高的频率为72MHz,低速APB最高的频率为36MHz。7、Boot模式:在启动的时候,Boot引脚被用来在3种Boot选项种选择一种:从用户Flash导入,从系统存储器导入,从SRAM导入。Boot导入程序位于系统存储器,用于通过USART1重新对Flash存储器编程。8、电源供电方案:VDD ,电压范围为2.0V-3.6V,外部电源通过VDD引脚提供,用于I/O和内部调压器。V
12、SSA和VDDA,电压范围为2.0-3.6V,外部模拟电压输入,用于ADC,复位模块,RC和PLL,在VDD范围之内(ADC被限制在2.4V),VSSA和VDDA必须相应连接到VSS和VDD。VBAT,电压范围为1.8-3.6V,当VDD无效时为RTC,外部32KHz晶振和备份寄存器供电(通过电源切换实现)。9、电源管理:设备有一个完整的上电复位(POR)和掉电复位(PDR)电路。这条电路一直有效,用于确保从2V启动或者掉到2V的时候进行一些必要的操作。当VDD低于一个特定的下限VPOR/PDR时,不需要外部复位电路,设备也可以保持在复位模式。设备特有一个嵌入的可编程电压探测器(PVD),PV
13、D用于检测VDD,并且和VPVD限值比较,当VDD低于VPVD或者VDD大于VPVD时会产生一个中断。中断服务程序可以产生一个警告信息或者将MCU置为一个安全状态。PVD由软件使能。10、电压调节:调压器有3种运行模式:主(MR),低功耗(LPR)和掉电。MR用在传统意义上的调节模式(运行模式),LPR用在停止模式,掉电用在待机模式:调压器输出为高阻,核心电路掉电,包括零消耗(寄存器和SRAM的内容不会丢失)。11、低功耗模式:STM32F103xx支持3种低功耗模式,从而在低功耗,短启动时间和可用唤醒源之间达到一个最好的平衡点。休眠模式:只有CPU停止工作,所有外设继续运行,在中断/事件发生
14、时唤醒CPU;停止模式:允许以最小的功耗来保持SRAM和寄存器的内容。1.8V区域的时钟都停止,PLL,HSI和HSE RC振荡器被禁能,调压器也被置为正常或者低功耗模式。设备可以通过外部中断线从停止模式唤醒。外部中断源可以使16个外部中断线之一,PVD输出或者TRC警告。12、待机模式:追求最少的功耗,内部调压器被关闭,这样1.8V区域断电。PLL,HSI和HSE RC振荡器也被关闭。在进入待机模式之后,除了备份寄存器和待机电路,SRAM和寄存器的内容也会丢失。当外部复位(NRST引脚),IWDG复位,WKUP引脚出现上升沿或者TRC警告发生时,设备退出待机模式。进入停止模式或者待机模式时,
15、TRC,IWDG和相关的时钟源不会停止。2.2 STM32的库函数意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄存器操作中解放出来,将精力专注应用程序的开发上,这便是ST推出这样一个开发包的初衷。但这对于许多从51/AVR这类单片机的开发转到STM32平台的开发人员来说,势必有一个不适应的过程。因为程序开发不再是从寄存器层次起始,而要首先去熟悉STM32所提供的固件库。那是否一定要使用固件库呢?当然不是。但STM32微控制器的寄存器规模可
16、不是常见的8位单片机可以比拟,若自己细细琢磨各个寄存器的意义,必然会消耗相当的时间,并且对于程序后续的维护,升级来说也会增加资源的消耗。对于当前“时间就是金钱”的行业竞争环境,无疑使用库函数进行STM32的产品开发是更好的选择。本文将通过一个简单的例子对STM32的库函数做一个简单的剖析。以最常用的GPIO设备的初始化函数为例,如下程序段一:GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
17、GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA , &GPIO_InitStructure 这是一个在STM32的程序开发中经常使用到的GPIO初始化程序段,其功能是将GPIOA.4口初始化为推挽输出状态,并最大翻转速率为50MHz。第3章 设计的主体内容3.1 大脑STM32开发板STM32开发板就是一种STM32的最小系统,它上面链接有基础的功能电路,而且耐用,附有学习光盘,对初学者十分的合适。通过对程序的编写,可以得到所需要的果。3.2 思想用库函数写程序Main.c#include public.h#in
18、clude pwm.h#include systick.h#include jixieshou.hint main() pwm_init(); while(1)if(anjian=0) shouzhang();tiaoxin();Systick.c#include systick.hvoid delay_ms(u32 i) u32 temp; SysTick-LOAD=9000*i; SysTick-CTRL=0X01;SysTick-VAL=0;dotemp=SysTick-CTRL; while(temp&0x01)&(!(temp&(1CTRL=0;SysTick-VAL=0;Systi
19、ck.h#ifndef _systick_H#define _systick_H#includevoid delay_us(u32 i);void delay_ms(u32 i);#endifPwm.cvoid pwm_init()GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Perip
20、h_GPIOB|RCC_APB2Periph_GPIOE|RCC_APB2Periph_TIM1,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5|RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed
21、_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GP
22、IO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOE,&GPIO_InitStructure);TIM_TimeBaseInitStructure.TIM_Period = 9999; TIM_TimeBaseInitStructure.TIM_Prescaler = 143;TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;TIM_TimeBaseInitStructure.TIM_Counte
23、rMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM1, TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM5, TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); GPIO_PinRemapConfig(GP
24、IO_FullRemap_TIM2,ENABLE);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OC1Init(TIM3,&TIM_OCInitStructure);TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_OC3Init(TIM3,&TIM_OCInitStructu
25、re);TIM_OC4Init(TIM3,&TIM_OCInitStructure);TIM_OC1Init(TIM5,&TIM_OCInitStructure);TIM_OC4Init(TIM5,&TIM_OCInitStructure);TIM_OC2Init(TIM5,&TIM_OCInitStructure);TIM_OC3Init(TIM5,&TIM_OCInitStructure);TIM_OC1Init(TIM4,&TIM_OCInitStructure);TIM_OC2Init(TIM4,&TIM_OCInitStructure);TIM_OC3Init(TIM4,&TIM_O
26、CInitStructure);TIM_OC4Init(TIM4,&TIM_OCInitStructure);TIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_OC4Init(TIM2,&TIM_OCInitStructure);TIM_OC2Init TIM_OCInit TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enab
27、le); TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM5,TIM_OCPreload_Enable);TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); TI
28、M_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Enable); TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_EnablTIM_ARRPreloadConfig(TIM3, ENABLE);TIM_ARRPreloadConfig(TIM2
29、, ENABLE);TIM_ARRPreloadConfig(TIM4, ENABLE);TIM_ARRPreloadConfig(TIM5, ENABLE);TIM_CtrlPWMOutputs(TIM2,ENABLE);TIM_CtrlPWMOutputs(TIM3,ENABLE);TIM_CtrlPWMOutputs(TIM4,ENABLE);TIM_CtrlPWMOutputs(TIM5,ENABLE);TIM_Cmd(TIM3,ENABLE);TIM_Cmd(TIM4,ENABLE);TIM_Cmd(TIM5,ENABLE);TIM_Cmd(TIM2,ENABLE);Pwm.h#if
30、ndef _pwm_H#define _pwm_H#include stm32f10x.hvoid pwm_init(void);#define anjian GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)#endifJixieshou.cvoid tiaoxin() swxz=1250; swqh=950;TIM_SetCompare4(TIM3, swqh); delay_ms(500); TIM_SetCompare4(TIM4, swxz); delay_ms(700); szqd=460; szzd=270; szhd=300; zzqd=410;
31、zzzd=270; zzhd=270; wmzqd=385; wmzzd=270; wmzhd=400; dmzhd=700; dmzzd=270; dmzqd=430;TIM_SetCompare1(TIM3, szqd);delay_ms(500);TIM_SetCompare2(TIM3, szzd);delay_ms(500);TIM_SetCompare3(TIM3, szhd);delay_ms(500);TIM_SetCompare2(TIM5, zzqd);delay_ms(500);TIM_SetCompare3(TIM5, zzzd);delay_ms(500);TIM_S
32、etCompare4(TIM5, zzhd);delay_ms(500);TIM_SetCompare3(TIM2, wmzqd);delay_ms(500);TIM_SetCompare4(TIM2, wmzzd);delay_ms(500);TIM_SetCompare1(TIM5, wmzhd);delay_ms(500);TIM_SetCompare3(TIM4, dmzhd);delay_ms(500);TIM_SetCompare2(TIM4, dmzzd);delay_ms(500);TIM_SetCompare1(TIM4, dmzqd);delay_ms(500); swxz
33、=280; TIM_SetCompare4(TIM4, swxz); delay_ms(700);szqd=800; szzd=760; szhd=800;TIM_SetCompare3(TIM3, szhd);delay_ms(500);TIM_SetCompare2(TIM3, szzd);delay_ms(500);TIM_SetCompare1(TIM3, szqd);delay_ms(500); dmzhd=900; dmzzd=270; dmzqd=270;TIM_SetCompare3(TIM4, dmzhd);delay_ms(500);TIM_SetCompare2(TIM4
34、, dmzzd);delay_ms(500);TIM_SetCompare1(TIM4, dmzqd);delay_ms(500); swqh=500; TIM_SetCompare4(TIM3, swqh); delay_ms(1000); swqh=950; TIM_SetCompare4(TIM3, swqh); delay_ms(1000); swxz=1250; TIM_SetCompare4(TIM4, swxz); delay_ms(700); swqh=1250; TIM_SetCompare4(TIM3, swqh); delay_ms(1000); szqd=800; sz
35、zd=760; szhd=800; zzqd=800; zzzd=720; zzhd=800; wmzqd=750; wmzzd=760; wmzhd=850; dmzqd=680; dmzzd=760; dmzhd=600;TIM_SetCompare3(TIM4, dmzhd);TIM_SetCompare2(TIM4, dmzzd);TIM_SetCompare1(TIM4, dmzqd);delay_ms(500); TIM_SetCompare1(TIM3, szqd);TIM_SetCompare2(TIM3, szzd);TIM_SetCompare3(TIM3, szhd);T
36、IM_SetCompare2(TIM5, zzqd);TIM_SetCompare3(TIM5, zzzd);TIM_SetCompare4(TIM5, zzhd);TIM_SetCompare3(TIM2, wmzqd);TIM_SetCompare4(TIM2, wmzzd);TIM_SetCompare1(TIM5, wmzhd);delay_ms(500); szzd=500; zzzd=500; wmzzd=500; TIM_SetCompare2(TIM3, szzd); TIM_SetCompare3(TIM5, zzzd); TIM_SetCompare4(TIM2, wmzz
37、d);delay_ms(200);szzd=760; zzzd=720; wmzzd=760; TIM_SetCompare2(TIM3, szzd); TIM_SetCompare3(TIM5, zzzd); TIM_SetCompare4(TIM2, wmzzd);delay_ms(200);szzd=500; zzzd=500; wmzzd=500; TIM_SetCompare2(TIM3, szzd); TIM_SetCompare3(TIM5, zzzd); TIM_SetCompare4(TIM2, wmzzd);delay_ms(200);szzd=760; zzzd=720;
38、 wmzzd=760; TIM_SetCompare2(TIM3, szzd); TIM_SetCompare3(TIM5, zzzd); TIM_SetCompare4(TIM2, wmzzd);swqh=950;TIM_SetCompare4(TIM3, swqh); delay_ms(300); szqd=460; szzd=270; szhd=300; zzqd=410; zzzd=270; zzhd=270; wmzqd=385; wmzzd=270; wmzhd=400; dmzhd=700; dmzzd=270; dmzqd=430;TIM_SetCompare1(TIM3, s
39、zqd);TIM_SetCompare2(TIM3, szzd);TIM_SetCompare3(TIM3, szhd);TIM_SetCompare2(TIM5, zzqd);TIM_SetCompare3(TIM5, zzzd);TIM_SetCompare4(TIM5, zzhd);TIM_SetCompare3(TIM2, wmzqd);TIM_SetCompare4(TIM2, wmzzd);TIM_SetCompare1(TIM5, wmzhd);delay_ms(1000);TIM_SetCompare3(TIM4, dmzhd);TIM_SetCompare2(TIM4, dm
40、zzd);TIM_SetCompare1(TIM4, dmzqd);Jixieshou.h#ifndef _jixieshou_H#define _jixieshou_H#include stm32f10x.hvoid shouzhang(void);void woquan(void);void shouwan(void);void tiaoxin(void);#endif3.3 实物的机械设计3.4 实物的花样展示根据需要对组合舵机进行编程,达到所需的动作,增加观赏性 第4章 结果的分析与讨论经过仔细的学习,最终完成了预期设想,最终制作出了机械手实物,通过对程序的编写体验到了机械手的运作过程,期间必须掌握对舵机的应用,熟知pwm,因为舵机的使用有固定的频率要求,所以必须熟知单片机时钟并对其进行正确的配置,通过延时函数的加写,可以更好的协调舵机间的联动过程,从而完成动作。 第5章 结论通过小学期的学习,我在单片机的世界里越走越远,越多知识的掌握越可以让我对单片机充满兴趣,感谢老师的认真指导。 参考文献STM32自学笔记(第2版)北京航空航天大学出版社 蒙博宇 编著