嵌入式设计与开发实训指导 课件 郭书军 第1-6章 STM32 MCU-内部集成电路总线接口I2C_第1页
嵌入式设计与开发实训指导 课件 郭书军 第1-6章 STM32 MCU-内部集成电路总线接口I2C_第2页
嵌入式设计与开发实训指导 课件 郭书军 第1-6章 STM32 MCU-内部集成电路总线接口I2C_第3页
嵌入式设计与开发实训指导 课件 郭书军 第1-6章 STM32 MCU-内部集成电路总线接口I2C_第4页
嵌入式设计与开发实训指导 课件 郭书军 第1-6章 STM32 MCU-内部集成电路总线接口I2C_第5页
已阅读5页,还剩267页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式设计与开发实训指导“蓝桥杯”嵌入式设计与开发竞赛培训教材第1章STM32MCU

实验1软件开发环境

☆第2章软件开发环境与工具 实验2GPIO

☆第3章通用并行接口GPIO 实验3LCD

☆第4章通用同步/异步收发器接口

实验4USART

☆第5章串行设备接口SPI

实验5SPI

☆第6章内部集成电路总线接口I2C

实验6I2C ☆第7章

模数转换器ADC 实验7ADC

☆第8章

定时器TIM

实验8TIM

☆第9章

嵌套向量中断控制器NVIC 实验9NVIC ☆第10章

直接存储器存取DMA

实验10DMA

☆第12章

往届试题

☆嵌入式设计与开发实训指导目

录2024/6/4方法以实验为核心,采用翻转课堂形式教学具体方法:课前预习,课上讨论,课后总结课前:预习实验内容,完成预习报告课上:提出问题,回答问题,通过讨论掌握实验内容课后:结合实验和讨论,在预习报告基础上完成实验报告23:09:47嵌入式设计与开发实训指导嵌入式系统嵌入式系统是嵌入到对象体系中的专用计算机系统嵌入式系统是以应用为中心,以计算机技术为基础,硬件和软件可裁剪,适应应用系统对功能、可靠性、成本、体积和功耗等严格要求的专用计算机系统嵌入式系统和通用计算机系统类似,由处理器、存储器、输入输出接口和输入输出设备以及软件等部分组成但作为专用计算机系统的嵌入式系统和通用计算机系统相比,具有以下几个重要特征:系统简练、专用性强、实时操作系统支持和专门开发工具支持23:09:47嵌入式设计与开发实训指导嵌入式系统嵌入式系统最初的应用是单片机系统最早的单片机是Intel公司的8048(1976)和8051(1980)近几年流行的是ARM公司的Cortex-M系列Cortex-M0(基本型)、Cortex-M3、Cortex-M4(DSP)物联网(IoT)=互联网+智能硬件(嵌入式系统)智能硬件是以平台性底层软硬件为基础,以智能传感互联、人机交互、新型显示及大数据处理等新一代信息技术为特征,以新设计、新材料、新工艺硬件为载体的新型智能终端产品及服务23:09:47嵌入式设计与开发实训指导嵌入式系统设计硬件设计:需求分析

功能确定

方框图

电路图

PCB制作

硬件调试23:09:47嵌入式设计与开发实训指导嵌入式系统设计软件设计:需求分析

算法确定

流程图

源程序

调试运行23:09:47嵌入式设计与开发实训指导嵌入式系统设计嵌入式系统的C语言程序设计与一般的C语言程序设计基本相同,主要差别是:嵌入式系统C语言程序设计常用到位操作,包括“位反~”、“左移<<”、“右移>>”、“位与&”、“位或|”和“位异或^”等注意“位与&”和“位或|”与“逻辑与&&”和“逻辑或||”的区别使用位操作的主要目的是只对控制和状态寄存器的指定位进行操作,对其他位的值不产生影响。23:09:47嵌入式设计与开发实训指导1.1STM32MCU结构

☆1.2STM32MCU存储器映像

☆1.3STM32MCU系统时钟树

☆1.4Cortex-M4简介

☆前页

返回第1章STM32MCU嵌入式设计与开发实训指导2024/6/4前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导第1章STM32MCU1.1STM32MCU结构由控制单元、从属单元和总线矩阵三大部分组成,控制单元和从属单元通过总线矩阵相连接控制单元包括Cortex-M4内核和两个DMA控制器(DMA1和DMA2)总线矩阵:

I-bus、D-bus、S-busAHB1、AHB2前页

