版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统及应用EmbeddedSystemandApplication嵌入式系统及应用(含实验)是电子信息工程专业的专业必修课,本课程以STM32MCU为样机,介绍嵌入式系统的基本概念和接口技术、嵌入式系统程序设计、嵌入式实时操作系统RTOS及软件开发调试技术。本课程主要内容包括:STM32体系结构、STM32固件包和HAL库、中断和系统滴答定时器、STM32的通信模块和定时器及其应用、模拟外设、FreeRTOS的基本概念、任务和中断管理、进程间通信技术等。通过本课程的学习,学生能了解以STM32系列MCU的基本概念和基于HAL库和FreeRTOS的程序设计方法,掌握嵌入式系统软硬件的调试方法,能设计基本的嵌入式系统软硬件。课程简介第1章STM32体系结构
(2学时)第2章STM32编程基础
(2学时)第3章STM32固件库与HAL库
(2学时)第4章中断和系统滴答定时器 (2学时)第5章STM32通信模块及其应用 (2学时)第6章定时器及其应用
(4学时)第7章模拟外设
(2学时)
课程主要内容第8章
FreeRTOS基础
(4学时)第9章
FreeRTOS的任务管理和中断管理
(4学时)第10章
FreeRTOS进程间通信技术
(6学时)第11章
综合应用实践案例
(2学时)实验
(32学时)基于寄存器的成功需开发实验库的创建实验基于CubeMX的程序开发实验SysTick定时器实验键盘扫描显示实验串口数据收发实验温度采集实验STM32-ADC实验实验项目基于FreeRTOS的STM32程序开发实验FreeRTOS任务创建实验FreeRTOS任务调度实验FreeRTOS中断管理实验消息队列及程序设计实验计数信号量及程序设计实验互斥量及程序设计实验事件组及程序设计实验课程目标与考核向军.孙永奎.极简STM32:基于HAL库和FreeRTOS的ArmCortex-M4编程与开发漆强.嵌入式系统设计—基于STM32CubeMX与HAL库王维波.鄢志丹.王钊.STM32Cube高效开发教程(基础篇)王维波.鄢志丹.王钊.STM32Cube高效开发教程(高级篇)张凯龙.嵌入式系统体系、原理与设计B站视频
漆强:/video/BV1y7411m7gg/?share_source=copy_web&vd_source=c1a96eb2fa82be38b920217a9cd71705
野火:/video/BV1Vt411X7PK/?spm_id_from=333.337.search-card.all.click
正点原子:
/video/BV1bv4y1R7dp/?spm_id_from=333.337.search-card.all.click&vd_source=1f0ff77d0f970cc61be393814d9ec8ad教学参考资源第1章STM32体系结构1.1嵌入式系统与STM32简介
1.1.1嵌入式系统1.1.2STM32Devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants.嵌入式系统(EmbeddedSystem)是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。1.1.1嵌入式系统定
义1.1嵌入式系统与STM32简介
嵌入性嵌入到对象系统,满足对象系统的要求,如物理环境、电气环境、成本。专用性(可裁剪性)量身定做,功能单一;专用开发环境,专用开发工具。计算机系统以计算机技术基础,光、机、电、算、软一体化,多学科融合。特点可靠性
嵌入式系统长期工作,出现的故障率要很低。提高可靠性的典型办法有:存储不用磁盘,而用芯片;利用“看门狗”检测是否死机,如果死机能自动启动。1.1嵌入式系统与STM32简介
实时性汽车刹车系统要使用强实时,导航系统可使用弱实时。低功耗
小型的便于携带的嵌入式产品,例如:手机、PDA、MP3、数码相机等,这些设备一般需要采用体积较小的电池来供电,只有降低系统的功耗,才能让系统工作更长的时间。降低嵌入式系统功耗的技术有很多方法,如:降低工作电压、系统资源最小化、简化芯片结构等。1.1嵌入式系统与STM32简介
应
用1.1嵌入式系统与STM32简介
应用演变传统应用:MCU作为主控新应用:MCU+RF+Sense+Algorithm监控电动助力车扩展坞家电汽车音响仪器仪表20072013穿戴式电动代步车机器人2014飞行器AIIoT/1.1嵌入式系统与STM32简介
智能家居管理系统1.1嵌入式系统与STM32简介
第一阶段(20世纪70年代):单片机系统,单片机为核心的控制系统。
第二阶段(20世纪80年代):嵌入式操作系统,
以8到16位嵌入式处理器为基础、以简单操作系统为核心。第三阶段(20世纪90年代):实时多任务操作系统,以32位RISC嵌入式中央处理器,并且使用嵌入式操作系统。第四阶段(21世纪):互联网,万物互联,以Internet为标志的迅速发展的阶段。嵌入式系统的发展1.1嵌入式系统与STM32简介
嵌入式处理器嵌入式处理器片上系统SOC微处理器MPU微控制器MCU数字信号处理器DSP由通用CPU演变,具备MMU如386EX和MIPS_____/将CPU、存储器、中断系统和外设集成在单个芯片如8051/MSP430/STM32_________________J侧重于信号处理如TI公司的C2000/C5000系列___________/可编程逻辑器件客户定制____J1.1嵌入式系统与STM32简介
典型的嵌入式微处理器8051系列:1980年Intel公司推出51微控制器。核和外围电路都自己设计和生产。后来以不同形式将51核转让给Plilips、Atmel、Dalllas等公司。ARM系列:目前ARM微处理器,已经遍及工业控制、消费类电子产品、通信系统、网络系统等各类产品市场。IBM-PowerPC:品种多,应用范围广,从高端的工作站、服务器到桌面计算机系统,从消费类电子产品到大型通信设备,无所不包。MIPS:目前的使用率仅次于ARM,覆盖游戏机、路由器、掌上电脑等各个方面。1.1嵌入式系统与STM32简介
嵌入式数字信号处理器DSP
DSP处理器是专门用于信号处理方面的处理器,其在系统结构和指令算法方面进行了特殊设计,在数字滤波、谱分析等各种仪器上DSP获得了大规模的应用。
片上系统SoC
片上系统是指把系统做在一块芯片上,芯片内置的RAM、ROM不仅能保存简单的代码,还可以运行操作系统。
片上系统的代表性产品是高通的骁龙845芯片,该芯片集成CPU、GPU、SP、ISP、内存、Wi-Fi控制器、基带芯片以及音频芯片等,手机系统所需功能都在这块芯片上实现,从而降低了产品功耗和成本,减少了产品体积。1.1嵌入式系统与STM32简介
温度/湿度传感器光电类传感器压力传感器SRAMDRAMNAND/NorFlashA/D接口同步/异步串口USB接口指示灯/数码管液晶显示屏键盘外围电路1.1嵌入式系统与STM32简介
嵌入式操作系统(EmbeddedOperatingSystem,EOS)又称为嵌入式实时操作系统(EmbeddedReal-TimeOperatingSystem,ERTOS),是嵌入式应用软件的基础和开发平台,具有一般操作系统的最基本的功能:进程调度、内存管理、设备管理、文件管理和操作系统接口(API调用),此外还具有可裁剪性,可配置性及一定的实时性等特点。目前,16位及以下的嵌入式系统一般没有操作系统,32位以上的嵌入式系统一般都配有操作系统。如:交换机、路由器、手机、数码相机等系统内部都有嵌入式操作系统;
U盘、IC卡读写器等嵌入式系统就没有使用操作系统。嵌入式操作系统1.1嵌入式系统与STM32简介
常见的嵌入式操作系统稳定异常VxWorks界面漂亮的WindowsCE最佳学习型的uC/OS-II开源的嵌入式Linux手机安卓iOS华为鸿蒙操作系统…1.1嵌入式系统与STM32简介
1.1嵌入式系统与STM32简介
STM32ARMCortex-M4内核STM32意法半导体公司Microelectronics的缩写,表示微控制器32位的微处理器芯片STM32系列微控制器由意法半导体(STMicroelectronics)基于ARMCortex-M内核开发,支持32位应用,包括高性能、实时功能、数字信号处理和低功耗、低电压操作,同时拥有一个完全集成和易用的开发环境。1.1.2STM32ARM010203ARM是一家公司,在全球半导体行业技术领先,其主要业务是设计16位和32位嵌入式处理器。ARM是一类微处理器芯片或产品的统称,是采用ARM技术开发的RISC处理器的通称。ARM是一种技术的名称,是一种高级RISC处理器的体系结构。1.1嵌入式系统与STM32简介
将技术授权给其它芯片厂商形成各具特色的ARM芯片中兴集成电路、大唐电讯、中芯国际、上海华虹1.1嵌入式系统与STM32简介
1.2STM32体系架构1.2.1ARM内核体系架构 1.2.2STM32系列微控制器1.2.3STM32F407微控制器1.2STM32体系架构目前,ARM内核体系架构共定义了8个版本v1~v8,这里对目前应用最广泛的v7架构做简要介绍。v7架构ARMv7架构采用Thumb-2技术,代码仅占用31%的内存,性能却高出38%。其中采用了适用于ARMCortex-A系列处理器的128位SIMD(SingleInstruction,MultipleData,单指令多数据)扩展结构NEON技术,将DSP和媒体处理能力提高了近4倍,满足了3D图形和游戏应用的需求。从v7架构开始,ARM微处理器统一用
Cortex作为内核体系架构的名称。1.2.1ARM内核体系架构——以v7版本为例1.2STM32体系架构1.2STM32体系架构Cortex-M系列
成本和能耗低、易于使用,对必须考虑成本、功耗和性能的可兼容、易于使用的嵌入式设备提供了理想的解决方案。处理器主要特性Cortex-M0面向低成本、超低功耗的微控制器和深度嵌入应用Cortex-M0+针对小型嵌入式系统的最高能效的处理器,尺寸大小和编程模式与M0相近,但是具有扩展功能,如单周期I/O接口和向量表重定位功能Cortex-M1针对FPGA设计优化的小处理器,利用FPGA上的存储器块实现了紧耦合内存和M0有相同的指令集Cortex-M3针对低功耗微控制器设计的处理器,面积小但性能强劲,支持可以处理器快速处理复杂任务的丰富指令集,具有硬件除法器和乘加指令,支持全面的调试和跟踪功能1.2STM32体系架构处理器主要特性Cortex-M4不但具备M3的所有功能,还扩展了面向DSP的指令集,如单指令多数据指令(SMID)和更快的单周期MAC操作。此外还有一个可选的支持IEEE754浮点标准的单精度浮点运算单元Cortex-M7针对高端微控制器和数据处理密集的应用开发的高性能处理器,具备M4支持的所有指令功能,扩展支持双精度浮点运算,并具备扩展存储器功能,如Cache和紧耦合存储器Cortex-M23面向超低功耗、低成本应用设计的小尺寸处理器,和M0相似,但是支持各种增强的指令集和系统层面的功能特性和TrustZone安全扩展Cortex-M33主流的处理器设计,与M3和M4类似,但系统设计更灵活,能耗比更高效,性能更高,还支持TrustZone安全扩展1.2STM32体系架构1.2.2STM32系列微控制器F4系列基于Cortex-M4内核,主频高达168MHz,具有DSP和FPU等功能。F1系列是ST公司主推的STM32系列MCU,基于Cortex-M3内核,主频高达72MHz。v7-Mv7E-M图1-2
STM32系列微控制器1.2STM32体系架构STM32MCU命名规范1.2STM32体系架构1.2STM32体系架构DIP:(塑料)双列直插式封装,适用于中小规模集成电路,引脚数一般不超过100个芯片封装方式SOP:小外型表面贴片封装,广泛应用于10-40个引脚的芯片PQFP:塑料方形扁平封装,管脚很细,一般应用于大规模或超大型集成电路,引脚数一般在100个以上LQFP:薄型QFP指封装,本体厚度为1.4mm的QFPDualIn-linePackageSmallOutlinePackagePlasticQuadFlatPackageLow-profileQuadFlatPackage1.2STM32体系架构
BGA:(塑料)球栅阵列封装,Intel系列的80486和Pentium等CPU多采用这种封装方式PGA:插针网格阵列封装,有专门的PGA插座,插拔方便,常用于CPU的封装PLCC:塑封方形引脚插入式封装,外形尺寸比DIP封装小得多,必须采用SMT(表面贴装技术)进行焊接BallGridArrayPinGridArrayPackagePlasticJ-LeadedChipCarrie1.2STM32体系架构1.2.3STM32407微控制器STM32F4系列微控制器。该系列属于高性能处理器,采用Cortex-M4内核。根据性质又分为很多兼容的型号,包括入门级、基础级和高级微控制器。典型的入门级产品有STM32F401、STM32F411等,典型的基础级产品有STM32F405、STM32F407等,高级产品型号有STM32F427、STM32F427等。1.2STM32体系架构开发板实验箱1.2STM32体系架构1.2STM32体系架构总线矩阵图1-4
STM32F407的总线矩阵1.2STM32体系架构I总线(InstructionBus):指令总线,用来从存储器中传送读取的指令。D总线(DataBus):数据总线,用于连接闪存存储器数据接口(如:SRAM、FLASH等),实现各种数据访问。S总线(SystemBus):连接所有外设(如:GPIO、SPI、IIC、TIM等),用于控制各种外设工作,如配置各种外设相关寄存器等。AHB总线(AdvancedHigh-performanceBus,高级高性能总线):
时钟频率可达168MHz,最多可以支持16个主设备和任意多个从设备,主要用于重要和速度要求较高的模块(如CPU、DMA和DSP等)之间的连接。APB总线(AdvancedPeripheralBus,高级外设总线):分为APB1和APB2总线,通过总线桥与AHB总线连接,再连接周边各种低速外设,例如UART、IEEE1284并口等。其中APB1总线频率最高可达42MHz,APB2总线频率最高为84MHz。1.2STM32体系架构存储器映射对存储器分配地址的过程就叫存储器映射。ST将所有的存储器及外设资源都映射到同一个4GB地址空间,从而可以采用相同的方法访问对相关外设进行读写访问和操作控制。整个4GB的存储器空间以512MB为单位,等分为8个块(Block),前面3块的功能划分如表1-4所示。1.2STM32体系架构Block0该存储块用于存储代码,即Flash空间。对STM32F407ZGT6来说,用户Flash大小为1MB。STM32的出厂固化启动代码BootLoader也放在该区中,占用差不多31KB的Flash空间。Block1该存储块用于存储数据,即SRAM空间。这个块只使用了128KB大小,用于SRAM访问,同时也有大量保留地址用于扩展。
Block2该块用于外设访问外设,STM32中大部分的外设都是放在这个块里面的。该存储块里面包括了AHB、APB1和APB2三个总线相关的外设。1.2STM32体系架构寄存器映射寄存器(Register)是一些特殊的存储单元,通过这些存储单元可以实现对各个内部和外部资源外设的控制。1.2STM32体系架构给寄存器对应的地址单元命名的过程就叫寄存器映射。例如,在51单片机中,每个特殊功能寄存器对应一个内部RAM单元,而在reg51.h头文件中,为每个单元都定义了一个名称,在程序中只需要通过这些名称即可对相应的单元和外设进行访问控制。在STM32存储器的Block2这块区域,映射的是片上外设。该存储块以4个字节为一个单元,每一个单元对应不同的功能,当控制这些单元时就可以驱动外设工作。1.2STM32体系架构1.3GPIO外设
1.3.1GPIO的寄存器及其映射1.3.2GPIO的内部组成1.3.3GPIO的工作模式1.3GPIO外设
GPIO:GeneralPurposeInput/Output,通用输入/输出接口,每个GPIO接口对应若干引脚,STM32MCU通过这些引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集等功能。STM32的GPIO分为很多组,每组有16个引脚。不同型号的微控制器,GPIO的组数不同。例如,STM32F407Zx共有8组GPIO,分别是GPIOA~GPIOH(简写为PA~PH),对应占用芯片144个引脚中的114个IO口引脚。其中PH只有2根引脚PH0和PH1,一般不用做IO口。GPIO最基本的输出功能是由STM32控制引脚输出高低电平,从而实现开关控制。最基本的输入功能是检测外部输入电平。此外,大多数GPIO引脚都具有若干复用功能,用作其他片上外设与外部电路和设备的连接。1.3GPIO外设
1.3.1GPIO的寄存器及其映射从应用编程的角度看,STM32F4微控制器中的每组通用GPIO口由10个32位寄存器构成,具体包括——配置寄存器:MODER、OTYPER、OSPEEDR、PUPDR数据寄存器:IDR、ODR置位/复位寄存器:BSRR锁定寄存器:LCKR复用功能选择寄存器:AFRH、AFRL
1.3GPIO外设
GPIO中的常用寄存器图1-5
MODER寄存器各位的含义图1-6
ODR寄存器各位的含义1.3GPIO外设
图1-7
BSRR寄存器各位的含义将PB5置为低电平的3种方法——举例方法3:利用BRR寄实现:BRR=0x0020方法1:利用ODR实现:ODR=0xffef方法2:利用BSRR实现:BSRR=0x002000001.3GPIO外设
GPIO中的寄存器映射GPIO外设中各寄存器映射到存储器中的地址可以表示为寄存器地址=BUS_BASE_ADDR+PERIPH_OFFSET+REG_OFFSET其中右侧的3项依次为总线基地址、外设基地址偏移量、寄存器地址偏移量。所有GPIO外设都挂在AHB1总线上,总线基地址都为0x40020000。各GPIO在存储区分别映射占用连续的1KB个单元,相对于总线基地址的基地址偏移量依次为0x0000、0x0400、0x0800、…。这些偏移量与总线基地址相加,得到各GPIO外设的外设基地址。对每个GPIO外设来说,内部各寄存器都是32位,每个GPIO外设的10个寄存器按照相同的顺序分别依次映射到存储器中的4个字节单元,因此相邻两个寄存器的地址相差4。在STM32F407中,每个寄存器的地址可以由手册查得。这里以GPIOF为例,其外设的寄存器地址映射如表1-6所示。1.3GPIO外设
1.3GPIO外设
1.3.2GPIO的内部组成1.3GPIO外设
1.3.3GPIO的工作模式输入浮空模式:IO引脚电平完全由外部电路决定。如果IO引脚没有连接其他的设备,那么检测其输入电平是不确定的。该模式可以用于按键检测等场景。上拉输入模式(Pull-up):上拉电阻导通,施密特触发器打开,引脚外部无输入时读取的引脚输入电平为高电平。下拉输入模式(Pull-down):下拉电阻导通,施密特触发器打开,引脚外部无输入时读取的引脚输入电平为低电平。输入模式1.3GPIO外设
每个GPIO引脚的3种输入模式利用PUPDR的每2位来设置。当两位分别配置为00、01和10时,分别配置引脚为无上拉/下拉、上拉、下拉模式。1.3GPIO外设
推挽输出(Push-Pull,PP):两个MOS管受互补信号的控制,按互补对称的方式连接。两个MOS管在任何时刻一定是一个到同一个截止,因此输出有确定的高/低电平两种状态。
使用推挽输出模式的目的:增大输出电流,提高电路的负载能力和开关速度。开漏输出(Open-Drain,OD):只有下拉NMOS管没有上拉PMOS管,只能输出低电平或者处于高阻浮空状态。要输出高电平,必须外接上拉电阻。使用开漏输出的一个主要目的是实现线与功能。输出模式1.3GPIO外设
推挽输出和开漏输出模式可以通过OTYPER寄存器进行配置。该寄存器各位的格式如图1-10所示。当某位为1码时,对应的GPIO引脚配置为推挽输出模式;否则配置为开漏输出模式。由于每个GPIO外设对应的引脚只有16位,因此该寄存器也只有低16位有用。1.3GPIO外设
复用模式(AlternateFunction)1.3GPIO外设
1.3GPIO外设
PA0~PA3引脚的复用功能(查手册)1.3GPIO外设
模拟模式
在这种工作模式下,GPIO内部电路中的上下拉电阻断开,施密特触发器关闭,双MOS管也关闭。该模式用于ADC采集或者DAC输出,或者低功耗下省电。1.4STM32最小系统
1.4.1电源和复位启动电路1.4.2时钟系统与时钟电路1.4.3调试和下载电路以野火霸天虎开发板为例
1.4STM32最小系统
1.4.1电源和复位启动电路1.4STM32最小系统
复位电路包括上电复位、手动复位和看门狗复位等。图1-14为开发板的上电复位和手动复位电路。在上电瞬间,由于电容两端电压不能突变,NRST端出现短暂低电平,芯片自动复位。低电平时间由电阻和电容共同决定。在系统运行过程中,如果按下按键SW2,则NRST端产生低电平,从而实现手动复位。当工作环境比较恶劣时,嵌入式处理器运行过程中可能出现死机和跑飞的情况,此时需要使用看门狗复位电路使处理器强制复位。1.4STM32最小系统
在启动运行时,通过MCU的BOOT0和BOOT1两个引脚电平的组合,可以选择MCU系统从主存储区、系统存储区或SRAM自举启动,如表1-8所示。图1-15为开发板上的启动电路。1.4STM32最小系统
1.4.2时钟系统与时钟电路STM32的时钟系统由RCC(ResetandClockControl,复位与时钟控制器)产生和控制,为系统和各种外设提供所需的工作时钟信号,确定各外设的工作速度。在STM32中,为各种内核组件和外设设置了一个复杂的时钟系统。时钟系统确定了系统时钟的来源和产生方法、各总线时钟以及MCU内部各组件的时钟等。STM32的时钟系统1.4STM32最小系统
系统时钟绝大多数外设时钟均由系统时钟SYSCLK提供,而产生系统时钟的基准时钟源可以配置为如下3种(如图1-16所示):1.4STM32最小系统
HSI时钟:HighSpeedInternal,高速内部时钟,由内部16MHz的RC振荡器生成,可作为系统时钟或2分频后作为PLL输入。HSE时钟:HighSpeedExternal,高速外部时钟,可外接外部时钟源,或通过OSC_IN和OSC_OUT引脚外接4~26MHz晶振,通常使用25
MHz。PLLCLK:锁相环时钟,保证输出频率的稳定,也用于倍频HSI或HSE。1.4STM32最小系统
总线和外设时钟系统时钟SYSCLK经AHB预分频后得到HCLK时钟,最高168MHz;HCLK时钟或其8分频作为系统定时器时钟,或经APB预分频器分频后作为APB总线外设时钟,如图1-17所示。1.4STM32最小系统
在运行内核和外设时可选择使用外部晶振或者使用内部振荡器作为时钟源。通过多个预分频器可以灵活配置AHB、APB1和APB2总线和外设的时钟频率。AHB时钟的最大频率为168MHz,高速APB2的最大允许时钟频率为84MHz,低速APB1的最大允许频率为42MHz。通过RCC配置,既可保证各种外设采用最高的频率,也可为以太网、USBOTGFS等保证合适的时钟频率。1.4STM32最小系统
次级时钟源与实时时钟在RCC中,次级时钟源为一些专用外设提供时钟,如图1-18所示。1.4STM32最小系统
LSI(LowSpeedInternal)时钟:低速内部时钟,32kHz,用于驱动独立看门狗。LSE(LowSpeedExternal)时钟:低速外部晶振时钟,32.768kHz,用于驱动RTC(Real-TimeClock,实时时钟)。实时时钟RTC(RealtimeClock):一个独立的BCD定时器/计数器,提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。1.4STM32最小系统
时钟电路1.4STM32最小系统
1.4.3调试与下载电路1.4STM32最小系统
第2章STM32编程基础2.2.1开发方式
2.2.2开发环境2.2.3程序下载及调试运行工具2.1STM32程序开发方式与开发环境
2.1STM32程序开发方式与开发环境
1.基于寄存器的程序开发该编程方法涉及直接操作底层硬件寄存器,能够充分利用硬件资源,实现系统性能的最优化,但是对开发人员的专业知识和实践经验要求较高,设计人员必须深入理解STM32的硬件架构及其寄存器功能。该开发方式尽管难度较大,会导致代码复杂且维护困难,但为开发者提供了极大的灵活性,允许直接管理硬件资源,实现底层硬件的优化配置。在特定应用场景下,如对实时性要求极高的系统或需要精确控制硬件行为的场合,这种编程方法能够展现其独特的优势。2.1.1程序开发方式2.1STM32程序开发方式与开发环境
2.基于固件包和HAL库的STM32程序开发在STM32的开发过程中,固件包扮演着至关重要的角色。它不仅提供了硬件抽象层(Hardware-Abstraction-Layer,HAL)库,还提供了启动代码、中间件组件和示例项目等丰富资源,为开发者提供了快速启动和运行项目的捷径,大大缩短了开发周期。同时,固件包中的代码具有良好的可移植性和可维护性,这为项目的长期发展提供了保障。1)HAL库HAL库是ST公司专门为STM32系列微控制器量身打造的。基于HAL库的程序开发是在商议中开发方式的基础上,通过抽象化的方式隐藏硬件操作的复杂性,使得开发者在进行硬件交互时,能够更加便捷和高效。HAL库提供了包括时钟管理、模拟数字转换、串行外设接口通信等在内的众多硬件操作功能,这些功能都是通过高级应用程序接口(Application-ProgrammingInterface,API)函数的形式呈现给开发者的。开发者无需深入硬件底层,就可以轻松地进行硬件操作,从而大大简化了编程过程,使得快速开发和原型设计变得更加容易。2.1STM32程序开发方式与开发环境
2)STM32CubeMX为了进一步简化和方便基于HAL库的程序开发流程,ST公司还专门提出了图形化配置工具STM32CubeMX,通过图形化界面配置微控制器的各种参数,并生成初始化代码。这大大降低了开发难度,使得开发者可以更专注于应用逻辑的实现,而不是底层硬件的配置。通过这种方式,开发者可以更加高效地利用STM32的性能,实现各种复杂的功能。2.1STM32程序开发方式与开发环境
3.基于FreeRTOS的STM32程序设计FreeRTOS是一个免费且开源的实时操作系统,专门为微控制器和嵌入式系统量身打造,具备轻量级、高效性、易移植性以及强大的功能特性。该系统因其卓越的可移植性,特别适合资源受限的微控制器环境,已成为众多嵌入式开发者的首选。FreeRTOS支持多种架构下的不同型号处理器,例如STM32系列的F1、F4、F7和H7等,均可实现FreeRTOS的移植。同时,ST公司已在STM32CubeMX生态系统中集成了对FreeRTOS操作系统的支持,这显著提升了开发者学习和应用FreeRTOS操作系统的便捷性。在FreeRTOS的架构中,开发者能够更加高效地管理任务、优先级、时间片、信号量、消息队列等资源,从而使得程序结构更为清晰,代码的可维护性得到增强。此外,FreeRTOS提供了丰富的API函数,赋予开发者更大的灵活性以控制任务的创建、删除、挂起、恢复等操作,以满足多样化的应用需求。同时,FreeRTOS还支持任务间的通信机制,包括队列、信号量、二值信号量等,这使得任务间的数据交换和同步更为便捷。2.1STM32开发环境
2.1.2开发环境KeilMDK:提供了一个全面的集成开发环境,支持多种嵌式平台,支持C++和汇编语言,可以开发绝大多数的单片机嵌入式系统,拥有强大的调试功能,包括单步调试、锻炼调试、变量监视以及寄存器监视等。IAR:瑞典IARSystem公司提供的一系列软件开发工具,在界面、代码编辑以及调试和支持工具包等方面与MDK基本相同。VSCode:全称是VisualStudioCode,适用于多种编程语言,同样有断点变量监测等调试的基本功能。只需要安装相应的插件即可用于嵌入式系统开发。STM32CubeIDE:ST公司官方提供的免费软件开发工具,提供了GCC编译工具链和GDB调试工具,支持添加第三方功能插件,并集成了STM32CubeMX以便进行STM32配置和项目创建,提供了一体化工具体验,可以完成从芯片选型、项目配置、代码生成到代码编写、编译、调试和烧录的所有工作,简化了开发环境的搭建,有效地缩短了开发时间。2.1STM32开发环境
STM32Cube生态系统是针对STM32微控制器和微处理器的完整软件解决方案,不仅适用于需要STM32完整且免费的开发环境的用户,也适用于已经有IDE(包括Keil或IAR)的用户,可以轻松地集成STM32CubeMX、STM32CubeProgrammer或STM32CubeMonitor等各种组件。STM32Cube是一系列软件工具和嵌入式软件包的结合体,其中提供了一整套满足完整项目开发周期所有需求的软件工具(SoftwareTools)和嵌入式软件(EmbeddedSoftware)模块,如图2-1所示。STM32Cube生态系统2.1STM32开发环境
软件工具嵌入式软件2.1STM32开发环境
CubeIDE的下载和安装
下载和安装Java环境。Java官网,目前最新版本是V1.8.421。安装包文件名为jre-8u421-windows-x64.exe,直接双击即可安装。下载和安装CubeIDE软件。通过ST官网下载,在主页/中通过搜索stm32cubeide,在出现的页面中单击STM32CubeIDE即可跳转到下载页面,如图2-2所示。2.1STM32开发环境
2.1STM32开发环境
2.1.3程序下载及调试运行工具STM32开发过程中用到的仿真器主要有3种,即DAP、STink和JLink。DAP是ARM公司的开源仿真器,可支持STM32仿真调试,并且带有虚拟串口功能,有高速和低速两个版本,具有免驱、速度快、价格便宜等特点。STLink是ST公司生产的仿真器,支持STM32和STM8仿真调试,目前最常用的是STLinkV2,支持全面、性能稳定,并且廉价。JLink是Segger公司的仿真器,可支持STM32仿真调试,具有稳定、高速的特点,但价格偏贵。仿真器的安装和程序下载运行2.1STM32开发环境
串口工具主要包括串口下载工具和串口调试助手。串口下载工具用于将HEX文件下载到开发板或实验箱。与仿真器的主要区别在于,串口下载工具不能实现在线硬件和软件联合调试。串口调试助手用于实现PC机与MCU之间的数据传送,通常用于在进行MCU串口功能和程序调试运行过程中观察运行结果。串口工具和程序下载嵌入式开发中既有底层硬件的开发,又涉及到上层应用的开发,因此应用程序的开发将同时需要涉及系统的硬件和软件。C语言既具有汇编语言操作底层的优势,又具有高级语言功能性强的特点,特别适合作为开发首选语言。1程序总是从main函数开始执行;2345函数是C语言的基本结构;函数由两部分组成:函数说明部分和函数体。
一个C语言程序包含若干个源程序文件(.c文件)和头文件(.h文件)。采用外设功能模块化设计方法,一个外设功能模块包括一个源文件(.c文件)和一个头文件(.h文件)。2.2嵌入式C语言基础2.2嵌入式C语言基础2.2.1结构体与枚举2.2.2数据类型别名 2.2.3指针2.1.4C语言中的位操作 2.1.5预处理与条件编译结构体数据类型及变量的定义声明结构体类型的基本语法格式为:struct结构体名{ 成员列表;}变量名列表;2.2.1结构体和枚举例如,如下语句
structTYPE_USA{ intbaudRate;
intwordLength; }usart1,usart2;声明了一个名为TYPE_USA的结构体数据类型,同时定义了两个该结构体类型的变量usart1和usart2。2.2嵌入式C语言基础结构体变量可以在结构体类型申明时同时进行定义,也可以在申明之后再用其他的语句进行定义。定义结构体变量的基本语法格式为:
struct结构体名
结构体变量列表;例如,前面定义的两个结构体变量也可以用如下语句定义:
structTYPE_USAusart1,usart2;一个结构体是由多个成员变量构成的,结构体中成员变量的引用方法为:
结构体变量名.成员名
比如可以用表达式usart1.baudRate引用结构体变量usart1中的成员变量baudRate。2.2嵌入式C语言基础与数组类似,在为结构体变量分配存储空间时,结构体变量中的各成员变量将按照结构体中定义的顺序依次分配连续的存储单元,各成员变量所占用的单元数取决于其数据类型。因此,一旦确定了结构体变量存储的起始单元地址,其中每个成员变量所占用的存储单元地址也就确定了。2.2嵌入式C语言基础枚举2.2嵌入式C语言基础枚举也是一种数据类型,用于将一个变量或对象的所有可能取值逐一列出,变量取值只限于列举出来的值(枚举成员)。枚举成员具有自动编号的功能,第一个枚举成员其默认值为整型的0,后续枚举成员的值递增1。例如,如下语句typedefenum{GPIO_PIN_RESET=0, //枚举成员取值设为0GPIO_PIN_SET
//取值默认递增1等于1}GPIO_PinState;将GPIO引脚的高低电平两种状态定义为枚举类型GPIO_PinState。关键字typedef用于为现有的数据类型创建一个新的名字,称为数据类型别名,用来简化变量的定义。例如,如下语句
typedefunsignedlonguint32;将数据类型unsignedlong重新命名(别名)为uint32。利用该别名,要定义一个无符号长整型变量i,可以用如下语句实现:
uint32i=0x20000000;2.2.2数据类型别名2.2嵌入式C语言基础结构体也是一种数据类型,因此也可以用typedef为其定义一个别名。例如,如下语句typedefstructTYPE_USA{ intbaudRate; intwordLength;}USART;定义了一个结构体类型别名UASRT,之后即可用如下类似语句 USARTusart1,usart2;定义两个结构体变量usart1、usart2。2.2嵌入式C语言基础指针也是一个变量,指向给定的存储单元。利用指针变量可以在程序中对存储单元和外设寄存器等实现绝对地址访问。指针变量一般以p开头,例如,如下语句
char*p_str=“Thisisatest!”;申明了一个p_str指针,指向字符串在内存中存放的首地址。2.2.3指针2.2嵌入式C语言基础在程序中,指针变量的典型应用有两种,分别是指针变量的赋值和指针指向单元的访问,并分别用运算符“*”和“&”实现。指针变量的赋值指的是将指针所指向的变量在存储器中所在单元的地址保存到指针变量中,例如,如下语句chari;char*p;p=&i;定义了一个字符型变量i和指针变量p,第三条语句将变量i所在存储单元的地址保存到指针变量p中,从而使指针p指向变量i。2.2嵌入式C语言基础利用上述方法使指针指向了某个存储单元或者单元中存放的变量后,即可用下面的语句
*p=0x00000100;向该存储单元中存入数据0x00000100,相当于为变量i赋值。结构体指针:指向一个结构体变量。例如,如下语句
structTYPE_USA*usart1;定义了结构体指针usart1,指向前面定义的TYPE_USA结构体类型的变量usart1。
2.2嵌入式C语言基础需要注意的是,对结构体指针变量,引用其中的结构体成员变量是通过“->”符号实现的。例如,要访问usart1结构体指针指向的结构体的成员变量baudRate,必须用如下表达式:
usart1->baudRate;在嵌入式系统编程中,位运算比其他运算更常用。这是由于嵌入式系统涉及到很多有关硬件寄存器的操作,而硬件寄存器由若干位组成,每位分别具有不同的作用和含义,经常需要单独对其中指定的位进行读写操作。C语言中基本的位运算操作符有6个:&:按位与; |:按位或;^:按位异或; ~:按位取反;<<n:左移n位; >>n:右移n位。2.2.4C语言中的位操作2.2嵌入式C语言基础对变量中指定的某些二进制位赋值,而不改变其他位。
2.2嵌入式C语言基础先对需要设置的位用“&”操作符进行清零操作,然后用“|”操作符进行赋值。例如:
GPIOA->MODER&=0xfffffbf;//将GPIOA-MODER中的D6位清零GPIOA->MODER|=0x00000040; /*设置D6位的值为1*/
利用移位操作提高代码的可读性2.2嵌入式C语言基础例如,
GPIOA->MODER|=1<<1;//将MODER中的D1位置1同样的功能,改用如下语句实现:
GPIOA->MODER|=0x0002;//可读性差,修改麻烦。
按位取反操作的使用技巧
2.2嵌入式C语言基础按位取反在设置寄存器的时候经常被使用,常用于清除指定寄存器中的某一位或某几个位。例如,下面的语句
GPIOA->MODER&=~(1<<0); /*关闭SYSTICK*/该语句仅设置MODER寄存器的D0位为0,其他位的值保持不变,实现的功能与下面的语句等效:GPIOA->MODER&=0XFFFFFFFE; /*关闭SYSTICK*/显然前者的可读性和可维护性都要比后者好。按位异或操作的使用技巧
2.2嵌入式C语言基础该功能非常适合用于控制某个位翻转,常见的应用场景就是控制LED闪烁。例如,如下语句
GPIOB->ODR^=1<<5;每执行一次,就会使PB5引脚的输出状态翻转一次,如果将LED接在PB5上,就可以看到LED闪烁一次,即亮/灭状态切换一次。
预处理
在编译之前所做的工作,由预处理程序负责完成,编译时系统将自动引用预处理程序对源程序中的预处理部分进行处理。
2.2.5预处理与条件编译2.2嵌入式C语言基础预处理通常用命令define实现,该命令一般放在程序文件的前面,用于将一个标识符(宏名,常量等)定义为一个字符串(替换文本)或常数值,称为宏常量。宏定义的一般格式为:
#define标识符
表达式
其中,“标识符”为所定义的宏常量名,一般全部用大写字母;
“表达式”可以是常数、表达式、格式串等。2.2嵌入式C语言基础例如:
#defineHSE_VALUE0x80000000U //定义宏常量预处理命令定义的宏也可以带有参数,称为宏函数。预处理命令定义的宏也可以带有参数,称为宏函数。例如,
#defineIS_GPIO_SPEED(SPEED)((SPEED==GPIO_SPEED_FREQ_LOW) ||(SPEED==GPIO_SPEED_FREQ_MEDIUM) ||(SPEED==GPIO_SPEED_FREQ_HIGH) ||(SPEED==GPIO_SPEED_FREQ_VERY_HIGH))嵌入式C语言常使用条件编译,通过条件判断来确定是否对某段源程序进行编译。一般用在头文件或文件开头部分。条件编译的用途:可以用源程序产生不同版本。条件编译说明#if条件编译命令,如果#if后面的表达式为true,则执行语句#ifdef判断某个宏是否被定义,若被定义,则执行语句#ifndef判断某个宏是否未被定义,若未被定义,则执行语句,与#ifdef相反#elif#else指令用于#if指令之后,当#if指令的条件不为真时,就编译#else后面的代码,elif相当于elseif#endif条件编译的结束命令,用在#if、#ifdef、#ifndef之后常用的条件编译命令条件编译2.2嵌入式C语言基础例如,如果选择了器件***405xx,则编译时包含该器件的头文件;否则,……:#ifdefined(STM32F405xx)
#include"stm32f405xx.h"……#elifdefined(STM32F407xx)
#include"stm32f407xx.h"……#else#error"PleaseselectfirstthetargetSTM32F4xxdeviceusedinyourapplication(instm32f4xx.hfile)"#endif如果没有定义***头文件,就定义该头文件:#ifndef__STM32F4xx_HAL_GPIO_H
#define__STM32F4xx_HAL_GPIO_H告诉编译器:如果是C++代码,下面的代码是用C语言编写的,应该用C语言规则调用:#ifdef__cplusplus
extern"C"{#endif2.2嵌入式C语言基础2.3基于寄存器的STM32程序设计
在基于寄存器的程序开发方式中,通过查阅官方用户手册对所需外设内部的寄存器组成、结构及各位的功能和含义说明,利用程序配置和访问相应的寄存器,从而实现相应的功能。设计步骤——创建和指定工作空间新建工程新建文件并编写程序工程配置、编译和下载运行2.3基于寄存器的STM32程序设计
2.3基于寄存器的STM32程序设计
2.3基于寄存器的STM32程序设计
2.3基于寄存器的STM32程序设计
【实践案例2-1】基于寄存器的STM32程序设计本案例要求实现的功能是点亮开发板上的一个LED。在开发板中,利用GPIOF端口的PF6、PF7和PF8引脚分别连接了红、绿、蓝三种颜色的LED,相关硬件电路如图2-9所示。2.3基于寄存器的STM32程序设计
新建工程选择目标器件2.3基于寄存器的STM32程序设计
头文件reg.h在工程浏览器中单击Inc文件夹,再单击File/New/HeaderFile菜单命令,在弹出的NewHeaderFile(新建头文件)对话框中,确认Sourcefolder为工程ex2_1下的Inc文件夹,并输入头文件名(Headerfile)为reg.h,如图2-10所示。2.3基于寄存器的STM32程序设计
头文件reg.h用于定义有关GPIO寄存器映射的代码,相当于C51程序中的reg51.h和reg52.h头文件。#definePERIPH_BASE ((unsignedint)0x40000000) //片上外设基地址
#defineAHB1PERIPH_BASE (PERIPH_BASE+0x00020000) //总线基地址
#defineRCC_BASE (AHB1PERIPH_BASE+0x3800) //RCC外设基地址
#defineRCC_AHB1ENR *(unsignedint*)(RCC_BASE+0x30) //RCC寄存器地址映射
#defineGPIOF_BASE (AHB1PERIPH_BASE+0x1400) //GPIOF外设基地址
#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00) //GPIOF寄存器地址映射
#defineGPIOF_OTYPER *(unsignedint*)(GPIOF_BASE+0x04)#defineGPIOF_OSPEEDR *(unsignedint*)(GPIOF_BASE+0x08)#defineGPIOF_PUPDR *(unsignedint*)(GPIOF_BASE+0x0C)#defineGPIOF_IDR *(unsignedint*)(GPIOF_BASE+0x10)#defineGPIOF_ODR *(unsignedint*)(GPIOF_BASE+0x14)#defineGPIOF_BSRR *(unsignedint*)(GPIOF_BASE+0x18)#defineGPIOF_LCKR *(unsignedint*)(GPIOF_BASE+0x1C)#defineGPIOF_AFRL *(unsignedint*)(GPIOF_BASE+0x20)#defineGPIOF_AFRH *(unsignedint*)(GPIOF_BASE+0x24)2.3基于寄存器的STM32程序设计
以GPIO的模式寄存器为例,相应的寄存器映射宏定义语句为:
#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00)等价于如下语句:p=(unsignedint*)(GPIOF_BASE+0x00)
#defineGPIOF_MODER *p则
GPIOF_MODER=0x00001000;等价于 *p=0x00001000;实现的功能是将指针p指向的存储单元(即GPIOF_MODER寄存器)赋值为0x00001000,从而设置GPIOF外设的引脚PF6为输出模式。2.3基于寄存器的STM32程序设计
#include<reg.h> /*导入寄存器映射头文件*/intmain(void){ RCC_AHB1ENR |=(1<<5); /*开启GPIOF时钟*/ GPIOF_MODER &=~(0x03<<(2*6)); GPIOF_MODER |=(1<<2*6); /*PF6MODER6=01b输出模式*/ GPIOF_OTYPER &=~(1<<1*6); GPIOF_OTYPER |=(0<<1*6); /*PF6OTYPER6=0b推挽模式*/ GPIOF_OSPEEDR &=~(0x03<<2*6); GPIOF_OSPEEDR |=(0<<2*6); /*PF6OSPEEDR6=0b速率2MHz*/ GPIOF_PUPDR &=~(0x03<<2*6); GPIOF_PUPDR |=(1<<2*6); /*PF6PUPDR6=01b上拉模式*/ GPIOF_BSRR =(1<<16<<6); /*PF6引脚输出低电平,点亮红灯*/ for(;;);}源文件(主程序文件)main.c2.3基于寄存器的STM32程序设计
例如,如下语句GPIOF_MODER&=~(0x03<<(2*6)); 使GPIOF_MODER寄存器中的D13D12位清零,而其余位保持不变。之后,再执行如下语句GPIOF_MODER|=(1<<2*6); 将GPIOF_MODER将D12位置位,其余所有位清零。MODER寄存器各位的含义2.3基于寄存器的STM32程序设计
例如,如下语句GPIOF_BSRR=(1<<16<<6);由PF6引脚复位,输出低电平,以点亮开发板上的红色LED。类似地,如下语句: GPIOF_BSRR=(1<<6); 使PF6引脚输出高电平,从而熄灭红灯。BSRR寄存器各位的含义2.3基于寄存器的STM32程序设计
根据上述介绍对工程属性进行配置,之后在工程浏览器中单击工程名,再单击工具栏上的Build按钮,编译工程。编译成功后,利用FlyMcu工具将Debug文件夹中的HEX文件下载到开发板,即可启动运行。工程配置、编译和下载运行2.3基于寄存器的STM32程序设计
【照猫画虎2-1】基于寄存器的STM32程序设计修改程序,实现开发板绿色或蓝色LED的闪烁。提示:在开发板中,绿色和蓝色LED分别接在STM32F07MCU的PF7和PF8引脚,当引脚输出低电平时,LED点亮。2.4库的创建2.4.1GPIO外设的封装与结构体定义2.4.2GPIO操作函数的创建【实践案例2-2】利用自定义库函数点亮LED【照猫画虎2-2】GPIO操作访问函数的定义2.4库的创建2.4.1GPIO外设的封装与结构体定义/*reg.h头文件*/#definePERIPH_BASE ((unsignedint)0x40000000) //片上外设基地址
#defineAHB1PERIPH_BASE (PERIPH_BASE+0x00020000) //总线基地址
#defineRCC_BASE (AHB1PERIPH_BASE+0x3800) //RCC外设基地址
#defineRCC_AHB1ENR *(unsignedint*)(RCC_BASE+0x30) //RCC寄存器地址映射#defineGPIOF_BASE (AHB1PERIPH_BASE+0x1400) //GPIOF外设基地址
#defineGPIOF_MODER *(unsignedint*)(GPIOF_BASE+0x00)//GPIOF寄存器映射
#defineGPIOF_OTYPER *(unsignedint*)(GPIOF_BASE+0x04)#defineGPIOF_OSPEEDR *(unsignedint*)(GPIOF_BASE+0x08)……
GPIO外设结构体和结构体指针定义删除2.4库的创建typedefstruct{ /*GPIO外设结构体定义
*/ __IO uint32_tMODER; /*GPIO模式寄存器*/ __IO uint32_tOTYPER; /*GPIO输出类型寄存器*/ __IO uint32_tOSPEEDR; /*GPIO输出速度寄存器
*/ __IO uint32_tPUPDR; /*GPIO上拉/下拉寄存器*/ __IO uint32_tIDR; /*GPIO输入数据寄存器*/ __IO uint32_tODR; /*GPIO输出数据寄存器*/ __IO uint16_tBSRRL; /*GPIO置位/复位寄存器低16位*/ __IO uint16_tBSRRH; /*GPIO置位/复位寄存器高16位*/ __IO uint32_tLCKR; /*GPIO配置锁定寄存器*/ __IO uint32_tAFR[2]; /*GPIO复用功能配置寄存器*/}GPIO_TypeDef;2.4库的创建考虑到外设寄存器的地址都是基于外设基地址的偏移地址,都是在外设基地址上逐个连续递增的,每个寄存器为32个字节,占用连续的4个字节存储单元。这种方式跟结构体里面的成员类似,所以可以定义一种结构体,将外设中各寄存器顺序作为结构体的成员变量。如果设置结构体的地址等于外设的基地址,则可以通过结构体访问外设中的全部寄存器。2.4库的创建/*定义GPIO外设结构体指针*/#defineGPIOF((GPIO_TypeDef*)GPIOF_BASE)其中通过强制类型转换将GPIOF_BASE转换为指向GPIO_TypeDef结构体类型的指针,并将其定义为GPIOF宏,代表GPIOF外设。通过对该宏的操作,即可访问GPIOF外设中的寄存器。2.4库的创建GPIO的初始化结构体在使用各种外设之前,都需要配置其工作模式、设置一些必须的参数等。在基于寄存器的开发方式中,为了对外设进行初始化,也需要查阅大量的手册和资料。为了方便,还是希望将这些初始化操作及所需的参数等定义和封装为库的一部分。不同外设的初始化所需配置的参数各不相同,因此一般将初始化所需的参数、数据等分别定义在不同的外设配置文件中。这里新建两个文件gpioInit.h和gpioInit.c,用于存放GPIO外设相关的初始化定义和封装代码。2.4库的创建GPIO工作模式的定义(gpioInit.h)typedefenum
{GPIO_Mode_IN =0x00, /*输入模式*/GPIO_Mode_OUT =0x01,
/*输出模式*/GPIO_Mode_AF =0x02,
/*复用模式*/GPIO_Mode_AN =0x03
/*模拟模式*/}GPIOMode_TypeDef;typedefenum{GPIO_OType_PP =0x00,
/*推挽模式*/GPIO_OType_OD =0x01 /*开漏模式*/}GPIOOType_TypeDef;……2.4库的创建初始化结构体的定义/*GPIO初始化结构体类型定义*/typedefstruct{uint32_t
GPIO_Pin;
/*选择要配置的GPIO引脚*/GPIOMode_TypeDef GPIO_Mode;
/*选择GPIO引脚的工作模式*/GPIOSpeed_TypeDefGPIO_Speed;
/*选择GPIO引脚的速率*/GPIOOType_TypeDefGPIO_OType;
/*选择GPIO引脚输出类型*/GPIOPuPd_TypeDef GPIO_PuPd;
/*选择GPIO引脚的上/下拉模式*/}GPIO_InitTypeDef;2.4库的创建GPIO引脚定义在上述结构体中,第一个成员用于指定需要初始化配置的GPIO引脚,为了方便,将这些代表引脚的取值常数定义为如下16个宏:#defineGPIO_PIN_0 ((uint16)(1<<0))#defineGPIO_PIN_1 ((uint16)(1<<1))#defineGPIO_PIN_2 ((uint16)(1<<2))#defineGPIO_PIN_3 ((uint16)(1<<3))……#defineGPIO_PIN_15 ((uint16)(1<<15))#defineGPIO_PIN_All ((uint16)0xFFFF)2.4库的创建2.4.2GPIO操作函数的创建前面定义了GPIO外设结构体,在此基础上即可使用函数来封装对GPIO外设的基本操作,所有对GPIO寄存器的操作访问都可以通过调用这些函数进行,而不再需要寄存器的地址和位格式等信息。GPIO的操作函数主要包括对GPIO引脚的初始化和GPIO引脚的读写访问等。这些函数都将定义在gpioInit.c文件中,而在对应的gpioInit.h头文件中,需要对这些函数做原型声明。2.4库的创建在头文件gpioInit.h中,添加GPIO操作函数的原型声明:此外,在gpioInit.h文件中还需要添加如下代码,将GPIO寄存器映射头文件reg.h包含进来:#include"reg.h"之后再将gpioInit.h导入gpioInit.c文件。voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16GPIO_Pin);voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,ui
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026日本机器人应用行业市场供需分析及投资评估规划分析研究报告
- 2026人工智能行业核心技术与市场竞争策略分析
- 2026中国智能门禁系统行业市场现状分析供需研究及投资布局前景规划评估报告
- 2026汽车零部件产业集群发展力度分析核心配套企业竞争力评价投资结构规划研究
- 2026Fast芯片组产品质量标准与可靠性提升
- 2026年绿化与建筑一体化:植物生长模拟优化立体空间设计技术方案
- 2021加强和改进新时代职工思想政治工作体会
- 2026汽车驾驶辅助系统市场趋势研究与前沿技术发展与应用
- 2021高一班主任第一学期工作计划范文
- 2026柔性电子皮肤芯片技术研发进展与可穿戴设备应用展望
- 急救知识护理课件
- 《运动康复技术》课件-Bobath技术
- 军队文职项目培训
- 中国药物性肝损伤诊治指南(2023版)解读课件
- 超导材料制备与特性-深度研究
- 《多样的中国民间美术》课件 2024-2025学年人美版(2024)初中美术七年级下册
- DBJ51T 175-2021 四川省玄武岩纤维及其复合材料应用技术标准
- 《浙江省环境污染防治工程专项设计服务能力评价指南》
- 医疗器械采购、配置、验收与使用管理制度
- 食品加工安全生产管理制度
- 聚合工艺作业安全培训课件
评论
0/150
提交评论