《嵌入式系统及应用(含实验)》实验讲义_第1页
《嵌入式系统及应用(含实验)》实验讲义_第2页
《嵌入式系统及应用(含实验)》实验讲义_第3页
《嵌入式系统及应用(含实验)》实验讲义_第4页
《嵌入式系统及应用(含实验)》实验讲义_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电气工程专业实验中心嵌入式系统及应用实验讲义向军编电气工程学院2025年4月嵌入式系统及应用实验讲义目录TOC\o"1-3"\h\u12808实验硬件平台和软件工具简介 114629硬件平台 127439软件工具 15089实验1基于寄存器的STM32程序开发实验 624206【实验目的】 627817【实验环境】 6672【实验内容】 68148【实验原理】 62842【实验步骤】 88213【扩展实验】 915983【实验报告】 926225实验2STM32固件库的创建实验 1021605【实验目的】 1019213【实验环境】 103646【实验内容】 1021792【实验原理】 1032072【实验步骤】 1217365【扩展实验】 1321202【实验报告】 1324289实验3基于HAL库的STM32程序设计实验 1411473【实验目的】 1421780【实验环境】 1411461【实验内容】 1424627【实验原理】 1421142【实验步骤】 1724792【扩展实验】 179087【实验报告】 1831284实验4STM32外部中断实验 199545【实验目的】 1913531【实验环境】 1914434【实验内容】 1910505【实验原理】 1928557【实验步骤】 2129701【扩展实验】 2214917【实验报告】 226528实验5SysTick定时器实验 237944【实验目的】 2314641【实验环境】 2327940【实验内容】 23500【实验原理】 2318874【实验步骤】 2522324【扩展实验】 2523061【实验报告】 26626实验6串口数据收发实验 277565【实验目的】 2723067【实验环境】 2723422【实验内容】 2720505【实验原理】 2728205【实验步骤】 3111701【扩展实验】 3114726【实验报告】 3112231实验7温度采集实验 3221785【实验目的】 323410【实验环境】 3227337【实验内容】 321010【实验原理】 326139【实验步骤】 368393【扩展实验】 3619792【实验报告】 3729139实验8ADC和定时器实验 3818741【实验目的】 3827328【实验环境】 3827584【实验内容】 3825034【实验原理】 3822204【实验步骤】 4227687【扩展实验】 428913【实验报告】 4224318实验9基于FreeRTOS的STM32程序开发实验 4331529【实验目的】 438454【实验环境】 4315106【实验内容】 436724【实验原理】 4317677【实验步骤】 4414969【扩展实验】 4519084【实验报告】 455186实验10FreeRTOS任务创建实验 4610373【实验目的】 4614840【实验环境】 4629588【实验内容】 4613012【实验原理】 4620239【实验步骤】 4920956【扩展实验】 5021156【实验报告】 5017838实验11FreeRTOS任务调度实验 516556【实验目的】 5112063【实验环境】 5112636【实验内容】 5115939【实验原理】 512279【实验步骤】 544196【扩展实验】 5420837【实验报告】 557910实验12FreeRTOS中断管理实验 564【实验目的】 5620023【实验环境】 5625511【实验内容】 5625903【实验原理】 565436【实验步骤】 5714485【扩展实验】 5832700【实验报告】 5829601实验13消息队列及程序设计实验 5925880【实验目的】 5928079【实验环境】 5912196【实验内容】 5916009【实验原理】 597100【实验步骤】 623563【扩展实验】 6325530【实验报告】 6316425实验14计数信号量及程序设计实验 6410358【实验目的】 6428972【实验环境】 6425318【实验内容】 6430742【实验原理】 6420375【实验步骤】 6616723【扩展实验】 672837【实验报告】 6731199实验15互斥量及程序设计实验 683714【实验目的】 687686【实验环境】 6830182【实验内容】 6820207【实验原理】 681538【实验步骤】 7011696【扩展实验】 7121926【实验报告】 7112213实验16事件组及程序设计实验 7216328【实验目的】 727807【实验环境】 7222530【实验内容】 7223734【实验原理】 7225687【实验步骤】 7520460【扩展实验】 7631410【实验报告】 76实验硬件平台和软件工具简介硬件平台本课程实验采用华清远见公司的FS-6818M4嵌入式AMR实验箱,该实验箱采用底板+核心板+外设模块板构成,能够实现MCU裸机实验和基于嵌入式操作系统FreeRTOS、Linux、Android的嵌入式系统应用实验。实验箱对应的核心板基于Corte-M4内核的STM32F407IGT6嵌入式微控制器为核心设计,模块结构和核心板分别如图0-1、图0-2所示。图0-1实验箱模块结构图0-2M4核心板软件工具本课程实验内容包括基于HAL库和基于FreeRTOS的MCU应用系统设计与开发,实验中主要用到STM32CubeIDE集成开发环境、STLink仿真器和串口工具。CubeIDE的下载和安装安装STM32CubeIDE之前需要先安装Java环境。在Java官网可以下载最新的Java软件安装包,目前最新版本是V1.8.421。安装包文件名为jre-8u421-windows-x64.exe,直接双击即可安装,安装过程中可以选择安装到硬盘的合适位置。CubeIDE软件可以通过ST官网下载。在官网主页/左上角单击搜索按钮,并在搜索框中输入stm32cubeide,在出现的页面中单击STM32CubeIDE即可跳转到下载页面,如图0-3所示。在下载页面中向下滚动,找到下载文件列表。在图中找到STM32CubeIDE-Win版本所在行,单击GetLatest按钮即可开始下载。如果跳转到本地站点,则该列表用中文显示。图0-3CubeIDE下载页面目前CubeIDE最新版本是1.17.0,下载得到的安装包压缩文件名为en.st-stm32cubeide_1.17.0_……_x86_64.exe.zip,解压后双击其中的应用程序文件即可启动CubeIDE的安装,安装过程中可以指定安装文件夹,注意路径中不能有中文字符。固件包的下载和安装为了实现基于固件包和HAL库的程序开发,除了上述CubeIDE集成开发环境以外,还需要安装固件包。以STM32F407系列MCU为例,在ST公司官网主页搜索框中输入CubeF4,在跳转的页面中单击查找到的STM32CubeF4,在跳转页面再单击Getlatest按钮,即可进入F4系列MCU固件包下载页面,如图0-4所示。注意此时需要联网并用实际邮箱进行注册登录。图0-4CubeF4固件包下载页面目前STM32F4系列MCU固件包最新版本为V1.28.0。图中的第一行为补丁包,两个固件包下载后都是压缩文件,文件名分别为en.stm32cubef4-v1-28-0.zip和en.stm32cubef4-v1-28-1.zip。为了安装固件包,启动CubeIDE窗口后,单击Help/ConfigurationTool菜单下的ManageEmbeddedSoftwarePackages菜单命令,打开嵌入式软件包管理器如图0-5所示。注意在启动过程中,将提示指定硬盘上事先创建好的一个文件夹作为CubeIDE的工作区(Workspace)。此时可以用默认设置,进入CubeIDE窗口后再切换到期望的工作区。图0-5CubeIDE中的固件包管理器在CubeIDE的固件包管理器中单击进入STM32CubeMCUPakages选项卡,其中将列出所有STM32系列MCU可用的固件包。注意第一次使用时,可能需要联网并先单击Help/STM32CubeUpdates/CheckforEmbeddedSoftwarePackagesUpdates菜单命令。单击相应的版本,将在窗口下方显示该版本的主要特性等信息。此外,每个版本前面有一个小方框,方框中如果有颜色填充,表示已经安装有相应的固件包;否则,表示相应版本的固件包还没有安装。图中显示已经安装了V1.28.0版本,但还未没有安装V1.28.1版本。在固件包管理器下方,单击按钮FromLocal,可以安装事先下载的固件包,也可以单击Install按钮在线下载和安装。此外,在某行前面的小方框中单击后出现一个红色小叉,再单击Remove按钮,可以将选中的固件包卸载和删除。CubeIDE的固件包默认安装在C:\Users\用户名\STM32Cube\Repository文件夹,通过CubeIDE主窗口中的Window/Preferences菜单命令,在打开的对话框中STM32Cube/FirmwareUpdater选项可以指定固件包安装到硬盘上的其他位置。安装成功后,在该文件夹中即可找到相应的固件包文件夹,例如STM32Cube_FW_F4_V1.28.0文件夹中存放的是V1.28.0版本的固件包。如果是离线下载安装,将下载的安装包直接解压,也可以得到相同的固件包文件夹。仿真器的安装和程序下载运行图0-6ST-LINK仿真器STM32开发过程中用到的仿真器主要有3种,即DAP、STink和JLink。DAP是ARM公司的开源仿真器,可支持STM32仿真调试,并且带有虚拟串口功能,有高速和低速两个版本,具有免驱、速度快、价格便宜等特点。STLink是ST公司生产的仿真器,支持STM32和STM8仿真调试,目前最常用的是STLinkV2,支持全面、性能稳定,并且廉价。JLink是Segger公司的仿真器,可支持STM32仿真调试,具有稳定、高速的特点,图0-6ST-LINK仿真器实验箱采用的是ST-LINK/V2仿真器,其安装过程如下。(1)将ST-LINK仿真器(如图0-6所示)插入电脑USB接口和实验箱核心板上的ST-LINK插座。(2)打开Windows设备管理器,找到“通用串行总线控制器”下面的STM32STLink。注意:不同的Windows系统可能显示的位置及设备名称有所不同。(3)右键点击STM32STLink,选择更新驱动程序。浏览找到软件,找到“ST-Link驱动及工具”文件夹中的驱动文件st-link_v2_usbdriver,安装驱动。仿真器安装成功后,将在设备管理器中显示相应的设备。注意打开实验箱上的电源。此时,在CubeIDE主窗口的Help菜单下单击“ST-LINK更新”命令,在打开的对话框(如图0-7所示)中将列出仿真器。如果有可用的更新驱动程序,可以单击对话框中的Update按钮进行更新。图0-7CubeIDE中的仿真器驱动程序更新对话框通过仿真器可以将程序下载到实验箱,并对程序进行调试运行。在CubeIDE中将工程编译成功后,单击Run菜单中的RunConfigurations命令,将打开如图0-8所示运行配置对话框。在对话框左侧的列表中确认选中需要运行的工程,在右侧的所有选项都取默认设置即可。之后,单击对话框右下角的Run按钮,启动运行。图0-8CubeIDE中的运行配置对话框除了上述全速运行程序以外,通过Run/Debug菜单命令也可进入调试模式,对程序进行调试运行。在调试模式下,主窗口工具栏中将出现Stepinto(步入)、Stepover(跨过)、Terminate(终止)等按钮,对程序运行过程进行控制。串口工具串口工具主要包括串口下载工具和串口调试助手。串口下载工具用于将CubeIDE中生成的HEX文件下载到开发板或实验箱。与仿真器的主要区别在于,串口下载工具不能实现在线硬件和软件联合调试。串口调试助手用于实现PC机与MCU之间的数据传送,通常用于在进行MCU串口功能和程序调试运行过程中观察运行结果。串口调试助手是一种串口调试工具,支持常用各种波特率及自定义波特率,可以自动识别串口,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符,可以任意设定自动发送周期,并能将接收数据保存成文本文件,能发送任意大小的文本文件。串口调试助手有很多版本,本书后面案例中使用的是开发板提供的“野火串口调试助手v1.3”,该软件无需安装,可以直接启动使用。启动该软件后,会自动识别到USB转串口线,如图0-9所示。注意左上角“串口设置”中的串口号、波特率等必须与Windows设备管理器中的设置一致。图0-9串口调试助手在程序运行过程中,单击调试助手窗口左上角的“打开串口”按钮,即可以将串口调试助手与电脑上的串口连接,从而实现串口数据的收发。在“发送设置”和“接收设置”中,需要做的主要设置是发送和接收数据的格式,可以是ASCII码或者十六进制(HEX)。启动程序运行后,在串口调试助手的下方发送框中输入若干数据。回车或单击“手动发送”按钮后,即可将所输入的数据发送到开发板的串口。如果在控制程序中执行串口发送数据的操作,这些数据将由开发板通过USB转串口线送入PC机,因此对调试助手来说,是接收这些数据(RECVHEX),这些数据将显示在调试助手上方的接收框中。