返回23:09:47嵌入式设计与开发实训指导1.1STM32MCU结构从属单元包括存储器(FLASH和SRAM等)和设备(连接片外设备的接口和片内设备)连接片外设备的接口有并行接口和串行接口,并行接口即通用IO接口GPIO,串行接口有USART、SPI、I2C、USB和CAN等前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.1STM32MCU结构片内设备有定时器TIM、模数转换器ADC和数模转换器DAC等定时器包括高级控制定时器TIM1/8、通用定时器TIM2-5、基本定时器TIM6/7、实时钟RTC、独立看门狗IWDG和窗口看门狗WWDG等前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.1STM32MCU结构注意:系统复位后,除FLASH接口和SRAM时钟允许外,所有设备时钟都被关闭,使用前必须设置时钟使能寄存器(RCC_APBENR)允许设备时钟。前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.2STM32MCU存储器映像程序存储器、数据存储器和输入输出端口寄存器被组织在同一个4GB的线性地址空间内前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树系统时钟树由系统时钟源、系统时钟和设备时钟等部分组成系统时钟源有5个:高速外部时钟HSE(4~48MHz)、低速外部时钟LSE(32.768kHz)、高速内部时钟HSI(16MHz)、高速内部时钟HSI48(48MHz)和低速内部时钟LSI(32kHz)外部时钟用晶体振荡器OSC实现,内部时钟用RC振荡器实现前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树系统时钟SYSCLK(最大170MHz)可以是HSE或HSI,也可以是HSE或HSI通过锁相环倍频后的锁相环时钟PLLCLK系统复位后的系统时钟为HSI,这就意味着即使没有HSE系统也能正常工作,只是HSI的精度没有HSE高SYSCLK经AHB预分频器分频后得到AHB总线时钟HCLK(最大170MHz),HCLK经APB1/APB2预分频器分频后得到APB1/APB2总线时钟PCLK1(最大170MHz)和PCLK2(最大170MHz),PCLK1和PCLK2分别为相连的设备提供设备时钟前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树系统时钟树中的时钟选择、预分频值和外设时钟使能等都可以通过对复位和时钟控制(RCC)寄存器编程实现前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树复位和时钟控制(RCC)寄存器结构体RCC_TypeDef在Drivers\CMSIS\

Device\ST\STM32G4xx\Include\stm32g431xx.h中定义常用的RCC

HAL宏定义在stm32g4xx_hal_rcc.h中定义如下:#define__HAL_RCC_GPIOA_CLK_ENABLE()\do{\__IOuint32_ttmpreg;\

SET_BIT(RCC->AHB2ENR,RCC_AHB2ENR_GPIOAEN);\/*DelayafteranRCCperipheralclockenabling*/\tmpreg=READ_BIT(RCC->AHB2ENR,RCC_AHB2ENR_GPIOAEN);\UNUSED(tmpreg);\}while(0)前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树复位和时钟控制(RCC)寄存器结构体RCC_TypeDef在Drivers\CMSIS\

Device\ST\STM32G4xx\Include\stm32g431xx.h中定义常用的RCC

LL库函数在stm32g4xx_ll_bus.h中声明如下:__STATIC_INLINEvoidLL_AHB2_GRP1_EnableClock(uint32_tPeriphs){__IOuint32_ttmpreg;

SET_BIT(RCC->AHB2ENR,Periphs);/*DelayafteranRCCperipheralclockenabling*/tmpreg=READ_BIT(RCC->AHB2ENR,Periphs);(void)tmpreg;}

前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.3STM32MCU系统时钟树对比RCC的HAL和LL实现可以看出:两者的操作相同,都是对指定寄存器(RCC->AHB2ENR)的指定位(RCC_AHB2ENR_GPIOAEN)进行读(READ_BIT)写(SET_BIT)操作。因此,寄存器的读写操作是所有操作的基础

前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介Cortex-M4是采用哈佛结构的32位处理器内核,拥有独立的指令总线和数据总线,两者共享同一个4GB存储空间Cortex-M4内建一个嵌套向量中断控制器(NVIC:NestedVectoredInterruptController),支持可嵌套中断、向量中断和动态优先级等Cortex-M4内部还包含一个系统滴答定时器SysTick前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介SysTick的核心是1个24位递减计数器,使用时根据需要设置初值(LOAD),启动(ENABLE=1)后在系统时钟(HCLK或HCLK/8)的作用下递减,减到0时置计数标志位(COUNTFLAG)并重装初值系统可以查询计数标志位,也可以在中断允许时产生SysTick中断前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介SysTick通过4个32位寄存器进行操作前页

返回控制状态寄存器有3个控制位和1个状态位第1章STM32MCU23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介常用的SysTick

HAL库函数在stm32g4xx_hal.c中声明如下:HAL_StatusTypeDefHAL_InitTick(uint32_tTickPriority);voidHAL_Delay(uint32_tDelay);前页

返回第1章STM32MCU(1)SysTick初始化HAL_StatusTypeDefHAL_InitTick(uint32_tTickPriority);参数说明:

★TickPriority:SysTick中断优先级,在stm32g4xx_hal_conf.h中定义如下:

#defineTICK_INT_PRIORITY 0U返回值:HAL_StatusTypeDef-HAL状态,在stm32g4xx_hal_def.h中定义23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介常用的SysTick

HAL库函数在stm32g4xx_hal.c中声明如下:HAL_StatusTypeDefHAL_InitTick(uint32_tTickPriority);voidHAL_Delay(uint32_tDelay);前页

