版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机与嵌入式系统原理与应用1制作人或logo;块模块1认识“嵌入式技术”1认识“嵌入式技术”主要内容嵌入式技术ARM处理器和STM32微控制器STM32软件开发模式和开发工具2制作人或logo什么是嵌入式技术嵌入式技术(EmbeddedTechnology)嵌入式系统、嵌入式设备把什么嵌入?嵌入式系统中的处理器可分为微处理器(MPU)微控制器(MCU)数字信号处理器(DSP)片上系统(SOC)ARM和ARM处理器ARM公司和ARM内核ARMAdancedRISCMachinesCortex-M微控制器处理器Cortex-R实时处理器Cortex-A应用处理器:面向移动计算、手机、服务器等3拓展阅读:FPGA现场可编程门阵列——/yikoulinux/p/15621729.html制作人或logoARM处理器和STM32微控制器Arm处理器–使用ARM内核的处理器ST公司的STM32微控制器
STM32选型STM32
MCU的arm内核架构STM32
MCU的产品命名规则STM32F103VET6—“M3主控模块”使用的STM32型号引脚数100、闪存容量512kB、封装QFPSTM32F103R6——Proteus仿真电路使用的STM32型号,引脚数64、闪存容量32kB4制作人或logoSTM32软件开发模式和开发工具STM32软件开发模式第1代:寄存器开发第2代:标准库开发第3代:HAL/LL库+STM32CubeMX工具开发STM32开发工具商用IDE
ST公司专用IDEAtollicTrueSTUDIO/STM32(2017停止更新)STM32CUBEIDE–ST公司主推多种工具组合使用Eclipse+插件AC6VSCode+STM32CubeMX+KEIL…其他…KeilMDK-ARMIAREWARMEmbeddedStudio5制作人或logo项目小结了解什么是嵌入式系统、嵌入式设备;了解ARM内核和ARM架构;掌握STM微控制器选型的相关知识;掌握STM32软件开发模式和开发工具;了解STM32CUBEMX软件和KEILMDK软件;了解如何从互联网获取所需参考资料;6制作人或logo谢谢!单片机与嵌入式系统原理与应用制作者或logo目录7模块2开模块2开发入门发入门主要内容和学习重点项目一:点亮一盏LED知识准备STM32F103xE微处理器概况——学习查阅数据手册和参考手册STM32程序的下载方式项目实施:点亮LED2(基于M3模块)重点是STM32CUBEMX和KEILMDK软件的用法M3模块2种程序下载方式的操作——重点习题项目实施(续):点亮LED11(基于Proteus仿真)重点是学习STM32CUBEMX和KEILMDK软件和Proteus软件的用法习题项目探究:认识STM32CUBEMX生成的MDK工程项目理解:为什么LED被点亮知识拓展Cortex-M3时钟系统——重点开发工具进阶模块小结制作者或logo目录8知识准备:STM32F103VE/STM32F103R6微控制器概况查阅数据手册-1、11页内核:Cortex-M3支持最大频率:72MHz存储器:两种型号不同(下页)电源和时钟支持电压范围:2.0-3.6V4-16MHz外部高频时钟源8MHz内部RC高频时钟源40kHz内部RC低频时钟源32kHz外部低频时钟源低功耗睡眠、停止、待机模式STM32F103VE/STM32F103R63个12位ADC/2个12位ADC2个12位DAC/无12通道DMA/7通道DMA支持Debug模式8个定时器/3个定时器支持SPI(IIS)、IIC、USART、USB、CAN、SDIO多种串行通信协议/R6不支持SDIO与IIS80个GPIO引脚/51个GPIO引脚制作者或logo项目一:点亮一盏LED9↑摘自STM32F103数据手册↗知识准备:STM32F103VE/STM32F103R6微控制器概况STM32F103VE存储器512KbytesFlash64KbytesSRAMSTM32F103R6存储器32KbyteFlash10KbytesSRAM制作者或logo项目一:点亮一盏LED10↑摘自STM32F103大容量产品数据手册↓摘自STM32F103小容量产品数据手册知识准备:STM32F103VE/STM32F103R6微控制器概况复位系统复位NRST引脚上低电平(外部复位)看门狗复位软件复位-内核SCB_AIRCR寄存器中的SYSRESETREQ位低功耗管理复位电源复位/上电复位上电/掉电复位从待机模式中返回备份区域复位软件复位产生-RCC_BDCR寄存器中的BDRST位VDD和VBAT掉电时,从VDD或VBAT上电时产生制作者或logo项目一:点亮一盏LED11-查阅中文参考手册6.1节/英文手册7.1节摘自1+X传感网考证设备“M3主控模块”电路图→↙“M3主控模块”局部图知识准备:STM32F103VE微控制器概况–引脚引脚PAPBPCPDPE端口各16个GPIO引脚电源引脚:VDDVSS和VDDAVSSA工作电压:2.0~3.6V使用ADC时要求2.4~3.6VVBAT1.8V~3.6VVDD掉电时仍可使用VBAT给RTC供电时钟引脚OSC_INOSC_OUT复位引脚NRSTVREF+VREF-ADC使用BOOT0启动模式配置NC--NOTCONNECTED制作者或logo项目一:点亮一盏LED12摘自STM32F103大容量产品数据手册28页知识准备:STM32F103R6微控制器概况–引脚引脚PAPBPC端口各16个GPIO引脚,PD有3个引脚VDDVSS和VDDAVSSA工作电压:2.0~3.6V使用ADC时要求2.4~3.6VVBAT1.8V~3.6VVDD掉电时仍可使用VBAT给RTC供电时钟引脚–都是复用OSC_INOSC_OUT复位引脚NRSTBOOT0启动模式配置制作者或logo项目一:点亮一盏LED13摘自STM32F103小容量产品数据手册22页知识准备:STM32程序的下载方式串口ISP下载BOOT0引脚接高电位下载后BOOT0恢复到0使用仿真器下载BOOT0引脚接低电位可在KEILMDK中下载MDK调用JLINK驱动程序或ST-LINK驱动程序实现ST-LINKST公司专门针对STM32或STM8产品的仿真器制作者或logo项目一:点亮一盏LED14摘自1+X传感网考证设备“M3主控模块”电路图↗“M3主控模块”局部图→学完项目2之知识拓展-STM32存储器结构之后再次回来理解本页内容,效果更佳!↙摘自中文参考手册2.4节注:BOOT1为PB2的复用引脚项目实施:基于M3主控模块项目1:点亮LED2按照操作指导书进行操作配置GPIO端口PE6不需要添加程序代码如果提示ST-LinkUSB通信错误—参考下页实操步骤STM32CUBEMX启动项目MCU选型配置GPIO功能-LED2-PE6引脚配置调试端口-SerialWire配置STM32时钟树设置工程项目的参数和项目存储路径编译器选MDK-ARMV5保存CUBEMX项目生成源代码打开MDK工程选择Debug类型编译和下载制作者或logo项目一:点亮一盏LED15①②③项目实施:开启STM32CUBEMX单击右图红框内的图标如果跳出下图的窗口,可多次单击“Cancel”取消制作者或logo项目一:点亮一盏LED16①②②①项目实施:选择微控制器型号制作者或logo项目一:点亮一盏LED17②①③项目实施:进入STM32CUBMX配置页RCC——复位与电源管理实体设备并且开发板上带有外部晶振,可选择外部时钟选制作者或logo项目一:点亮一盏LED18②①项目实施:进入STM32CUBMX配置页配置调试端口如果使用的是实体设备,可按照实际使用的调试器来选择,比如SerialWire制作者或logo项目一:点亮一盏LED19②①项目实施:GPIO配置GPIO配置制作者或logo项目一:点亮一盏LED20④②①③项目实施:GPIO配置续↓中间这部分输入LED2制作者或logo项目一:点亮一盏LED21②①项目实施:时钟配置
配置项2-时钟配置STM32F103系列最高支持72MHz制作者或logo项目一:点亮一盏LED22②①项目实施:项目管理器1制作者或logo项目一:点亮一盏LED23项目实施:项目管理器2制作者或logo项目一:点亮一盏LED24第1项:拷贝所有库到项目中第2项:只拷贝需要用到的库加选的这项:外设初始化代码放置在单独的.C/.h文件中项目实施:保存CUBEMX项目和生成代码KEILMDK自动打开制作者或logo项目一:点亮一盏LED25④③②①项目实施:KEILMDKOptions设置1制作者或logo项目一:点亮一盏LED26项目实施:KEILMDKOptions设置2单击Settings图标后制作者或logo项目一:点亮一盏LED27项目实施:KEILMDK代码编译如果编译出现错误,最大的可能就是STM32CUBEMX配置有错,请重新回到STM32CUBEMX修改配置。制作者或logo项目一:点亮一盏LED28项目实施:使用调试器下载程序将M3主控模块放置在NewLab实训平台或智慧盒上,并确保通电将ST-LINK两头分别连接PC机USB接口和M3主控模块的J1接口点击“DownLoad”图标下载程序KEILMDK窗口最下方出现进度条,完成后出现提示制作者或logo项目一:点亮一盏LED29②①①②③③↓④↓⑤⑤⑥⑥项目实施:ST-LinkUSB通信错误MDK下载时提示ST-LinkUSB通信错误时,如右图先尝试重新插拨USB接口再检查设备管理器中ST-LINK驱动是否正常如果以上都不能解决问题使用ST-LinkUpgrade软件升级固件也可以使用串口ISP模式下载操作方式:下页制作者或logo项目一:点亮一盏LED30项目实施:串口ISP模式下载将M3主控模块中间大的拨动开关拨到BOOT并复位①KEILMDK的options窗口中勾选CreateHEXFile并重新编译②打开FlashLoader软件③
–右图检查串口号和其他参数是否正确④,NEXTNEXT选择正确的MCU目标对象⑤,NEXT添加目标代码HEX文件⑥,NEXT下载完成后,CLOSE,关闭软件制作者或logo项目一:点亮一盏LED31②③⑤4.拨动开关拨回NC,并按复位键重启④①习题:基于M3主控模块思考:如何使上电时LED2保持熄灭?思考:如何通过写代码熄灭LED2?添加以下源代码,看看效果注意添加代码的位置,要在BEGIN和END之间CUBEMX修改后重新生成代码时,未添加在指的位置的代码将被删除操作题:点亮LED9——使用“M3主控模块”操作题:使LED9闪烁——使用“M3主控模块”制作者或logo项目一:点亮一盏LED32HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,_______);摘自
“M3主控模块”电路图→项目实施
:基于Proteus仿真项目1:点亮LED11配置GPIO端口PD2不需要添加程序代码制作者或logo项目一:点亮一盏LED33请注意:STM32CUBEMX项目保存路径中不能出现中文字符!项目实施:开启STM32CUBEMX单击右图红框内的图标如果跳出下图的窗口,可多次单击“Cancel”取消制作者或logo项目一:点亮一盏LED34①②②①项目实施:选择微控制器型号制作者或logo项目一:点亮一盏LED35②①③项目实施:进入STM32CUBMX配置页RCC——复位与电源管理如果是真实设备并且开发板上带有外部晶振,可选择外部时钟选制作者或logo项目一:点亮一盏LED36项目实施:进入STM32CUBMX配置页配置调试端口如果使用的是真实设备,可按照实际使用的调试器来选择,比如SerialWire制作者或logo项目一:点亮一盏LED37项目实施:GPIO配置制作者或logo项目一:点亮一盏LED38②①③④⑤项目实施:GPIO配置续制作者或logo项目一:点亮一盏LED39②①项目实施:时钟配置
配置项2-时钟配置STM32F103系列最高支持72MHz制作者或logo项目一:点亮一盏LED40项目实施:项目管理器1制作者或logo项目一:点亮一盏LED41项目实施:项目管理器2制作者或logo项目一:点亮一盏LED42第1项:拷贝所有库到项目中第2项:只拷贝需要用到的库加选的这项:外设初始化代码放置在单独的.C/.h文件中项目实施:保存CUBEMX项目和生成代码KEILMDK自动打开制作者或logo项目一:点亮一盏LED43④③项目实施:KEILMDKOptions设置制作者或logo项目一:点亮一盏LED44项目实施:KEILMDK代码编译如果编译出现错误,最大的可能就是STM32CUBEMX配置有错,请重新回到STM32CUBEMX修改配置。制作者或logo项目一:点亮一盏LED45项目实施:HEX文件获取HEX文件在MDK-ARM文件夹中与你的项目名称相同的文件夹下制作者或logo项目一:点亮一盏LED46①②③在与工程项目同名的这个文件夹里找到HEX文件双击这个文件夹进入②项目实施:Proteus验证打开Proteus仿真软件↓选择正确的HEX文件→开启仿真↓制作者或logo项目一:点亮一盏LED47习题:基于仿真电路如何使上电时LED11保持熄灭?思考:如何如何写代码熄灭LED11?添加以下源代码,看看效果注意添加代码的位置,要在BEGIN和END之间CUBEMX修改后重新生成代码时,未添加在指的位置的代码将被删除操作题:点亮LED9——使用仿真电路验证操作题:使LED9闪烁制作者或logo项目一:点亮一盏LED48HAL_GPIO_WritePin(LED11_GPIO_Port,LED11_Pin,_______);Proteus仿真电路图↕项目探究:认识STM32CUBEMX生成的KEILMDK工程项目STM32CUBEMX生成代码后得到的文件夹内容MDK-ARM
内容启动文件用户GROUPmain.c主文件外设初始化文件HAL驱动文件-Hal库Cortex-M3驱动main.c头文件包含指令函数声明intmain(){初始化while(1){}}其他函数定义在BEGIN和END之间写代码制作者或logo项目一:点亮一盏LED49①②③④打开keil项目文件项目探究:认识STM32CUBEMX生成的main.c①说明信息②③主函数之前的代码分类--提高代码的可读性制作者或logo项目一:点亮一盏LED50①②③项目探究:认识STM32CUBEMX生成的main.c④⑤主函数制作者或logo项目一:点亮一盏LED51④⑤主循环④项目探究:为什么LED被点亮←STM32CUBEMXKEILMDK工程中的main.c→MX_GPIO_Init();KEILMDK工程中的gpio.c↓制作者或logo项目一:点亮一盏LED52①②③②③④⑤Proteus电路图↙项目探究:HAL驱动库的GPIO函数单击图①右键菜单中的“GoToReference…”菜单命令,光标直接来到该函数的函数声明(图②之中),头文件自动被打开。制作者或logo项目一:点亮一盏LED53①②项目探究:KEILMDK快速打开头文件的方法方法1:源文件任何位置打开右键菜单,使用“GotoHeaderfile…”菜单命令打开与源文件同名的头文件方法2:找到源文件中通过#include包含的头文件,使用右键菜单“Opendocumentxxx.h”可快速打开指定头文件制作者或logo项目一:点亮一盏LED54①②知识拓展:STM32CUBEMX配置时注意事项及生成的文件保存路径都是英文路径不要出现中文字符编译器不要选错CodeGenerator设置说明制作者或logo项目一:点亮一盏LED55第1项:拷贝所有库到项目中第2项:只拷贝需要用到的库外设初始化代码放置在单独的.C/.h文件中初始化代码生成后的文件组成↙→知识拓展:时钟系统STM32时钟树和STM32CUBEMX的ClockConfiguration制作者或logo项目一:点亮一盏LED56图8知识拓展:时钟系统8MHz外部晶振(4~16MHz)或用户的外部时钟--PhaseLockedLoop
(锁相环)PLL接收HSI或HSE时钟,进行倍频输出,最大16倍HSI作为PLL的输入时,最大频率是64MHz制作者或logo项目一:点亮一盏LED57摘自1+X考证设备“M3主控模块”电路图↗↙摘自中文参考手册6.2节(英文手册7.2节)↓摘自STM32CUBEMX↓摘自手册6.2.1节图9⑤①④③②③④↙摘自中文件参考手册6.2.2节LSILSE②③③知识拓展:使用HSI时钟能够得到的最高频率制作者或logo项目一:点亮一盏LED58摘自中文参考手册↓知识拓展:几个重要的时钟概念SYSCLK系统时钟–STM32大部分器件的时钟源可接受HSI、HSE或PLL的输出作为时钟源最高支持72MHz复位后默认HSI作为系统时钟HCLK--High-PerformanceClock供AHB总线、内核、内存和DMA使用FCLK--Cortex的FreeRunningClock,独立于HCLKSYSTICK--Cortex系统定时器时钟PCLK1和PCLK2外设时钟PeripheralClock,为高性能外设总线(APB)提供时钟信号低速外设总线APB1(最高支持36MHz)高速外设总线APB2(最高支持72MHz)TIMxCLK--定时器时钟,由PCLK信号倍频后提供制作者或logo项目一:点亮一盏LED59↕STM32CUBEMX知识拓展:STM32开发工具进阶STM32CUBE–意法半导体提供的一个全方位软件工具STM32CUBE包含STM32CubeMX和STM32Cube嵌入式固件库STM32CubeMX是一个图形软件配置工具,可以使用图形向导生成C初始化代码;——STM32CubeMX工程项目文件后缀为ioc按STM32微控制器系列的STM32Cube嵌入式固件库,提供HAL库、LL库和中间件组件中间件组件--RTOS、USB库、文件系统等STM32Cube嵌入式固件库管理–下页STM32Cube嵌入式固件库软件包保存位置--下下页制作者或logo项目一:点亮一盏LED60知识拓展:STM32开发工具进阶STM32Cube嵌入式固件库管理不同的微控制器系列产品有不同的固件库制作者或logo项目一:点亮一盏LED61知识拓展:STM32开发工具进阶STM32Cube嵌入式固件库软件包保存位置文件夹说明图片文件夹说明文档驱动库中件间组件库范例支撑文件-比如字体制作者或logo项目一:点亮一盏LED62STM32CubeF1GettingStarted.pdfBSP、CMSIS、STM32F1xx_HAL_Driver①②③④④⑤知识拓展:STM32开发工具进阶KEILMDK-ARM需要安装微控制器相应型号对应的软件支持包由ARM或第三方提供/dd2/制作者或logo项目一:点亮一盏LED63①②③④模块小结:关于STM32CUBEMX的更多信息制作者或logo模块小结64③模块小结:关于STM32CUBEMX的更多信息制作者或logo模块小结65模块小结:关于STM32CUBEMX的更多信息制作者或logo模块小结66模块小结了解STM32F103VE和STM32F103R6的基本概况;掌握STM32F1系列MCU的时钟系统及使用STM32CUBEMX配置的方法;能读懂M3主控模块和Proteus仿真电路的LED电路图;能够使用STM32CUBEMX创建工程和生成代码;熟悉STM32CUBEMX生成的初始化工程项目结构,能够使用KEILMDK进行代码编写和程序编译调试;代码补全和动态语法检查设置(参考教材)两种下载方式都能熟练操作;了解STM32CUBE和MDK-ARM进阶内容;制作者或logo模块小结67谢谢!单片机与嵌入式系统原理与应用制作者或logo项目2LED流水灯68模块3GP模块3GPIO控制IO控制项目2LED流水灯项目3电子门铃之按键轮询主要内容和学习重点项目2:LED流水灯知识准备认识STM32的GPIO——重点是开漏输出和推挽输出工作模式电压特性和电流特性函数的灵活调用认识STM32的SYSTICK——重点是学习使用HAL_Delay()函数项目实施:LED流水灯任务拓展GPIO引脚的HAL符号常量——重点知识拓展存储器组织、FLASH组织内嵌的bootloader(引导加载程序)和启动模式选择字节项目3:电子门铃之按键轮询知识准备认识STM32GPIO输入模式重点是能区分三种输入模式的适用情况蜂鸣器用法巩固GPIO输出控制项目实施
:电子门铃项目探究GPIOHAL结构体和初始化HAL驱动手册识读——重点习题/拓展任务知识拓展HALGPIO函数解读寄存器位可操作方式模块小结制作者或logo目录69知识准备:认识STM32的GPIOSTM32GPIO的工作模式GPIO_MODE_OUTPUT_OD:开漏输出模式只能输出低电平,要输出高电平需要外部加上拉电阻——可用于电平不匹配的情况利用外部电路的驱动,可减少IC内部驱动将多个开漏输出引脚连接到一条线上,通过一只上拉电阻,在不增加器件的情况下,形成“线与”逻辑关系——IIC、SMBUS等总线判断总线占用状态的原理。GPIO_MODE_OUTPUT_PP:推挽输出模式可输出高电平和低电平,用于连接数字器件。一般除了必须使用开漏输出的情形,其他输出模式都设置为推挽输出GPIO_MODE_AF_PP:复用推挽输出GPIO_MODE_AF_OD:复用开漏输出GPIO_MODE_AIN:模拟输入GPIO_MODE_IN_FLOAT:浮空输入GPIO_MODE_IPD:下拉输入GPIO_MODE_IPU:上拉输入制作者或logo项目2LED流水灯70可参考:/s?src=11×tamp=1646196732&ver=3651&signature=fw6ChLf52hObsA-CX3tRs0*ftp8Nl4xTDXpajpP6V6jYP4dttNyBigveXPAiMeIBvkfoMxSecsloBYbjTJ9Z8SggV8iuM7naUX4NUu8DR0WY7XmvOZBONGbqUsBR8K6l&new=1↑摘自STM32CUBEMX配置界面↑摘自STM32CUBEMX配置界面知识准备:认识STM32的GPIO电压特性和电流特性–查阅数据手册制作者或logo项目2LED流水灯71注:Injectedcurrent(注入电流)是由高于正电源或低于地的输入电压强制进入引脚的电流。注:手册中标有“FT”的引脚能够耐5V↙↑摘自STM32F103数据手册知识准备:STM32IO端口基本结构-输出GPIO_MODE_OUTPUT_PP:推挽输出模式可快速切换0和1GPIO_MODE_OUTPUT_OD:开漏输出模式类似51单片机P0端口制作者或logo项目2LED流水灯72↙摘自STM32F10xxx参考手册↗/foxclever/article/details/109435244↗知识准备:认识STM32的GPIOGPIOOutputSpeed输出速度查阅参考手册通过提高GPIO输出速度,可以提高输出电压的变化率(减少上升时间)。但是,电路辐射的功耗和噪声会随着GPIO速度的增加而增加。默认情况下,应该保持低GPIO速度,除非有特定原因需要提高它。制作者或logo项目2LED流水灯73知识准备:认识STM32的GPIO制作者或logo项目2LED流水灯74知识准备:GPIOHAL函数原型voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);voidHAL_GPIO_DeInit(GPIO_TypeDef*GPIOx,uint32_tGPIO_Pin);初始化和去初始化(恢复到GPIO的初始状态)GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);读引脚状态voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);写引脚voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);翻转HAL_StatusTypeDefHAL_GPIO_LockPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);锁引脚voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin);//外部中断的服务函数代码制作者或logo项目2LED流水灯75stm32f1xx_hal_gpio.c知识准备:GPIOHAL库函数思考以下代码会点亮什么灯HAL_GPIO_WritePin(LED2_GPIO_Port,0xFF,GPIO_PIN_RESET);制作者或logo项目2LED流水灯76voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);知识准备:认识STM32的SYSTICKSYSTICK是Cortex-M3内核中的定时器时钟--嘀嗒定时器24位的倒计数定时器只要不把CTRL寄存器的ENABLE位清0,就永不停止当计数到0时就会从LOAD寄存器中自动重装初值,触发异常SYSTICK的设定步骤选择时钟源设定重载数开启中断启动SYSTICKSTM32CUBEMX默认启动SYSTICK,并设定为定时1ms__weakvoidHAL_Delay(uint32_tDelay){…}制作者或logo项目2LED流水灯77__weak表示用户可以重定义该函数,并优先使用用户定义的函数SYSTICK一般用于操作系统产生时基,维持操作系统的心跳。HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);HAL_Delay(1000);时基是一个时间显示的基本单位项目实施:基于M3主控模块项目2:LED流水灯利用STM32CUBEMX提供的GPIO库函数和HAL_Delay()实现流水灯LED1和LED5->LED2和LED6->LED3和LED7->LED4和LED8”每次亮灯保持500ms。制作者或logo项目2LED流水灯78摘自
“M3主控模块”电路图→项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置参照项目1的方法,根据右图设置制作者或logo项目2LED流水灯79↖参照项目1的设置项目实施:代码编写和结果验证参照项目1进行KEILMDK“Build”操作和程序下载,并在M3模块上查看项目结果制作者或logo项目2LED流水灯80习题/拓展任务:基于M3主控模块习题使用位移运算符和循环语句,实现代码优化参考右图拓展任务采用位移运算符和循环语句实现LED流水灯不停地来回流动(LED1->...->LED8->LED7...->LED1...)制作者或logo项目2LED流水灯81项目实施:基于Proteus仿真项目2:LED流水灯利用STM32CUBEMX提供的GPIO库函数和HAL_Delay()实现流水灯LED1和LED6->LED2和LED7->LED3和LED8->LED4和LED9->LED5和LED10每次亮灯保持500ms制作者或logo项目2LED流水灯82Proteus仿真电路图→项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置参照项目1的方法,根据右图设置制作者或logo项目2LED流水灯83↖参照项目1的设置项目实施:代码编写和结果验证参照项目1进行KEILMDK“Build”操作和程序下载,并在仿真电路上查看结果制作者或logo项目2LED流水灯84习题/拓展任务:基于Proteus仿真习题使用位移运算符和循环语句,实现代码优化参考右图拓展任务采用位移运算符和循环语句实现LED流水灯不停地来回流动(LED1->...->LED8->LED7...->LED1...)制作者或logo项目2LED流水灯85项目探究HAL库对GPIO引脚号的定义制作者或logo项目2LED流水灯86知识拓展:存储器组织程序存储器、数据存储器、寄存器和输入输出端口被组织在同一个4G的线性地址空间内。可访问的存储器空间被分成8个主块,每个块512M。查阅数据手册40页的存储器映射图制作者或logo项目2LED流水灯87摘自STM32F103大容量产品数据手册40页表9↓摘自KEILMDKOptions配置界面知识拓展:FLASH组织制作者或logo项目2LED流水灯88↓摘自STM32F10xxx参考手册摘自STM32F103大容量产品数据手册40页表9知识拓展:内嵌的bootloader(引导加载程序)和启动模式内嵌的bootloader程序存放在系统存储器(Systemmemory)之中,是在ST生产线上写入的。系统存储器(Systemmemory)启动模式的下载步骤BOOT0连接到高电位,BOOT1连接到低电位,并按下复位键,使启动方式生效调用下载软件,通过串口下载程序到FLASH中将BOOT0重新连接到低电位,按下复位键进行手动复位,恢复主闪存启动方式并使程序运行制作者或logo项目2LED流水灯89--注意:用户的程序是保存在主闪存(FLASH)中的知识拓展:选择字节OptionBytes用于系统配置,用户可根据需要进行配置比如:低功耗管理复位的设置比如:硬件看门狗是否在复位后自动运行自定义数据字节制作者或logo项目2LED流水灯90↓摘自STM32F10xxx参考手册项目3知识准备:认识STM32GPIO的输入模式STM32GPIO的工作模式GPIO_MODE_IN_FLOAT:浮空输入GPIO_MODE_IPD:下拉输入GPIO_MODE_IPU:上拉输入GPIO_MODE_OUTPUT_OD:开漏输出模式GPIO_MODE_OUTPUT_PP:推挽输出模式GPIO_MODE_AF_PP:复用推挽输出GPIO_MODE_AF_OD:复用开漏输出GPIO_MODE_AIN:模拟输入制作者或logo项目3电子门铃之按键轮询91知识准备:STM32IO端口基本结构-输入GPIO_MODE_IPU:上拉输入,常用于检测低电平GPIO_MODE_IPD:下拉输入,常用于检测高电平GPIO_MODE_IN_FLOAT:浮空输入,未连接外部电路时电平状态不确定制作者或logo项目3电子门铃之按键轮询92↙摘自STM32F10xxx参考手册摘自STM32F10xxx参考手册↗摘自STM32CUBEMX
时钟配置界面知识准备:判断按键的代码GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);制作者或logo项目3电子门铃之按键轮询93if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==_____________){//请思考:这部分代码应该写到main.c的什么地方HAL_Delay(5);//按键消抖if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==_____________){}}知识准备:蜂鸣器用法按驱动方式不同,蜂鸣器分为:有源蜂鸣器和无源蜂鸣器“有源”、“无源”指的是内部有无振荡源无源蜂鸣器内部没有振荡源,需输入一定频率的脉冲信号价格较便宜,可以发出不同音(控制频率)有源蜂鸣器内部有振荡源,只需合适的电平信号即可发声较贵,驱动简单一般MCU的驱动能力不足于直接驱动蜂鸣器,需要放大电路根据M3模块的蜂鸣器电路图,控制引脚为_____?应配置为(输入or输出)?无源蜂鸣器的发声代码(以提供方波信号为例):制作者或logo项目3电子门铃之按键轮询94↓仿真电路图中的蜂鸣器电路M3模块中的蜂鸣器电路↗HAL_GPIO_TogglePin(BUZZ_GPIO_Port,BUZZ_Pin);HAL_Delay(1);项目实施:基于M3主控模块项目3:电子门铃之按键轮询按下KEY1,LED1亮;按下KEY2,LED1灭;提示1:KEY1-PC13KEY2-PD13按住KEY1,蜂鸣器以100Hz的频率发声提示2:蜂鸣器BUZZ的设置与LED相同,注意连接的引脚制作者或logo项目3电子门铃之按键轮询95项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置无源蜂鸣器:与LED的设置相同,label设为BUZZ或其他名称按键:①搜索PC13;②设置输入功能设置;③设置输入模式和用户标签KEY2的设置与KEY1类似,注意从电路图中查出KEY2连接的是哪个GPIO口制作者或logo项目3电子门铃之按键轮询96↖按照任务1-1的设置项目实施:代码编写判断按键KEY1是否被按下→判断KEY2的代码请自行添加令蜂鸣器发声的代码→令蜂鸣器关闭的代码→LED1的亮灭请自行添加代码注意思考每一个功能代码应该被添加在什么地方制作者或logo项目3电子门铃之按键轮询97if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==_____________){HAL_Delay(5);//按键消抖if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==_____________){}}HAL_GPIO_TogglePin(BUZZ_GPIO_Port,BUZZ_Pin);HAL_Delay(5);HAL_GPIO_WritePin(BUZZ_GPIO_Port,BUZZ_Pin,GPIO_PIN_RESET);注意:按键消抖代码中还有1个HAL_Delay(5)项目实施:请将代码添写到正确的位置
/*Initializeallconfiguredperipherals*/MX_GPIO_Init();
/*USERCODEBEGIN2*/
/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/while(1){
/*USERCODEENDWHILE*/
/*USERCODEBEGIN3*/}
/*USERCODEEND3*/制作者或logo项目3电子门铃之按键轮询98请注意:将代码填写到BEGIN和END之间!项目实施:基于Proteus仿真项目3:电子门铃之按键轮询按下KEY11,LED11亮;按下KEY12,LED11灭;提示1:KEY11-PC13KEY12-PC12按住KEY11,蜂鸣器以100Hz的频率发声提示2:蜂鸣器BUZZ的设置与LED相同注意时钟源选HSI/8MHz←按照图中电路,请将按键配置为GPIO_MODE_IPU:上拉输入模式制作者或logo项目3电子门铃之按键轮询99项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置无源蜂鸣器:与LED的设置相同,label设为BUZZ或其他名称按键:①搜索PC13②设置输入功能③设置输入模式和用户标签KEY12的设置与KEY11类似,注意从Proteus电路中查出KEY12连接的是哪个GPIO口制作者或logo项目3电子门铃之按键轮询100↖按照任务1-4的设置①②③闪,单击,选择“输入模式”项目实施:代码编写任务分解判断按键KEY11是否被按下→判断KEY12的代码请自行添加令蜂鸣器发声的代码→令蜂鸣器关闭的代码→LED11的亮灭请自行添加代码注意思考任务分解后每个功能代码应该被添加在什么地方制作者或logo项目3电子门铃之按键轮询101if(HAL_GPIO_ReadPin(KEY11_GPIO_Port,KEY11_Pin)==_____________){HAL_Delay(5);//按键消抖if(HAL_GPIO_ReadPin(KEY11_GPIO_Port,KEY11_Pin)==_____________){}}HAL_GPIO_TogglePin(BUZZ_GPIO_Port,BUZZ_Pin);HAL_Delay(5);HAL_GPIO_WritePin(BUZZ_GPIO_Port,BUZZ_Pin,GPIO_PIN_RESET);注意:按键消抖代码中还有1个HAL_Delay(5)项目实施:请将代码添写到正确的位置
/*Initializeallconfiguredperipherals*/MX_GPIO_Init();
/*USERCODEBEGIN2*/
/*USERCODEEND2*//*Infiniteloop*//*USERCODEBEGINWHILE*/while(1){
/*USERCODEENDWHILE*/
/*USERCODEBEGIN3*/}
/*USERCODEEND3*/制作者或logo项目3电子门铃之按键轮询102请注意:将代码填写到BEGIN和END之间!项目实施:仿真实现加载程序的方法与任务1-4相同制作者或logo项目3电子门铃之按键轮询103习题习题简述STM32GPIO3种输入模式的不同之处和适用场合。操作题使用轮询方式,使每次按下并放开KEY1后,所有LED快闪一次(亮灭各100ms)制作者或logo项目3电子门铃之按键轮询104项目探究:GPIO初始化voidMX_GPIO_Init();//STM32CUBEMX自动生成的初始化函数GPIO结构体变量的定义输入引脚的初始化:输出引脚的初始化多引脚同时初始化制作者或logo项目3电子门铃之按键轮询105项目探究:结构体GPIO_InitTypeDef结构体structSTM32CUBEMX类型别名typedef结构体成员就是GPIO引脚的设置项制作者或logo项目3电子门铃之按键轮询106←STM32CUBEMX↨KEILMDK项目探究:结构体GPIO_InitTypeDef和GPIO_TypeDefGPIO_InitTypeDefGPIO_TypeDef制作者或logo项目3电子门铃之按键轮询107为成员赋值函数原型:voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);struct第三种定义方式思考:HAL_GPIO_Init函数两个参数有什么不同,为什么后一个参数需要加&①④①①②③④②项目探究:结构体GPIO_InitTypeDef和GPIO_Type(续)制作者或logo项目3电子门铃之按键轮询108函数原型:voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);项目探究:
识读HAL驱动文档识读STM32F1_HAL_LL_Drivers.pdf制作者或logo项目3电子门铃之按键轮询109②①项目探究:
识读HAL驱动文档制作者或logo项目3电子门铃之按键轮询110③项目探究:
识读HAL驱动文档制作者或logo项目3电子门铃之按键轮询111④⑤⑥⑥知识拓展:
HAL_GPIO_ReadPin()解读返回值:GPIO_PinState参数GPIOx:
指向GPIO_TypeDef的指针—指定GPIO端口GPIO_Pin:uint16_t类型—指定GPIO口的引脚制作者或logo项目3电子门铃之按键轮询112↖摘自中文参考手册↓摘自中文参考手册目录①②④③②③④⑤③if(HAL_GPIO_ReadPin(KEY11_GPIO_Port,KEY11_Pin)==GPIO_PIN_RESET){}⑤⑤①知识拓展:参数GPIOx(x=A-G)制作者或logo项目3电子门铃之按键轮询113摘自STM32F103大容量产品数据手册40页表9③⑴③⑵③⑶③⑷③⑸知识拓展:
HAL_GPIO_WritePin()解读void无返回值参数:3个GPIOx:
指向GPIO_TypeDef的指针—指定GPIO端口GPIO_Pin:uint16_t类型—指定GPIO口的引脚PinState:GPIO_PinState枚举常量—指定写入0或1制作者或logo项目3电子门铃之按键轮询114↑摘自中文参考手册←摘自中文参考手册目录HAL_GPIO_TogglePin()函数知识拓展:寄存器位可操作方式制作者或logo项目3电子门铃之按键轮询115↓摘自中文参考手册模块小结熟悉STM32
GPIO的8种工作模式和名称,理解开漏输出和推挽输出的用法及其CUBEMX配置;理解三种输入模式的用法及其CUBEMX配置;理解STM32
GPIOHAL库函数的用法和HAL库中GPIO相关结构体的用法;理解Cortex-M3SYSTICK原理,能够使用SYSTICK时钟来控制时间间隔;能读懂M3主控模块/Proteus仿真电路中的LED、按键、蜂鸣器电路图;熟练使用STM32CUBEMX创建工程和生成代码;熟练使用KEILMDK进行程序的编写和调试;了解STM32存储器的组织,理解不同启动模式的工作原理;能够使用GPIO输出功能控制LED、蜂鸣器等器件;能够使用GPIO输入功能控制按键;制作者或logo模块小结116谢谢!单片机与嵌入式系统原理与应用ByYangJ.X.项目4:电子门铃117
模块4外部中断/事件控制器EXTI部中断/事件控制器EXTI电子门铃之按键中断主要内容和学习重点项目4:电子门铃之按键中断知识准备STM32F1系列MCU的中断区分异常与中断GPIOEXTI外部中断/事件控制器区分中断触发与事件触发项目实施电子门铃之按键中断:基于M3主控模块电子门铃之按键中断:基于Proteus仿真项目实施(续)习题项目探究EXTI初始化EXTI中断处理——重点知识拓展STM32启动程序EXTI功能解读模块小结制作者或logo目录118知识准备:STM32F1系列MCU的中断异常和中断所有能打断正常执行流的事件都称为异常。STM32的异常是指由于CPU内部事件所引起的打断,如程序出错、服务调用等;中断是指由于CPU外部的设备的事件引起的打断,如串口接收中断、打印机中断等。STM32F10xxx的非互联型产品提供10个异常和60个可屏蔽的中断通道请查阅参考手册”表55其它STM32F10xxx产品(小容量、中容量和大容量)的向量表”
除了个别异常的优先级为固定,其他的异常和中断都可设置优先级Cortex-M3支持(11+5保留)的异常和最多240个中断制作者或logo项目4:电子门铃119—中断服务程序的入口地址中断屏蔽、中断使能、中断请求、中断响应、中断嵌套、中断挂起中断向量知识准备:STM32F1系列MCU的中断嵌套向量中断控制器NVICNestedVectoredInterruptControllerNVIC是Cortex-M3的一个外设,用于管理中断、电源等功能。Cortex-M3使用8位的寄存器用于设置中断的优先级别,理论上可以设置256级。STM32的NVICIPR只使用其中的4位来区分优先级别,这4个bit又被分成抢占优先级和子优先级,其各自所占位数由寄存器SCB_AIRCR的[位8:位10]的值决定。制作者或logo项目4:电子门铃120——中文参考手册知识准备:STM32F1系列MCU的中断STM32使用4位来区分优先级别,这4个bit又被分成抢占优先级和子优先级,其各自所占位数由寄存器SCB_AIRCR的[位8:位10]的值决定。所有4位-抢占(组)优先级-STM32CubeMX默认项高3位-抢占(组)优先级,低1位-子优先级高2位-抢占(组)优先级,低2位-子优先级高1位-抢占(组)优先级,低3位-子优先级所有4位-子优先级只有抢占优先级高的中断能够打断抢占优先级低的中断,子优先级只决定响应顺序!如果抢占优先级和子优先级都相同,就按向量表的优先级制作者或logo项目4:电子门铃121知识准备:STM32F1系列MCU的中断–NVIC优先级别的设置↙在STM32CUBEMX中设置NVIC优先级别数值越小,优先级别越高制作者或logo项目4:电子门铃122摘自《STM32F10xxxCortex-M3编程手册》↓↑下载自/resource/en/programming_manual/cd00228163-stm32f10xxx-20xxx-21xxx-l1xxxx-cortex-m3-programming-manual-stmicroelectronics.pdf摘自STM32CUBEMX↓
知识准备:
GPIOEXTI外部中断/事件控制器STM32F1系列微控制器所有端口都有外部中断能力;为了使用外部中断线,端口必须配置成输入模式;——中文参考手册8.1.3STM32F1系列大、中、小容量微控制器的外部中断/事件控制器由19个能产生事件/中断请求的边沿检测器组成中断和事件中断通常用于由ARM内核(NVIC、中断处理程序等)执行几行代码;事件不需要执行代码,但可以通知另一个外围设备在没有CPU干预的情况下执行某些操作。例如,外部中断或定时器可以生成一个事件来触发ADC进行采样,然后使用DMA将测量值写入内存,而无需唤醒ARM核心处理器—理论上不执行任何代码,即可完成这些工作。制作者或logo项目4:电子门铃123——中文参考手册9.2边沿触发触发中断触发事件从GPIO引脚输入↙EXTI框图知识准备:
GPIOEXTI外部中断/事件控制器外部中断/事件线↓摘自中文参考手册表55制作者或logo项目4:电子门铃124↙摘自中文参考手册PVD—可编程电压监测器↙摘自中文参考手册图20之后的说明部分触发中断触发事件EXTI框图↖从GPIO引脚输入知识准备:
GPIOEXTI外部中断/事件控制器外部中断/事件线EXTI0-15用于GPIOEXTI5~EXTI9共用一个中断通道EXTI10~EXTI15共用一个中断通道制作者或logo项目4:电子门铃125…↓摘自中文参考手册表55↙↘摘自中文参考手册图20摘自中文参考手册图20→以及图后的说明↘知识准备:STM32CUBEMXGPIO模式上升沿触发中断下降沿触发中断上升沿和下降沿都触发中断上升沿触发事件下降沿触发事件上升沿和下降沿都触发事件GPIO的上拉/下拉制作者或logo项目4:电子门铃126项目实施:基于M3主控模块项目4:电子门铃之外部中断按住KEY1,蜂鸣器以250Hz的频率发声;放开KEY1,关闭蜂鸣器配置STM32CUBEMX,并生成MDK-ARM源代码编写代码,编译和调试程序下载程序250Hz的频率发声→每隔1/250/2=0.002秒切换1次蜂鸣器的引脚电平使用外部中断功能制作者或logo项目4:电子门铃127←摘自1+X传感网考证设备“M3主控模块”电路图→项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置KEY1设置为GPIO_EXTI13-外部中断/事件线13触发模式输入模式用户标签EXTI线中断使能LED与蜂鸣器按照任务3-1的设置方式制作者或logo项目4:电子门铃128②③④⑤↖按照任务1-1的设置←NVIC优先级分组设置①重要!②③④项目实施:代码编写和结果验证在main.c中重定义HAL_GPIO_EXTI_Callback()函数,也可以写在GPIO.C文件中注意写在用户代码位置中,同学可自行编写代码,此代码做为参考结果验证:M3主控模块中按下KEY1时蜂鸣器发出声音制作者或logo项目4:电子门铃129请在本参考代码的基础上,修改外部中断的触发模式,体会不同触发模式的效果。别忘了写变量key1_flag的声明!所有外部中断线通用的回调函数↖注意添加参数←添加关闭蜂鸣器的代码
(参考项目3)项目实施:请将代码添写到正确的位置/*Privatevariables--------------------*//*USERCODEBEGINPV*//*USERCODEENDPV*/…略…intmain(void){HAL_Init();SystemClock_Config();/*Initializeallconfiguredperipherals*/MX_GPIO_Init();/*USERCODEBEGIN2*/
/*USERCODEEND2*/
/*Infiniteloop*/
/*USERCODEBEGINWHILE*/while(1){
/*USERCODEENDWHILE*/
/*USERCODEBEGIN3*/}
/*USERCODEEND3*/}/*注main()到此结束*/…略…/*USERCODEBEGIN4*//*USERCODEEND4*/制作者或logo项目4:电子门铃130①②结果验证结果验证M3主控模块中按下KEY1时喇叭发出声音;放开KEY1时喇叭关闭制作者或logo项目4:电子门铃131项目实施:基于proteus仿真项目4:电子门铃之按键中断按住KEY11,蜂鸣器以250Hz的频率发声;放开KEY11,关闭蜂鸣器按下KEY12,LED11亮;再次按下KEY12,LED11灭;依次轮换…配置STM32CUBEMX,生成MDK-ARM源代码编写代码,编译和调试程序下载程序进行验证250Hz的频率发声→每隔1/250/2=0.002秒
切换1次连接蜂鸣器的引脚电平使用外部中断功能制作者或logo项目4:电子门铃132项目实施:STM32CUBEMX的设置MCU选型、RCC和SYS,时钟ClockConfiguration和项目ProjectManagerGPIO设置KEY11设置为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 测量施工方案概述(3篇)
- 井模块施工方案(3篇)
- 混凝土施工方案更改(3篇)
- 排水吊车施工方案(3篇)
- 背单词技巧方法课程设计
- 演讲答辩活动策划方案(3篇)
- 爱出发策划活动方案(3篇)
- 基于RAG的知识检索课程设计
- 电梯施工方案公示(3篇)
- 相亲论坛活动策划方案(3篇)
- 询证函复函协议书
- 2026年江西应用技术职业学院单招职业技能测试题库带答案详解
- 2025 九年级数学下册二次函数与一次函数交点问题课件
- 2022青鸟消防JBF5131A 型输入模块使用说明书
- 五个带头方面整改措施
- 2026年江苏海事职业技术学院单招职业倾向性测试必刷测试卷含答案
- 2026年内蒙古机电职业技术学院单招职业技能考试题库及答案解析(夺冠)
- 2025年REACH第35批SVHC高度关注物质清单251项
- 2026年河北科技学院单招(计算机)测试备考题库及答案1套
- 征兵考试试题与答案详解
- 2025年扬州市邗江区辅警招聘考试题库附答案解析
评论
0/150
提交评论