实验1基于寄存器的STM32程序开发实验【实验目的】掌握开发和实验环境的搭建方法了解基于寄存器的STM32程序设计方法掌握STMCubeIDE软件的基本设计流程和设计步骤【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE集成开发软件【实验内容】基于寄存器开发方式创建工程并编写应用程序,实现实验箱中蜂鸣器的鸣响。【实验原理】在实验平台中,蜂鸣器位于传感器模块中,其原理接线如图1-1所示。图1-1开发平台上的蜂鸣器硬件连接本实验要求采用基于寄存器的开发方法,利用嵌入式C语言程序直接访问GPIOG外设PG中的寄存器,从而通过PG6引脚输出高低电平并控制蜂鸣器的鸣响。1.外设寄存器映射本实验需要用到两个外设,即复位和时钟控制器RCC和PG,两个外设都挂接在AHB1上。AHB1总线基地址为0x40020000,而RCC和PG外设相对于AHB1总线基地址的偏移量分别为0x3800和0x1800。对RCC来说,本实验主要用到其中的寄存器AHB1ENR,该寄存器相对于RCC外设基地址的偏移量为0x30。PG内部的10个寄存器按照如下顺序映射到存储器的Block2区:MODER、OTYPER、OSPEEDR、PUPDR、IDR、ODR、BSRR、LCKR、AFRL和AFRH,其中每个寄存器占用连续4个字节存储单元,顺序映射到PG外设基地址开始的40个字节单元。为便于实现绝对地址访问,可以将上述各寄存器的地址定义为相应的宏指针。本实验中只需要用到AHB1ENR和PG6的MODER、OTYPER寄存器。为此,新建一个头文件reg.h,并在其中定义上述总线基地址和寄存器地址如下:#defineAHB1PERIPH_BASE(unsignedint)0x40020000 /*AHB1总线基地址*/#defineRCC_BASE AHB1PERIPH_BASE+0x3800 /*RCC基地址*/#defineRCC_AHB1ENR *(unsignedint*)(RCC_BASE+0x30)/*RCC的AHB1ENR寄存器地址映射*//*GPIOG寄存器地址映射*/#defineGPIOG_BASE AHB1PERIPH_BASE+0x1800 /*PG外设基地址*/#defineGPIOG_MODER *(unsignedint*)(GPIOG_BASE+0x00) /*PG_MODER寄存器地址映射*/#defineGPIOG_OTYPER *(unsignedint*)(GPIOG_BASE+0x04) /*OTYPER寄存器地址映射*/#defineGPIOG_ODR *(unsignedint*)(GPIOG_BASE+0x14) /*PG_ODR寄存器地址映射*/2.外设寄存器的访问做了上述外设寄存器定义后,在程序中即可直接访问各寄存器,实现GPIO引脚的初始化配置、控制输出的高低电平。(1)GPIO外设总线时钟的开启在应用系统中要用到某个外设,必须开启该外设的总线时钟。本实验只用到GPIOG外设,通过访问RCC中的寄存器AHB1ENR,设置其中的D6位为1,即可开启GPIOG时钟。参考代码如下:RCC_AHB1ENR|=(1<<6); /*开启GPIOG时钟*/(2)PG6引脚的初始化配置根据硬件电路连接,PG6应配置为推挽输出模式,工作速度和上下拉模式无需配置。为此,只需要设置GPIOG_MODER和GPIOG_OTYPER两个寄存器中的对应位即可。上述两个寄存器的格式如图1-2(a)和(b)所示,具体各位表示的含义可以查阅《STM32F4xx中文参考手册》。(a)GPIOG_MODER寄存器(b)GPIOG_OTYPER寄存器图1-2GPIOG外设的寄存器以设置PG6推挽输出模式为例,可以利用如下语句直接访问MODER和OTYPER寄存器实现:GPIOG_MODER&=~(0x03<<(2*6));GPIOG_MODER|=(1<<2*6); /*设置PG6为输出模式*/GPIOG_OTYPER&=~(1<<1*6);GPIOG_OTYPER|=(0<<1*6); /*PG6为推挽模式*/(3)蜂鸣器的鸣响控制本实验箱中的蜂鸣器为无源蜂鸣器,当PG6输出周期方波时,蜂鸣器发出频率等于方波频率的声音;当PG6输入恒定的高电平或低电平时,蜂鸣器都不会鸣响。因此,只需要通过程序控制PG6引脚输出高低电平每隔一段时间翻转一次,即可控制蜂鸣器发出不同音调的声音。高低电平翻转的时间间隔可以利用延时函数实现。注意适当设置调用delay()函数时的参数d取值,否则蜂鸣器发出的声音频率太高或太低,人耳无法听到。为了控制PG6输出高低电平,可以分别通过访问GPIO外设中的寄存器ODR或BSRR实现。本实验要求利用寄存器ODR实现访问控制,为此只需要通过程序向其中写入一个32位无符号常数,其中的D6位分别设为1或0,即可控制PG6分别输出高电平和低电平。参考代码如下:while(1){GPIOG_ODR&=~(1<<6); /*PG6输出低电平,蜂鸣器鸣响*/delay(5000);GPIOG_ODR|=(1<<6); /*PG6输出高电平,蜂鸣器停响*/delay(5000);}上述代码中的延时函数delay()参考代码如下:voiddelay(unsignedintd){volatileunsignedinti=0;while(i<d)i++;}【实验步骤】1.实验预习熟悉实验原理,分析实验原理中所给的参考代码,并编写所需的其他程序代码。2.新建工程首先在硬盘上合适位置新建一个文件夹,本课程后续所有实验代码都将存放在该文件夹中。启动CubeIDE时,在启动过程中根据提示设置新建的文件夹作为工作空间(Workspace)。也可以在启动CubeIDE后通过File/Switchworkspace菜单命令重新指定工作空间。(1)在CubeIDE窗口单击File/New/STM32Project菜单命令,新建STM32工程。在弹出的TargetSelection对话框中选择与实验箱上相同型号的STM32F407IGT6MCU。单击对话框右下角的Next按钮,在弹出的对话框(如图1-3所示)中输入工程名(ProjectName),在TargetedProjectType组中勾选Empty,表示创建一个空的STM32工程。图1-3工程设置对话框单击Finish按钮后返回到CubeIDE主窗口,如图1-4所示。在窗口左侧的工程浏览器(ProjectExplorer)中已经自动创建了工程文件夹exp1和Inc、Src、Startup等子文件夹,以及主程序文件main.c等文件。图1-4新建工程后的CubeIDE主窗口和工程浏览器3.新建头文件和源文件(1)在工程浏览器中右击工程名,在弹出的菜单中单击New/HeaderFile菜单命令,创建头文件reg.h。在弹出的对话框中,确认文件存放的子文件夹位置为Inc,并设置文件名和头文件格式模板。注意:①文件名中必须包括后缀.h;②头文件格式模板选择为NONE,表示不需要模板,只是创建一个空白文件。(2)打开reg.h文件,在其中编写实验原理中的参考代码。(3)打开Src文件夹中的主程序文件main.c,将其中的代码全部删除,另外编写代码控制蜂鸣器的鸣响。4.程序编译、下载、运行编译成功后,默认将生成与工程同名的elf文件,并存放在Debug子文件夹中。此时,单击工具栏上的Run或Debug按钮,即可自动下载程序,并启动调试或运行。【扩展实验】实验箱中有一个按键K4接在PF11引脚上,当按下按键时PF11输入低电平,松开按键后PF11变为高电平。修改程序实现如下功能:当按动K4按键时,蜂鸣器停止鸣响。【实验报告】1.查阅资料,对本实验生成的初始工程文件夹结构及其中的主要文件做简要分析说明。2.给出完整的main()函数代码,并进行概括分析说明。3.观察分析实验现象。4.给出扩展实验中的主要代码,并进行概括分析说明。(选作)5.实验收获总结。