返回第1章STM32MCU(2)HAL延时voidHAL_Delay(uint32_tDelay);参数说明:

★Delay:延时值(ms)23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介常用的SysTickLL库函数在stm32g4xx_ll_utils.h中声明如下:voidLL_Init1msTick(uint32_tHCLKFrequency);voidLL_mDelay(uint32_tDelay);前页

返回第1章STM32MCU(1)SysTick初始化voidLL_Init1msTick(uint32_tHCLKFrequency);参数说明:

★HCLKFrequency:HCLK频率(170MHz)注意:LL_Init1msTick()没有允许SysTick中断,需要用stm32g4xx_ll_cortex.h中的下列函数允许SysTick中断:voidLL_SYSTICK_EnableIT(void);23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介常用的SysTickLL库函数在stm32g4xx_ll_utils.h中声明如下:voidLL_Init1msTick(uint32_tHCLKFrequency);voidLL_mDelay(uint32_tDelay);前页

返回第1章STM32MCU(2)LL延时voidLL_mDelay(uint32_tDelay);参数说明:

★Delay:延时值(ms)23:09:47嵌入式设计与开发实训指导1.4Cortex-M4简介Keil中的SysTick对话框其中包含SysTick所有寄存器及其复位值前页

返回第1章STM32MCU23:09:47嵌入式设计与开发实训指导注意:HAL和LL操作本质相同。HAL操作将底层操作进行封装,操作简单,移植性好,比较适合计算机等相关专业的学生学习使用;LL操作和直接操作寄存器类似,目标程序小,有利于对硬件的理解,比较适合电子、通信和自动化等相关专业的学生学习使用。前页

返回第1章STM32MCU嵌入式系统的C语言程序设计与一般的C语言程序设计基本相同,主要差别是嵌入式系统C语言程序设计常用到位操作,包括“位反~”、“左移<<”、“右移>>”、“位与&”、“位或|”和“位异或^”等(注意“位与&”和“位或|”与“逻辑与&&”和“逻辑或||”的区别),使用位操作的主要目的是只对控制和状态寄存器的指定位进行操作,对其他位的值不产生影响。23:09:47嵌入式设计与开发实训指导第2章软件开发环境与工具前页

返回2.1软件开发包(SDK)

☆2.2MCU配置工具(STM32CubeMX)

☆2.3集成开发环境(IDE)

☆嵌入式设计与开发实训指导2024/6/4第2章软件开发环境与工具前页

返回2.1软件开发包(SDK)STM32软件开发包是STM32系统设计的基础,经历了下列3个阶段:固件库(FirmWareLibrary):FWLibV0.3(2007)~V2.0.3(2008)标准外设库(StandardPeripheralsLibrary):SPLibV3.0.0(2009)~V3.5.0(2011)固件包(FirmwarePackage):STM32CubeG4V1.0.0(2019)~V1.5.0(2021)注意:STM32G431只有固件包,没有固件库和标准库嵌入式设计与开发实训指导23:09:47第2章软件开发环境与工具2.1软件开发包(SDK)STM32Cube固件包包括:STM32Cube嵌入式软件包:HAL:硬件抽象层嵌入式软件库,确保STM32系列产品的移植性LL:低层API,提供比HAL更接近硬件的快速轻量化的专业API中间件:USB、RTOS、FatFs和TCP/IP等应用程序:提供完整的应用程序、示例程序和工程模板STM32CubeMX:图形化软件配置工具,用图形向导生成初始化代码嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.1软件开发包(SDK)嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.1软件开发包(SDK)STM32软件开发最基础的工作和单片机类似,是对STM32的设备寄存器进行操作。但STM32的寄存器操作要比单片机复杂得多,初学者很难下手。为了降低开发难度,MCU生产厂商把基本的寄存器操作封装成库函数,软件开发者使用这些库函数进行软件开发就方便很多。根据封装的方法不同,目前常用的有HAL和LL两种库函数。HAL(HardwareAbstractionLayer:硬件抽象层)将底层硬件操作封装在库函数中,上层用户无需关心寄存器如何操作,通过调用库函数实现相应功能,操作简单,移植性强。但HAL封装有些过度,灵活性较差。LL(LowLayer:低层)提供比HAL更接近硬件的快速轻量化的专业库函数,功能强大,使用灵活。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.1软件开发包(SDK)LL直接操作MCU寄存器,HAL直接或通过LL操作MCU寄存器,接口与设备驱动(gpio.c和adc.c等)通过HAL或LL间接操作MCU寄存器,实现用户程序与HAL/LL的隔离,这样用户程序就与HAL/LL无关,可以很方便的进行移植。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)STM32CubeMX是STM32配置和生成初始化代码的图形化软件配置工具,可以用图形向导配置和生成初始化代码。STM32CubeMX支持32位(x86)和64位(x64)Windows7/8/10,下面以STM32CubeMX6.9.0为例介绍STM32CubeMX的安装和使用。STM32CubeMX安装文件如下:SetupSTM32CubeMX-6.9.0-Win.exe:STM32CubeMX安装文件stm32cube_fw_g4_v150.zip:STM32g4系列固件包(可以在STM32CubeMX中下载)嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)STM32CubeMX的使用包括下列步骤:(1)安装嵌入式软件包(2)从MCU新建工程(3)引脚配置(4)时钟配置(5)工程管理(6)生成HAL/LL工程嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)嵌入式设计与开发实训指导前页