实验2STM32固件库的创建实验【实验目的】进一步熟悉CubeIDE软件的基本用法了解固件库在STM32程序设计中的作用和基本用法【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE【实验内容】自行创建STM32固件库,并在此基础上编写应用程序,控制实验箱中蜂鸣器的鸣响。【实验原理】在基于寄存器的STM32程序设计中,利用绝对地址直接对寄存器进行操作访问。在开发程序时,如果对每个外设寄存器都这样进行操作,将是非常麻烦的。本实验将代码进行逐层封装,自行创建所需的库函数,并在主程序中调用实现要求的功能,从而体会STM32固件库的基本原理。1.GPIO外设结构体和结构体指针定义将实验1中的reg.h头文件代码重新编写如下:typedefunsignedint uint32; /*定义数据类型别名*/typedefunsignedshort uint16;#defineAHB1PERIPH_BASE((unsignedint)0x40020000) /*AHB1总线基地址*/#defineRCC_BASE(AHB1PERIPH_BASE+0x3800) /*RCC基地址*/#defineGPIOG_BASE(AHB1PERIPH_BASE+0x1800) /*PG外设基地址*/#defineRCC_AHB1ENR*(unsignedint*)(RCC_BASE+0x30) /*RCC的AHB1ENR寄存器地址映射*/typedefstruct{ /*GPIO结构体定义*/uint32MODER; /*GPIO模式寄存器*/uint32OTYPER; /*GPIO输出类型寄存器*/uint32OSPEEDR; /*GPIO输出速度寄存器*/uint32PUPDR; /*GPIO上拉/下拉寄存器*/uint32IDR; /*GPIO输入数据寄存器*/uint32ODR; /*GPIO输出数据寄存器*/uint16BSRRL; /*GPIO置位/复位寄存器低16位*/uint16BSRRH; /*GPIO置位/复位寄存器高16位*/uint32LCKR; /*GPIO配置锁定寄存器*/uint32AFR[2]; /*GPIO复用功能配置寄存器*/}GPIO_TypeDef;#defineGPIOG((GPIO_TypeDef*)GPIOG_BASE) /*PG结构体指针定义*/上述代码将GPIO外设的各寄存器依次作为结构体中的成员变量。最后一条宏定义语句定义了一个结构体指针GPIOG,代表PG外设。通过对该宏的操作,即可访问GPIOG外设中的寄存器。例如,要访问PG中的MODER寄存器,可以用表达式“GPIOG->MODER”实现。2.GPIO初始化结构体在使用各种外设之前,都需要对其进行初始化,配置其工作模式、设置一些必须的参数等。不同外设初始化所需配置的参数各不相同,因此一般将初始化所需的参数、数据等分别定义在不同的外设配置文件中。为此,本实验除了上述reg.h文件以外,另外新建两个文件gpioInit.h和gpioInit.c,用于存放GPIO外设相关的初始化定义和封装代码。注意在gpioInit.h文件最前面导入reg.h头文件。1)GPIO工作模式的定义在gpioInit.h头文件中添加如下代码,定义所需的枚举类型:#include"reg.h"/*GPIO初始化相关枚举类型定义*/typedefenum{GPIO_Mode_IN=0x00, /*输入模式*/GPIO_Mode_OUT=0x01, /*输出模式*/GPIO_Mode_AF=0x02, /*复用模式*/GPIO_Mode_AN=0x03 /*模拟模式*/}GPIO_Mode_TypeDef;typedefenum{ GPIO_OType_PP=0x00, /*推挽模式*/GPIO_OType_OD=0x01 /*开漏模式*/}GPIO_OType_TypeDef;上述2个枚举类型中的成员分别用于设置GPIO的工作模式和输出类型。2)初始化结构体的定义GPIO的初始化结构体用于对GPIO初始化时所需的初始化参数进行封装,有了上述枚举类型的定义后,可以定义如下GPIO的初始化结构体:typedefstruct{uint32GPIO_Pin; /*选择要配置的GPIO引脚*/GPIO_Mode_TypeDefGPIO_Mode; /*选择GPIO引脚的工作模式*/GPIO_OType_TypeDefGPIO_OType; /*选择GPIO引脚输出类型*/}GPIO_InitTypeDef;该结构体中的后面两个成员分别是前面定义的枚举类型,因此其取值必须是这些枚举类型中的成员。例如,成员变量GPIO_Mode的取值必须是0x00~0x03,程序中可以用相应的枚举类型成员名GPIO_Mode_IN、GPIO_Mode_OUT等进行赋值。在该结构体中,第一个成员用于指定需要初始化配置的GPIO引脚,其数据类型为uint32_t,即32位无符号整数。例如,取值为0x00000000表示GPIO的引脚0、取值0x00000010表示引脚2。为了方便,将这些代表引脚的取值常数定义为如下16个宏:/*GPIO引脚定义*/#defineGPIO_PIN_0 (uint16)(1<<0)#defineGPIO_PIN_1 (uint16)(1<<1)#defineGPIO_PIN_2 (uint16)(1<<2)……#defineGPIO_PIN_15 (uint16)(1<<15)需要特别注意的是,在这些宏定义中,定义的常数值并不是等于相应的GPIO引脚序号,16位常数值中除了与各引脚位号相对应的位为1码以外,其他位全部为0。之所以这样定义,是为了在对GPIO引脚做操作访问时,便于利用这些常数值构造相应的表达式。3.初始化函数的定义在gpioInit.c源文件中定义如下初始化函数:voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct){uint32pin_num,pin;pin=GPIO_InitStruct->GPIO_Pin;for(pin_num=0x00;pin_num<16;pin_num++){ /*获取GPIO引脚序号*/if((1<<pin_num)==pin)break;}GPIOx->MODER&=~(3<<(2*pin_num)); /*设置GPIO为输出模式*/GPIOx->MODER|=((GPIO_InitStruct->GPIO_Mode)<<(2*pin_num));GPIOx->OTYPER&=~(1<<pin_num); /*设置输出类型*/GPIOx->OTYPER|=((GPIO_InitStruct->GPIO_OType)<<pin_num);}该函数有两个参数,其中GPIOx为GPIO结构体指针,其取值可以是定义在reg.h中的宏GPIOG,从而使得该参数代表相应的GPIO外设。参数GPIO_InitStruct为指向GPIO_InitTypeDef结构体的指针,其中存放了对GPIO进行初始话所需的配置参数。函数GPIO_Init()中实现的两个主要功能是:(1)利用for循环,根据GPIO_InitStruct结构体的成员GPIO_Pin计算确定要初始化的引脚序号,并将结果保存在pin_num变量中。(2)通过初始化结构体中各个成员的值对相应寄存器进行配置。这部分与前面直接配置寄存器的操作是类似的,即先将引脚号pinpos相应的配置位清空,然后根据结构体成员对配置位赋值。区别是这里的寄存器配置参数值及引脚号都是由变量存储和给定,从而能够通过传入不同的入口参数,实现对任何GPIO引脚进行配置。4.GPIO引脚的读写访问函数对GPIO指定引脚的访问可以有各种操作访问方法,例如通过IDR/ODR实现对同一个GPIO中所有16位引脚的操作访问,或者利用BSRR设置指定的一位或若干位引脚输出的高低电平等。这里以对指定一个引脚进行位操作为例,体会读写访问函数的编写方法。在gpioInit.c文件中,定义两个GPIO引脚位操作函数如下:/*GPIO引脚置位操作函数*/voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16GPIO_Pin){GPIOx->BSRRL=GPIO_Pin;}/*GPIO引脚复位操作函数*/voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16GPIO_Pin){GPIOx->BSRRH=GPIO_Pin;}这两个函数的功能是分别由指定的GPIO引脚输出高电平和低电平。两个函数分别都有两个入口参数,其中参数GPIOx为GPIO结构体指针;参数GPIO_Pin用于指定要设置的GPIO端口引脚,可以是宏GPIO_PIN_0~GPIO_PIN_15。例如,要使PG6输出低电平,可以用如下语句实现:GPIO_ResetBits(GPIOG,GPIO_PIN_6);上述所有结构体和GPIO操作函数用于实现GPIO指定引脚的操作访问,在主程序中调用相应的函数即可实现具体功能,例如点亮开发板上的LED等。这些结构体和操作函数就是自行创建的库。【实验步骤】1.实验预习熟悉实验原理,分析各参考代码,并编写所需的其他程序代码。2.新建工程,并创建所需文件新建STM32空工程,并在工程文件夹的Inc子文件夹中新建头文件reg.h、gpioInit.h和源文件gpioInit.c,各文件中的代码参考实验原理部分。注意在gpioInit.h文件中添加上述各函数的原型声明,并在main.c和gpioInit.h文件中导入头文件reg.h,在gpioInit.c文件中导入头文件gpioInit.h。3.代码编写(1)分析实验原理中的各文件代码。(2)编写main.c主程序文件代码,实现蜂鸣器的鸣响控制。4.程序编译、下载、运行编译成功后,默认将生成与工程同名的elf文件,并存放在Debug子文件夹中。此时,单击工具栏上的Run或Debug按钮,即可自动下载程序,并启动调试或运行。【扩展实验】修改实验1中的扩展实验代码,要求根据本实验的实验原理采用自创建库实现。【实验报告】1.给出main.c文件中的主要代码,并进行概括分析说明。2.观察分析实验现象。3.要求在GPIO_SetBits()和GPIO_ResetBits()函数中利用GPIO的ODR实现同样的功能,编写修改后的函数。4.给出扩展实验中的主要代码,并进行概括分析说明。(选作)5.实验收获总结。