返回23:09:47(1)安装嵌入式软件包单击“Help”菜单下的“ManageEmbededSoftwarePackages”菜单项,或单击主界面右侧“Managesoftwareinstallations”下的“INSTALL/REMOVE”,打开嵌入式软件包管理对话框安装STM32G4软件包第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(2)从MCU新建工程嵌入式设计与开发实训指导前页

返回23:09:47

单击“File”菜单下的“NewProject...”菜单项,或单击“NewProject”下的“ACCESSTOMCUSELECTOR”,打开从MCU新建工程对话框,在MCU列表中选择“STM32G431RBTx”

第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(3)引脚配置GPIOUSART1SPI2I2C1ADC1~2TIM1~3NVICRCCSYS嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(4)时钟配置嵌入式设计与开发实训指导前页

返回23:09:47

在HSE左侧输入晶振频率“24”MHz,选中“PLLSourceMux”输入为“HSE”将“PLLM”、“*N”和“/R”的值分别设为“/6”、“X85”和“/2”,将HCLK设为“170”MHz第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(5)工程管理①单击工程管理标签,在ProjectName下输入工程名“HAL”,在ProjectLocation下输入“D:\CT117E-M4”,Toolchain/IDE选择“MDK-ARM”,MinVersion选择“V5”,确认固件包名称和版本为“STM32CubeFW_G4V1.5.0”。②单击“CodeGenerator”,在“STM32CubeMCUpackkagesandembeddedsofewarepacks”中选择“Copyonlythenecessarylibraryfiles”(只复制必要的库文件)。③在“GeneratedFiles”中选中“Generateperipheralinitializationasapairof‘.c/.h’filesperperipheral”(每个设备分别生成一对初始化‘.c/.h’文件)。④单击“AdvancedSettings”,驱动程序默认使用“HAL”。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(6)生成HAL/LL工程①单击右上角的“GENERAECODE”生成HAL工程和初始化代码,生成完成后显示代码生成对话框。②单击“OpenFolder”打开工程文件夹HAL,其中包含下列文件和文件夹:HAL.ioc:STM32CubeMX工程文件MDK-ARM:Keil工程文件夹,包含Keil工程文件和启动代码汇编语言文件Drivers:驱动软件库,包括CMSIS和STM32G4xx_HAL_Driver两个文件夹Core:用户文件夹,包括Inc和Src两个文件夹,Inc包括用户头文件,Src包括用户源文件和1个系统初始化源文件注意:为了多个工程共用驱动软件库和用户文件,可以将“Src”文件夹中的“main.c”文件剪切粘帖到“MDK-ARM”文件夹,Keil工程中也要做相应的修改嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.2MCU配置工具(STM32CubeMX)(6)生成HAL/LL工程③在“AdvancedSettings”中将驱动程序全部修改为“LL”。④单击“File”下“SaveProjectAs..”菜单项,将工程另存到“D:\CT117E-M4\LL”文件夹。⑤单击右上角的“GENERAECODE”生成LL工程和初始化代码,生成完成后打开工程文件夹LL,其中包含下列文件和文件夹:LL.ioc:STM32CubeMX工程文件MDK-ARM:Keil工程文件夹,包含Keil工程文件和启动代码汇编语言文件Drivers:驱动软件库,包括CMSIS和STM32G4xx_HAL_Driver两个文件夹Core:用户文件夹,包括Inc和Src两个文件夹,Inc包括用户头文件,Src包括用户源文件和1个系统初始化源文件嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)STM32的集成开发环境有MDK-ARM、EWARM和STM32CubeIDE等,本书以MDK-ARM为例介绍集成开发环境的安装和使用。MDK-ARM是ARM收购Keil后推出的ARMMCU开发工具,是Keil集成开发环境uVision和ARM高效编译工具RVCT(RealViewComplieTools)的完美结合。MDK-ARM经历了下列5个阶段:DK-ARMV1.0~V1.4KeilDevelopmentToolsforARMV1.5KeilDevelopmentSuiteforARMV2.00~V2.42RealViewMicrocontrollerDevelopmentKitV2.50,V3.00~V3.80,V4.00~V4.20MicrocontrollerDevelopmentKitV4.21~V4.73,V5.00~V5.38嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)早期版本的MDK-ARM内嵌软件开发包如RVMDKV4.12内嵌FWLibV2.0.1MDKV4.73内嵌SPLibV3.5.0从MDK-ARMV5.00开始,软件开发包以STM32Cube固件包的形式单独发布,如stm32cube_fw_g4_v150.zip。下面以MDK-ARMV5.38为例介绍MDK-ARM的安装和使用。MDK-ARM安装文件如下:MDK538.exe:MDK-ARM安装文件Keil.STM32G4xx_DFP.1.2.1.pack:器件支持包嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)MDK-ARM的使用包括:(1)生成目标程序文件(2)配置CMSIS-DAP下载调试器(3)下载目标程序(4)调试目标程序(5)修改工程文件嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(1)生成目标程序文件HAL工程中包含下列4个文件夹:Application/MDK-ARM:包含1个汇编语言源文件Application/User/Core:包含10个用户源文件Drivers/STM32G4xx_HAL_Driver:包含HAL驱动程序源文件Drivers/CMSIS:包含1个系统初始化源文件注意:在“Project”窗口中右击“main.c”,从弹出菜单中选择“OptionsforFile‘main.c’...”,在对话框中将“Path”由“../Core/Src/main.c”修改为“main.c”。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(1)生成目标程序文件选择“Optimization”为“Level0(-O0)”(不优化,方便调试)。确认编译包含路径注意:这些路径对编译非常重要,如果编译包含路径不正确,编译时将会有很多错误。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(1)生成目标程序文件编译C语言源文件并连接生成目标程序文件“HAL.axf”注意:如果生成过程中有错误则不能生成目标程序文件。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(2)配置CMSIS-DAP下载调试器嵌入式设计与开发实训指导前页

返回23:09:47

第2章软件开发环境与工具2.3集成开发环境(IDE)(2)配置CMSIS-DAP下载调试器嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(3)下载目标程序单击生成工具栏中的“Download”按钮,将目标程序下载到竞赛实训平台,竞赛实训平台的8个LED点亮。(4)调试目标程序程序中的语法错误生成时可以发现,但功能错误只能通过调试发现。通过调试不仅可以发现功能错误,还可以验证程序中语句和函数的功能。嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(5)修改工程文件为了将main.c与HAL/LL隔离,可以对工程做如下修改:①单击新建按钮新建文件“Text1”,单击保存按钮将文件另存到“HAL\Core\Src”或“LL\Core\Src”文件夹,文件名为“sys.c”。②右击“Project”中的“Application/User/Core”,在弹出菜单中选择“AddExistingFiletoGroup‘Application/User/Core’...”,选择“Core\Src”文件夹中的“sys.c”文件,单击“Add”按钮将“sys.c”添加到工程中。③在“sys.c”中添加下列代码:#include"main.h"嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(5)修改工程文件为了将main.c与HAL/LL隔离,可以对工程做如下修改:④将main.c中的SystemClock_Config()函数代码剪切粘帖到sys.c文件中。⑤将main()中的下列代码剪切粘帖到SystemClock_Config()函数内前部:/*HAL工程*/HAL_Init();/*LL工程*/LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_AFIO);LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);LL_PWR_DisableUCPDDeadBattery();嵌入式设计与开发实训指导前页

返回23:09:47第2章软件开发环境与工具2.3集成开发环境(IDE)(5)修改工程文件为了将main.c与HAL/LL隔离,可以对工程做如下修改:⑥在SystemClock_Config()函数内后部添加下列代码(仅对LL工程):

LL_SYSTICK_EnableIT();/*允许SysTick中断*/注意:如果生成目标程序时生成输出中出现下列信息:FCARM-OutputNamenotspecified,pleasecheck'OptionsforTarget-Utilities'则是“sys.c”文件类型错误,解决方法是:右击“Application/User/Core”中的“sys.c”,在弹出菜单中选择“OptionforFile‘sys.c’...”,在选项对话框中将“sys.c”的文件类型修改为“CSourcefile”。嵌入式设计与开发实训指导前页

返回23:09:47第3章通用并行接口GPIO前页

返回3.1GPIO简介

☆3.2GPIO配置

☆3.3GPIO库函数

☆3.3.1GPIOHAL库函数3.3.2GPIOLL库函数3.4GPIO设计实例

☆3.4.1HAL库函数软件设计与实现3.4.2LL库函数软件设计与实现3.5GPIO设计调试

☆3.6LCD使用

☆嵌入式设计与开发实训指导2024/6/4前页