实验3基于HAL库的STM32程序设计实验【实验目的】熟悉STM32CubeIDE工具软件的使用方法掌握STM32CubeMX中时钟配置和GPIO的配置方法掌握基于HAL库的应用程序编写方法【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE【实验内容】基于CubeMX和HAL库编写程序,利用实验箱中的按键K4控制LED灯D4的亮灭。【实验原理】根据实验内容要求,每当K4按动一次,使D4灯亮/灭切换一次。在实验箱键盘和数码管显示模块上有4个LED,其连接原理电路如图3-1所示。图3-1LED连接原理图图3-2按键连接原理图在实验箱底板的左下角,有两个独立按键K3和K4,其连接电路如图3-2所示。以K4为例,当K4按下时,PF11为低电平;当K4释放后,PF11引脚通过电阻R44接电源,从而得到高电平。因此,通过读取PF11引脚的高低电平,即可了解K4的当前状态(按下或者释放)。需要注意的是,图3-2所示实验箱中的按键电路没有考虑消抖问题,如果需要,可以考虑采用软件消抖法实现。本实验要求利用CubeMX实现系统时钟和GPIO引脚的初始化配置。之后,在生成的工程中通过调用HAL库中的GPIO外设操作访问函数实现上述控制功能。1.新建工程启动CubeIDE,新建工程的步骤与实验1、2相同,,需要选择目标器件、设置工程等。主要区别在于:在图1-3所示工程设置对话框中注意勾选STM32Cube而不是Empty。单击Finish按钮后,将新建一个STM32Cube工程,并返回到CubeIDE主窗口。在窗口左侧的工程浏览器(ProjectExplorer)中,除了自动创建的Inc、Src等文件夹以外,还有一个Drivers文件夹,其中存放的是所需的固件包和HAL库文件。特别注意到其中还有一个重要的与工程名同名的ioc文件(CubeMX配置文件)。2.CubeMX中的初始化配置在工程浏览器中双击ioc文件,进入CubeMX主界面,在其中做如下配置。1)系统时钟和总线时钟的配置在本实验箱中,采用的是25MHz外部晶振HSE作为时钟源,经过微处理器内部的时钟电路可以得到168MHz系统时钟,再经过分频得到42MHz和84MHz的APB1和APB2外设时钟。为此,需要在CubeMX中作如下时钟配置:在窗口左侧的外设列表中,找到RCC外设,按图3-3(a)设置HSE时钟源为外部的晶体振荡器电路。点击ClockConfiguration标签,按图3-3(b)配置系统时钟为168MHz,HCLK、APB1和APB2总线外设时钟分别为168MHz、42MHz和84MHz。操作技巧:设置HSE时钟源后,在图3-3(b)中单击两个多路开关使其分别接通HSE和PLLCK,然后在HCLK框中输入168再回车,其他的分频系数等可以由系统自动计算确定,无需手工计算。注意:后面的各实验都采用基于CubeMX和HAL库的程序设计方法,首先都必须对RCC进行上述配置,以后不再重复详细说明。(a)HSE时钟源配置(b)系统时钟和总线时钟配置图3-3系统时钟和总线时钟配置2)GPIO引脚配置在CubeMX主界面右侧的引脚封装视图中通过右下角的搜索框找到PH15和PF11,分别在这两个引脚上单击,在弹出的对话框中配置两个引脚的工作模式分别为GPIO_Output和GPIO_Input。主界面左侧的外设列表中单击SystemCore组中的GPIO,在窗口中间出现的GPIO配置面板中将列出上述两个引脚,如图3-4(a)所示。分别双击各引脚,将弹出引脚配置对话框,进一步配置两个GPIO引脚的相关属性和参数,如图3-4(b)所示。(a)GPIO配置面板(b)引脚配置图3-4GPIO引脚配置操作技巧:单击CubeMX主界面右上角的Maximum/Restore(最大化/恢复)按钮,可以将主界面窗口最大化或者恢复常规显示;CubeMX主界面中间的模式和配置面板是两个独立的面板,在两个面板中间,通过鼠标拖动可以调节两个面板的大小;模式和配置面板中如果所需配置的参数较多,将出现滚动条,上下拖动可以查看被隐藏的参数。3.初始工程代码的生成在CubeMX窗口中单击ProjectManager(工程管理器),再单击选择左侧的CodeGenerator,勾选Generateperipheralinitializationasapair…,单击保存按钮,将自动生成工程代码。图3-5初始工程文件夹在CubeIDE工程浏览器中观察工程文件夹的结构如图3-5所示。之后,单击工具上的Build按钮,对工程做一次编译。图3-5初始工程文件夹在生成的工程代码中,实验需要编写的代码主要在main.c/.h和gpio.c/.h文件中进行。在main.h头文件中,将根据CubeMX中对两个GPIO引脚配置的用户标签自动生成如下宏定义:/*Privatedefines*/#defineK4_Pin GPIO_PIN_11#defineK4_GPIO_Port GPIOF#defineLED4_Pin GPIO_PIN_15#defineLED4_GPIO_Port GPIOH/*USERCODEBEGINPrivatedefines*//*USERCODEENDPrivatedefines*/在main.c源文件中,主要调用了HAL_Init()函数实现所有外设的复位、Systick定时器的初始化等,调用SystemClock_Config()函数配置系统时钟并开启GPIOF和GPIOH外设时钟,调用MX_GPIO_Init()函数对所启用的GPIO外设进行初始化。操作技巧:在上述函数名上单击以便将光标移动到函数名上,之后在函数名再右击,在弹出的快捷菜单中单击OpenDeclaration菜单命令,可以自动导航找到定义该函数的文件及其在文件中的位置。注意,在此之前,必须先执行一次编译。4.参考代码根据实验内容,需要编写的应用程序代码主要有按键状态的检测、D4灯的亮/灭控制等。在main.c文件中,自行编写的部分代码参考如下:/*USERCODEBEGIN0*/voiddelay(unsignedintd) /*延时函数*/{volatileunsignedinti=0;while(i<d)i++;}/*USERCODEEND0*//*USERCODEBEGINWHILE*/while(1){/*USERCODEENDWHILE*//*USERCODEBEGIN3*/K4_Down(K4_GPIO_Port,K4_Pin);}/*USERCODEEND3*//*USERCODEBEGIN4*/voidK4_Down(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin){if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==GPIO_PIN_RESET){ //K4按下?delay(5000); //延时消抖if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==GPIO_PIN_RESET){while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin)==GPIO_PIN_RESET); //等待K4释放HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin); //D4闪烁一次}}}/*USERCODEEND4*/【实验步骤】1.实验预习熟悉实验原理,了解CubeMX工具的基本使用方法和步骤,分析所给参考代码。2.新建工程,在CubeMX中对系统时钟和GPIO外设等做相关配置。3.在初始化工程中编写功能程序。4.程序编译、下载、运行,观察分析实验现象。【扩展实验】采用基于CubeMX和HAL库的程序设计方法,重新实现实验2中扩展实验的功能。【实验报告】1.总结比较基于寄存器和HAL库的程序设计在设计步骤、工程代码和文件结构等方面的主要区别。2.对K4_Down()函数中调用的主要HAL库函数代码进行简要分析说明(库函数所在文件、库函数的入口和出口参数、库函数实现的主要功能等)。3.观察分析实验现象。4.对扩展实验在CubeMX中的主要配置和主要程序代码进行简要分析说明。(选作)5.实验收获总结。