返回3.1GPIO简介GPIO包括多个16位I/O端口,每个端口可以独立设置4种输入方式和4种输出方式,并可独立地置位或复位GPIO由寄存器、输入驱动器和输出驱动器等部分组成嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.1GPIO简介GPIO通过11个32位寄存器进行操作嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.1GPIO简介GPIO通过11个32位寄存器进行操作(续)嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.1GPIO简介输入驱动器包括上拉/下拉电阻和施密特触发器,实现4种输入配置:浮空输入时上拉/下拉电阻断开;上拉/下拉输入时根据PUPDR的设置连接上拉/下拉电阻,这两种输入配置下施密特触发器打开,输入数据经施密特触发器输入到输入数据寄存器或片上设备(复用输入);模拟输入时上拉/下拉电阻断开,施密特触发器关闭,模拟输入到片上设备(如ADC等)。输出驱动器包括输出控制和输出MOS管等,实现4种输出配置:通用输出的数据来自输出数据寄存器,复用输出的数据来自片上设备;推挽输出0时N-MOS管导通,输出1时P-MOS管导通;开漏输出时P-MOS管关闭,输出0时N-MOS管导通,输出1时N-MOS管也关闭,端口处于高阻状态,通过内部或外接上拉电阻输出高电平。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.1GPIO简介输入配置时输出驱动器关闭,输出配置时输入驱动器的上拉/下拉电阻断开,施密特触发器打开,输出数据可经施密特触发器输入到输入数据寄存器。输入数据通过IDR实现。输出数据可以通过ODR实现,也可以通过BSRR和BRR实现位操作,即只对1对应的位设置或清除,而不影响0对应的位,相当于对ODR进行按位“或”操作(设置)和按位“与”操作(清除)。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置输入功能配置GPIOPull-up/Pull-down:

Nopull-upandnopull-down

(不上拉下拉)

Pull-up(上拉)

Pull-down(下拉)嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置输出功能配置GPIOoutputlevel:

Low(低电平)

High(高电平)GPIOmode:

OutputPushPull(推挽输出)

OutputOpenDrain(开漏输出)嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置输出功能配置GPIOPull-up/Pull-down:

Nopull-upandnopull-down

(不上拉下拉)

Pull-up(上拉)

Pull-down(下拉)嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置输出功能配置Maximumoutputspeed:

Low(低速:5MHz)

Medium(中速:25MHz)

High(高速:50MHz)

VeryHigh(超高速:120MHz)嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置GPIO配置完成后生成的相应HAL和LL初始化程序分别在HAL\Core\Src\gpio.c和LL\Core\Src\gpio.c中/*HAL工程*/__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin=GPIO_PIN_0;GPIO_InitStruct.Mode=GPIO_MODE_INPUT;GPIO_InitStruct.Pull=GPIO_NOPULL;HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.2GPIO配置GPIO配置完成后生成的相应HAL和LL初始化程序分别在HAL\Core\Src\gpio.c和LL\Core\Src\gpio.c中/*LL工程*/LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);GPIO_InitStruct.Pin=LL_GPIO_PIN_0;GPIO_InitStruct.Mode=LL_GPIO_MODE_INPUT;GPIO_InitStruct.Pull=LL_GPIO_PULL_NO;LL_GPIO_Init(GPIOB,&GPIO_InitStruct);嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数基本的GPIOHAL库函数在stm32g4xx_hal_gpio.h中声明如下:voidHAL_GPIO_Init(GPIO_TypeDef

*GPIOx,

GPIO_InitTypeDef

*GPIO_Init);GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef

*GPIOx,

uint16_tGPIO_Pin);voidHAL_GPIO_WritePin(GPIO_TypeDef

*GPIOx,uint_16GPIO_Pin,

GPIO_PinStatePinState);voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin)注意:HAL没有读写IDR和ODR的函数,可以使用宏定义或直接读写寄存器嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(1)初始化GPIOvoidHAL_GPIO_Init(GPIO_TypeDef

*GPIOx,

GPIO_InitTypeDef

*GPIO_Init);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★GPIO_Init:GPIO初始化参数结构体指针,初始化参数结构体定义如下:

typedefstruct

{uint32_tPin; /*引脚*/

uint32_tMode; /*模式*/

uint32_tPull; /*上拉/下拉*/

uint32_tSpeed; /*速度*/uint32_tAlternate; /*复用功能*/

}GPIO_InitTypeDef;嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(1)初始化GPIOvoidHAL_GPIO_Init(GPIO_TypeDef

*GPIOx,

GPIO_InitTypeDef

*GPIO_Init);其中Pin和Mode分别在stm32g4xx_hal_gpio.h中定义如下:

#defineGPIO_PIN_0 ((uint16_t)0x0001) /*引脚0*/

……………………

#defineGPIO_PIN_15 ((uint16_t)0x8000) /*引脚15*/

#defineGPIO_PIN_All ((uint16_t)0xFFFF) /*所有引脚*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(1)初始化GPIOvoidHAL_GPIO_Init(GPIO_TypeDef

*GPIOx,

GPIO_InitTypeDef

*GPIO_Init);其中Pin和Mode分别在stm32g4xx_hal_gpio.h中定义如下:#defineGPIO_MODE_INPUT

0x00000000u/*浮空输入*/#defineGPIO_MODE_OUTPUT_PP