实验4STM32外部中断实验【实验目的】熟悉STM32CubeIDE工具软件的使用方法熟悉HAL库中与外部中断相关的控制函数掌握STM32中断系统及外部中断的使用和程序设计方法【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE【实验内容】利用实验箱中的按键K4控制LED灯D4的亮灭,要求按键的检测用中断方式实现。【实验原理】STM32F407在内核中集成了一个异常和中断响应系统,支持为数众多的系统异常和外部中断,并利用EXTI控制器配合内核设备NVIC实现外部中断的管理。STM32F407共有23根外部中断输入线EXTI0~22,可以引入23个外部中断/事件。其中利用140个GPIO引脚工作在复用模式,并分组连接到EXTI0~15,从而引入16个外部中断/事件。另外7根EXTI线可引入RTC闹钟、USBOTGFS唤醒、以太网唤醒等事件。在GPIO引脚分配上,每个外部中断输入线对应多个GPIO引脚。在本实验中,通过对GPIO端口复用功能的配置和选择,连接按键K4的PF11引脚在MCU内部将对应连接到外部中断输入线EXTI11。1.CubeMX中外部中断的配置在CubeMX中,配置GPIO引脚引入外部中断的基本步骤如下。1)GPIO配置在引脚视图中单击相应的GPIO引脚,在弹出的快捷菜单中选择复用中断模式GPIO_EXTIx,其中x等于GPIO引脚的位号。例如,单击PF11时,在快捷菜单中显示的相应选项为GPIO_EXTI11。在GPIO配置面板中进一步配置GPIO引脚的属性,其中GPIO_Mode属性用于设置期望的触发方式,可以是上边沿触发(ExternalInterruptwithRisingedgetriggerdetection)、下边沿触发(ExternalInterruptwithFallingedgetriggerdetection)或上下双边沿触发(ExternalInterruptwithRising/Fallingedgetriggerdetection),如图4-1所示。图4-1GPIO引脚属性配置根据图3-2所示按键电路,当按键K4按下或释放时,PF11引脚将分别出现下边沿(负跳变)或上边沿(正跳变)。因此,如果要求在K4按下的瞬间D4灯亮灭切换,则应配置PF11引入外部中断为下边沿触发;如果要求在K4按下然后释放的瞬间D4灯亮灭切换,则应配置为上边沿触发。2)NVIC配置在外设列表中找到SystemCOre下面的NVIC并单击,将在窗口中间出现NVIC配置面板,如图4-2所示。图4-2NVIC配置面板在配置面板上部的PriorityGroup(中断优先级分组)下拉列表中可以配置优先级分组,在下面的列表中可以进一步设置中断的抢占优先级和响应优先级。本实验中只有一个外部中断,为此在列表中找到EXTIline[15:10]interrupts,确认其抢占优先级和子优先级都采用默认设置0,代表最高优先级。单击面板上面的Codegeneration(代码生成)标签,确认并勾选所启用外部中断的相关属性选项GenerateEnableinInit、GenerateIRQhandler、CallHALhandler,从而将在生成的工程代码中自动创建中断处理相关函数。2.外部中断的处理流程在基于HAL库的程序开发中,所有中断处理函数都定义在文件stm32fxxxit.c中。在使用CubeMX软件进行初始化配置时,如果使能了某一个外设的中断功能,那么在生成代码时,相应的中断处理函数就会自动添加到该文件中。在本实验中,配置PF11为外部中断模式后,对应的中断处理函数如下:voidEXTI15_10_IRQHandler(void){/*USERCODEBEGINEXTI15_10_IRQn0*//*USERCODEENDEXTI15_10_IRQn0*/HAL_GPIO_EXTI_IRQHandler(K4_Pin);/*USERCODEBEGINEXTI15_10_IRQn1*//*USERCODEENDEXTI15_10_IRQn1*/}上述中断处理函数将以所配置的引脚GPIO_Pin(本实验为K4,其用户标签设为K4)作为参数,继续调用GPIO外部中断处理函数HAL_GPIO_EXTI_IRQHandler()。该函数中定义在stm32f4xx_hal_gpio.c文件中,完整代码如下:voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin){/*EXTIlineinterruptdetected*/if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!=RESET){__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); /*清除中断中断*/HAL_GPIO_EXTI_Callback(GPIO_Pin); /*调用中断回调函数*/}}函数中首先检测指定GPIO引脚引入的中断标志是否为1。如果是,则清除中断标志,并以GPIO引脚作为参数,继续调用中断回调函数HAL_GPIO_EXTI_Callback()。该函数定义在stm32f4xx_hal_gpio.c文件中,其完整代码如下:__weakvoidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){/*Preventunusedargument(s)compilationwarning*/UNUSED(GPIO_Pin);/*NOTE:ThisfunctionShouldnotbemodified,whenthecallbackisneeded,theHAL_GPIO_EXTI_Callbackcouldbeimplementedintheuserfile*/}上述中断回调函数是一个弱函数。在CubeMX做了合适的配置后,用户需要做的主要工作就是根据要实现的功能,重新编写该中断回调函数,也可以将需要做的中断处理操作直接放在中断处理函数EXTI15_10_IRQHandler()中。3.参考代码在本实验中,将要求的中断处理功能(即控制D4灯闪烁一次)放在中断回调函数中,并将中断回调函数重新定义在main.c文件中,参考代码如下:/*USERCODEBEGIN4*/voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==K4_Pin){delay(10000); /*延时消抖*/if(HAL_GPIO_ReadPin(GPIOF,GPIO_Pin)==GPIO_PIN_RESET) HAL_GPIO_TogglePin(LED4_GPIO_Port,LED4_Pin); /*D4闪烁一次*/}}/*USERCODEEND4*/【实验步骤】1.实验预习熟悉实验原理,了解STM32中的中断系统及外部中断的管理方法,编写中断回调函数。2.根据实验原理,在CubeMX中对系统时钟、GPIO外设和NVIC等做配置。3.编写和实现中断回调函数。4.程序编译、下载、运行。【扩展实验】利用中断方式检测实验箱中的K4按键,要求当按下K4时,蜂鸣器停止鸣响,再次按下后蜂鸣器又重新鸣响,如此重复。【实验报告】1.总结在CubeMX中对外部中断的配置有哪些。2.观察分析实验现象。3.对扩展实验中的初始化配置和程序代码进行概括介绍。4.实验收获总结。