0x00000001u/*通用推挽输出*/#defineGPIO_MODE_OUTPUT_OD 0x00000011u/*通用开漏输出*/#defineGPIO_MODE_AF_PP 0x00000002u/*复用推挽输出*/#defineGPIO_MODE_AF_OD 0x00000012u/*复用开漏输出*/#defineGPIO_MODE_ANALOG 0x00000003u

/*模拟输入*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(2)GPIO读引脚GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef

*GPIOx,

uint16_tGPIO_Pin);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★GPIO_Pin:GPIO引脚,取值是GPIO_PIN_0~GPIO_PIN_15返回值:GPIO引脚状态,GPIO引脚状态在stm32g4xx_hal_gpio.h中定义如下:

typedefenum

{GPIO_PIN_RESET=0U,

GPIO_PIN_SET

}GPIO_PinState;注意:对于多个引脚,所有引脚都为低电平时返回GPIO_PIN_RESET(0)。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(3)GPIO写引脚voidHAL_GPIO_WritePin(GPIO_TypeDef

*GPIOx,uint16_tGPIO_Pin,

GPIO_PinStatePinState);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★GPIO_Pin:GPIO引脚,取值是GPIO_PIN_0~GPIO_PIN_15

★PinState:GPIO引脚状态,取值是GPIO_PIN_RESET或GPIO_PIN_SET注意:对于多个引脚,所有引脚的状态相同。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.1GPIOHAL库函数(4)GPIO切换引脚voidHAL_GPIO_TogglePin(GPIO_TypeDef

*GPIOx,uint16_tGPIO_Pin);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★GPIO_Pin:GPIO引脚,取值是GPIO_PIN_0~GPIO_PIN_15嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数基本的GPIOLL库函数在stm32g4xx_ll_gpio.h中声明如下:ErrorStatusLL_GPIO_Init(GPIO_TypeDef

*GPIOx,

LL_GPIO_InitTypeDef

*GPIO_InitStruct);uint32_tLL_GPIO_ReadInputPort(GPIO_TypeDef

*GPIOx);uint32_tLL_GPIO_IsInputPinSet(GPIO_TypeDef

*GPIOx,

uint32_tPinMask);voidLL_GPIO_WriteOutputPort(GPIO_TypeDef

*GPIOx,

uint32_tPortValue);voidLL_GPIO_SetOutputPin(GPIO_TypeDef

*GPIOx,uint32_tPinMask);voidLL_GPIO_ResetOutputPin(GPIO_TypeDef

*GPIOx,uint32_tPinMask);嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(1)初始化GPIOErrorStatusLL_GPIO_Init(GPIO_TypeDef

*GPIOx,

LL_GPIO_InitTypeDef

*GPIO_InitStruct);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★GPIO_InitStruct:GPIO初始化参数结构体指针,初始化参数结构体定义如下:

typedefstruct

{uint32_tPin; /*引脚*/

uint32_tMode; /*模式*/

uint32_tSpeed; /*速度*/

uint32_tOutputType; /*输出类型*/

uint32_tPull; /*上拉/下拉*/

}LL_GPIO_InitTypeDef;嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(1)初始化GPIOErrorStatusLL_GPIO_Init(GPIO_TypeDef

*GPIOx,

LL_GPIO_InitTypeDef

*GPIO_InitStruct);其中Pin、Mode和OutputType分别在stm32g4xx_ll_gpio.h中定义如下:

#defineLL_GPIO_PIN_0

GPIO_BSRR_BS0 /*引脚0*/

……………………

#defineLL_GPIO_PIN_15

GPIO_BSRR_BS15 /*引脚15*/#defineLL_GPIO_OUTPUT_PUSHPULL 0x00000000U /*推挽输出*/#defineLL_GPIO_OUTPUT_OPENDRAIN GPIO_OTYPER_OT0 /*开漏输出*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(1)初始化GPIOErrorStatusLL_GPIO_Init(GPIO_TypeDef

*GPIOx,

LL_GPIO_InitTypeDef

*GPIO_InitStruct);其中Pin、Mode和OutputType分别在stm32g4xx_ll_gpio.h中定义如下:#defineLL_GPIO_MODE_INPUT

(0x00000000U) /*输入模式*/#defineLL_GPIO_MODE_OUTPUT

GPIO_MODER_MODE0_0

/*输出模式*/#defineLL_GPIO_MODE_ALTERNATE

GPIO_MODER_MODE0_1/*复用模式*/#defineLL_GPIO_MODE_ANALOG

GPIO_MODER_MODE0

/*模拟模式*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(1)初始化GPIOErrorStatusLL_GPIO_Init(GPIO_TypeDef

*GPIOx,

LL_GPIO_InitTypeDef

*GPIO_InitStruct);返回值:错误状态,错误状态在stm32g4xx.h中定义如下:

typedefenum

{SUCCESS=0U,

ERROR=!SUCCESS

}ErrorStatus;嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(2)GPIO读输入端口uint32_tLL_GPIO_ReadInputPort(GPIO_TypeDef

*GPIOx);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG返回值:端口值(3)GPIO输入引脚设置uint32_tLL_GPIO_IsInputPinSet(GPIO_TypeDef

*GPIOx,

uint32_tPinMask);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★PinMask:引脚屏蔽,取值是LL_GPIO_PIN_0~15或LL_GPIO_PIN_ALL返回值:引脚状态(0或1)注意:对于多个引脚,所有引脚都为高电平时返回1。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(4)GPIO写输出端口voidLL_GPIO_WriteOutputPort(GPIO_TypeDef

*GPIOx,

uint32_tPortValue);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★PortValue:端口值(5)GPIO设置输出引脚voidLL_GPIO_SetOutputPin(GPIO_TypeDef

*GPIOx,uint32_tPinMask);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★PinMask:引脚屏蔽,取值是LL_GPIO_PIN_0~15或LL_GPIO_PIN_ALL嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.3GPIO库函数3.3.2GPIOLL库函数(6)GPIO复位输出引脚voidLL_GPIO_ResetOutputPin(GPIO_TypeDef

*GPIOx,uint32_tPinMask);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★PinMask:引脚屏蔽,取值是LL_GPIO_PIN_0~15或LL_GPIO_PIN_ALL(7)GPIO切换引脚voidLL_GPIO_TogglePin(GPIO_TypeDef

*GPIOx,uint32_tPinMask);参数说明:

★GPIOx:GPIO名称,取值是GPIOA~GPIOG

★PinMask:引脚屏蔽,取值是LL_GPIO_PIN_0~15或LL_GPIO_PIN_ALL嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例系统包括STM32MCU(内嵌SysTick定时器)、4个按键和8个LED,实现用按键控制LED显示的流水方向,LED流水显示,每秒移位1次,1s定时由SysTick实现。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:473.4GPIO设计实例74HC573的LE端为1时,Q端随D端变化;LE端为0时,Q端不随D端变化(锁存数据)。LED输出时,首先通过PC8~PC15输出数据,然后LE输出1,Q端变化,最后LE输出0,锁存数据。前页

返回嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例PC8~PC15输出0时LED点亮,输出1时LED熄灭(负逻辑)。为了操作方便,LED通过D0~D7控制,并且1时LED点亮,0时LED熄灭(正逻辑),所以输出时将LED取位反并左移8位,通过PC8~PC15输出。嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现包括SysTick、按键和LED程序设计与实现3部分。(1)SysTick程序设计与实现HAL工程的HAL_Init()已将SysTick配置为1ms中断,并在stm32g4xx_it.c的SysTick_Handler()中通过HAL_IncTick()实现uwTick加1。实现1s定时的步骤是:

在main.c中定义如下全局变量:

/*USERCODEBEGINPV*/

uint8_tucSec;/*秒计时*/

/*USERCODEENDPV*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现包括SysTick、按键和LED程序设计与实现3部分。(1)SysTick程序设计与实现②在stm32g4xx_it.c中定义如下变量:/*USERCODEBEGINSysTick_IRQn0*/staticuint16_tusTms;/*毫秒计时*/

externuint8_tucSec;/*秒计时*//*USERCODEENDSysTick_IRQn0*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现包括SysTick、按键和LED程序设计与实现3部分。(1)SysTick程序设计与实现

③在stm32g4xx_it.c的SysTick_Handler()中添加下列代码:/*USERCODEBEGINSysTick_IRQn1*/if(++usTms==1000)

/*1s到*/{usTms=0;ucSec++;/*秒加1*/}/*USERCODEENDSysTick_IRQn1*/嵌入式设计与开发实训指导第3章通用并行接口GPIO前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现(2)按键程序设计与实现按键程序包括按键读取和按键处理两部分,设计与实现步骤是:

①在gpio.h中添加下列函数声明:

/*USERCODEBEGINPrototypes*/

uint8_tKEY_Read(void);/*按键读取*/

/*USERCODEENDPrototypes*/嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现(2)按键程序设计与实现

②在gpio.c中添加下列代码:

uint8_tKEY_Read(void)/*按键读取*/

{

uint8_tucKval=0;

if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)

{ /*B1按键按下(PB0=0)*/

HAL_Delay(10);/*延时10ms消抖*/

if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)

ucKval=1;/*赋值键值1*/

}

returnucKval;/*返回键值*/

}嵌入式设计与开发实训指导第3章通用并行接口GPIO23:09:47前页

返回3.4GPIO设计实例3.4.1HAL库函数软件设计与实现(2)按键程序设计与实现③在main.c中定义如下全局变量:

/*USERCODEBEGINPV*/

uint8_tucSec;/*秒计时*/

uint8_tucKey,ucDir;/*按键值,LED流水方向*/

/*USERCODEENDPV*/④在main.c中添加下列函数声明:

/*USERCODEBEGINPFP*/

voidKEY_Proc(void);/*按键处理

温馨提示

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

评论

0/150

提交评论