实验5SysTick定时器实验【实验目的】熟悉STM32CubeIDE工具软件的使用方法掌握SysTick定时器的基本概念及其用法。【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE【实验内容】编写程序,实现利用SysTick(系统时钟)定时器实现实验箱中两个LED的交替闪烁。【实验原理】在STM32F407xx中,SysTick定时器(系统节拍定时器、系统滴答定时器)是一个24位自动重装递减计数器,是内核NVIC(嵌套向量中断控制器)的一部分。SysTick定时器的时钟源可以是内部时钟(FCLK)或者是外部时钟,系统默认的SysTick定时器时钟源是由AHB时钟HCLK或其8分频得到的,在CubeMX的系统时钟配置界面中,SysTick定时器的时钟源如5-1所示。当设置CortexDiv=1和8时,分别配置SysTick定时器的时钟频率为上述两种情况。图5-1CubeMX时钟配置中的SysTick定时器时钟源SysTick定时器在时钟源时钟脉冲的作用下,从设定的初值减计数到0时,会自动重装初值继续计数,同时触发中断,因此只需确定计数初值即可得到精确的延迟时间。本实验在实验箱中的相关硬件原理接线如图3-2所示,其中PB15和PH15分别控制LED3和LED4。两个LED灯的闪烁亮灭时间用SysTick定时器实现定时。1.SysTick定时器的初始化在core_cm4.h头文件中,定义了如下静态函数:__STATIC_INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); /*Reloadvalueimpossible*/}SysTick->LOAD=(uint32_t)(ticks-1UL); /*setreloadregister*/NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);/*setPriorityforSystickInterrupt*/SysTick->VAL=0UL; /*LoadtheSysTickCounterValue*/SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk; /*EnableSysTickIRQandSysTickTimer*/return(0UL); /*Functionsuccessful*/}该函数用于实现SysTick定时器的配置。在上述代码中,宏常量SysTick_LOAD_RELOAD_Msk定义为常数0xffffff,因此if语句的作用是判断入口参数ticks给定的计数初值是否超出24位计数值能够表示的最大值。如果是,则返回1;否则设置LOAD寄存器的值等于ticks-1。函数中后面的各条语句分别用于设置SysTick中断优先级,设置VAL寄存器的初始值为0,并配置SysTick的计数时钟脉冲为系统时钟脉冲HCLK,开启SysTick异常请求并启动定时。上述SYSTICK_Config()函数最终在HAL_Init()->HAL_InitTick()->HAL_SYSTICK_Config()函数中调用,实现SysTick的初始化配置。调用该函数时的入口参数设置为SystemCoreClock/(1000U/uwTickFreq)其中uwTickFreq的值等于HAL_TICK_FREQ_DEFAULT,该常量是定义在stm32f4xx_hal.h文件中枚举类型HAL_TickFreqTypeDef的成员,赋值为1;SystemCoreClock变量的值将通过main.c文件中的SystemClock_Config()函数自动配置为系统时钟频率(也就是HCLK脉冲的频率)。根据上述配置,由于SysTick定时器的计数脉冲为HCLK脉冲,因此SysTick计数到零并触发中断所需的时间正好为SystemCoreClock´ticks=1/1000=1ms。这一周期性的1ms定时,称为系统节拍。2.SysTick定时器中断(异常)在CubeMX中,SysTick定时器中断的抢占优先级和响应优先级分别自动配置为15和0,因此在所有中断中,其优先级最低。在stm32f4xx_it.c文件中,SysTick定时器的中断处理函数定义如下:/***@briefThisfunctionhandlesSystemticktimer.*/voidSysTick_Handler(void){/*USERCODEBEGINSysTick_IRQn0*//*USERCODEENDSysTick_IRQn0*/HAL_IncTick();/*USERCODEBEGINSysTick_IRQn1*//*USERCODEENDSysTick_IRQn1*/}在上述函数中,将继续调用HAL_IncTick()函数,实现SysTick定时器的中断处理。该函数定义在stm32f4xx_hal.c文件中,实现的功能是每次定时到,将全局变量uwTick的值递增1。该全局变量就是HAL库系统时基信号。在启动运行后,通过上述中断处理,SysTick每隔1ms发出一次定时到中断,将uwTick递增。在应用程序中,可以调用HAL库函数HAL_GetTick()获取该全局变量的值。2.HAL_Delay()函数在HAL库中,提供了HAL_Delay()库函数。默认情况下,该函数利用SysTick定时器实现毫秒级延时,函数的参数代表以毫秒为单位的延时时间。程序中调用该函数实现指定时间的延时后,退出该函数,继续往下运行。在stm32f4xx_hal.c文件中,HAL_Delay()库函数的完整定义如下:__weakvoidHAL_Delay(uint32_tDelay){uint32_ttickstart=HAL_GetTick();uint32_twait=Delay;/*Addafreqtoguaranteeminimumwait*/if(wait<HAL_MAX_DELAY){wait+=(uint32_t)(uwTickFreq);}while((HAL_GetTick()-tickstart)<wait){}}在上述函数中,调用HAL_GetTick()函数获取刚进入该函数时系统时基信号的起始值。在之后的while循环中,重复获取当前滴答值。当当前滴答值与起始滴答值之差等于参数Delay的给定值时,退出循环和函数,从而获得指定的延时。例如,通过在程序流程中插入如下调用语句HAL_Delay(1000);即可获得1s的延时。与原来在程序中用循环自行实现的延时相比,这种通过调用HAL库函数实现的延时精度理论上是没有误差的。【实验步骤】1.实验预习预习实验原理,了解系统滴答定时器的工作原理和HAL_Delay()函数的基本用法。2.新建工程和时钟配置,参考实验3和4。3.GPIO引脚配置配置PB15、PH15为输出模式,注意合理配置其他参数,以实现要求的“交替点亮”功能。3.在主函数main()中添加代码,通过调用HAL_Delay()函数实现两个LED的交替点亮,每隔一段时间两个LED的亮灭切换一次。4.配置编译工程,调试运行,观察实验现象。【扩展实验】要求利用K4控制D4灯的亮灭。每按动一次,D4点亮,持续1s后熄灭。K4的检测用中断方式实现,在main.c文件中重写的中断回调函数如下:/*USERCODEBEGIN4*/voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin){if(GPIO_Pin==K4_Pin){HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_RESET);/*D4点亮*/HAL_Delay(1000); /*延时(持续点亮)*/HAL_GPIO_WritePin(LED4_GPIO_Port,LED4_Pin,GPIO_PIN_SET); /*D4熄灭*/}}/*USERCODEEND4*/(1)在NVIC中,确认K4(EXTI11)中断和系统滴答定时器中断的抢占优先级分别默认配置为0和15,运行程序,观察能否实现预期的功能;(2)修改K4中断的抢占优先级为1,系统滴答定时器中断的抢占优先级为0,重新运行程序,观察能否实现预期功能。【实验报告】1.简要说明CubeMX中GPIO的主要配置。2.给出main()函数的完整代码,并进行分析说明。3.观察分析实验现象。4.对扩展实验的运行结果进行比较,分析说明原因,并总结HAL_Delay()函数的合理用法。5.实验收获总结。

实验6串口数据收发实验【实验目的】熟悉STM32CubeIDE工具软件的使用方法掌握STM32F407IGTx中USART串口的使用、参数配置及调试方法。掌握串口调试助手工具的使用方法。【实验环境】华清远见嵌入式AMR实验箱(FS-6818M4)ST-Link仿真器STM32CubeIDE串口调试助手和USB转串口线(安装CH341SER驱动)【实验内容】通过串口调试助手向实验箱发送5个数据,串口接收后求其累加和再送回助手显示累加结果。【实验原理】STM32F407集成了6个通用串行接口,其中有两个通用异步收发器UART4、UART5和4个通用同步异步收发器USART1~3、USART6。本实验开发平台中使用USART1和RS232串口,该串口占用PA10和PA9分别作为Tx和Rx线,通过MAX3232CSE转换为RS232C接口,并与实验箱底板上的Debug1串口插座相连接。底板上相关的硬件连接原理如图6-1所示。图6-1实验箱中串口的硬件连接原理图1.串口的初始化配置在CubeMX的外设列表中单击选中UASRT1,在模式面板中设置USART1的Mode为Asynchronous(异步串行通信)。此时,将自动配置PA9和PA10分别为USART1_Tx和USART1_Rx复用模式,用作USART1的发送和接收数据线。在配置面板中单击上方的ParameterSettings标签,确认串口的所有参数取默认值,如图6-2所示。根据上述配置,在初始工程代码的main()函数中将自动调用MX_USART1_UART_Init()对串口进行初始化,在该函数中将继续调用stm32f4xx_hal_uart.c中定义的如下两个函数:HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart)staticvoidUART_SetConfig(UART_HandleTypeDef*huart)实现串口的初始化和参数设置。例如,在上述第二个函数中,将根据CubeMX中配置的PCLK2、串口波特率BodeRate和过采样倍数OverSampling,计算求得波特率分频系数并存入波特率寄存器BRR。2.串口中断的开启及相关配置在USART配置配置面板上方单击NVICSettings标签,勾选Enabled,开启USART1全局中断USART1globalinterrupt,如图6-3所示。图6-2USART1参数配置图6-3开启USART1全局中断单击CubeMX外设列表中的NVIC,在NVIC配置面板中确认已经开启USART1全局中断,并且抢占优先级和响应优先级都自动配置为0,代表最高优先级。在面板上方单击Codegeneration标签,确认在USART1全局中断行已经勾选后面的3个选项,如图6-4所示。图6-4串口中断代码生成相关配置2.串口调试助手串口调试助手是串口调试相关工具,用于在PC机上虚拟一个串口,从而实现与MCU之间的串行通信,观察MCU串口的收发效果。串口调试助手有很多版本,本实验使用的串口调试助手为UartAssist5.0.2或野火串口调试助手。这两个软件都无需安装。启动该软件后,会自动识别到USB转串口线,如图0-9所示。注意左上角“串口设置”中的串口号、波特率等必须与Windows设备管理器中的设置一致。3.串口收发操作函数对串口做了初始化配置后,即可启动数据的收发。最基本的数据收发方式有阻塞方式和中断方式,响应的常用操作函数如表6-1所示。表6-1串口常用数据收发函数函数名参数参数说明函数功能HAL_UART_Transmit()HAL_UART_Receive()UART_HandleTypeDef*huart串口句柄轮询方式数据发送轮询方式数据接收constuint8_t*pData数据缓冲区指针uin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论