版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嵌入式系统设计西安邮电大学计算机学院王忠民2025/11/28本章学习目的熟悉并掌握与STM32微控制器开发相关的特有C语言基础知识,这是读者进行基于寄存器或固件库开发的基础了解基于意法半导体公司的STM32微控制器开发的四种模式:寄存器开发模式、标准库开发模式、基于STM32Cube平台的HAL库和LL库开发模式各自的特点,重点理解寄存器开发和库函数开发实现的机理,了解STM32Cube平台的特点。理解ARMCortex微控制器软件接口标准CMSIS(CortexMicrocontrollerSoftwareInterfaceStandard)提出的目的和基本组成,掌握寄存器开发的基本原理和开发步骤理解基于标准外设库开发的基本原理,熟练掌握标准外设库工程的构建方法。第6章基于STM32F103微控制器的嵌入式系统开发基础---学习目的2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础(1) 6.1微控制器开发语言基础 6.2STM32F103嵌入式系统开发模式 6.2.1寄存器开发模式 6.2.2标准外设库开发模式 6.2.3基于STM32Cube平台的HAL库和LL库开发模式 6.2.3HAL库开发模式 6.2.4LL库开发模式第6章基于STM32F103微控制器的嵌入式系统开发基础(2)6.2ARMCortex微控制器软件接口标准CMSIS 6.2.1CMSIS软件接口标准 6.2.2STM32F1xx微控制器的软件包CMSIS下载与安装 6.3基于寄存器的工程构建 6.4基于标准外设库的工程构建 6.5Proteus嵌入式系统仿真与调试
2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---学习内容目录第6章基于STM32F103微控制器的嵌入式系统开发基础(1) 6.1微控制器开发语言基础 6.2STM32F103嵌入式系统开发模式 6.2.1寄存器开发模式 6.2.2标准外设库开发模式 6.2.3基于STM32Cube平台的HAL库和LL库开发模式
(1)HAL库开发模式
(2)LL库开发模式第6章基于STM32F103微控制器的嵌入式系统开发基础---目录2025/11/28在STM32F103开发中,意法半导体(STMicroelectronics)提供了一系列的库和工具来简化开发过程。STM32的标准外设库(StandardPeripheralLibraries,通常称为STM32F1xxStdPeriph_Driver)以及后来的HAL(硬件抽象层)库为开发者提供了一组函数、数据类型(结构体、枚举等)和宏定义,这些都可以被视为“针对微控制器的C变量等”。以下是一些STM32F103开发中常用的内容:数据类型定义:STM32库通常重定义了一些数据类型。如将C99标准中的stdint.h头文件中的uint8_t、uint16_t、uint32_t等进行了重定义。/*在stm32f10x.h或类似文件中*/
typedef unsignedchar uint8_t;typedef unsignedshort uint16_t;结构体(Structs):STM32库使用结构体来封装外设的配置参数和状态信息。例如,GPIO_InitTypeDef结构体用于配置GPIO端口的模式、输出类型、速度和上拉/下拉设置。同样地,USART_InitTypeDef结构体用于配置USART的参数,如波特率、数据位、停止位和校验位等。宏定义(Macros):STM32库包含大量的宏定义,用于访问外设的寄存器地址、设置位掩码等。这些宏定义通常定义在相应的头文件中,如stm32f10x.h、stm32f10x_gpio.h等。函数(Functions):STM32库提供了丰富的函数,用于初始化外设、读取/写入寄存器、控制GPIO端口、进行串行通信等。这些函数通常封装在相应的源文件中,如stm32f10x_gpio.c、stm32f10x_usart.c等。第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础2025/11/28在STM32F1xx系列微控制器使用C语言进行开发时,需要特别掌握和了解一些与嵌入式系统开发相关的C语言知识,以便更有效地与硬件进行交互。本节给出后续在基于STM32F1系列微控制器的寄存器开发、标准外设库开发过程中涉及到的一些关键的C语言特性和用法,以方便大家更容易读懂理解给出的例子代码。更详细的有关C语言的知识,请查阅相关资料。第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础1.基础数据类型int:通常用于表示整数,但具体的位数和范围可能因编译器和平台而异。unsignedint:无符号整数,与int具有相同的位数,但只能表示非负值。char:字符类型,通常用于存储ASCII字符。在某些情况下,它也可以被用作较小的整数类型(如signedchar或unsignedchar)。float和double:用于表示浮点数。2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础2.固定宽度数据类型(来自stdint.h)int8_t、uint8_t:8位有符号和无符号整数。int16_t、uint16_t:16位有符号和无符号整数。int32_t、uint32_t:32位有符号和无符号整数。int64_t、uint64_t:64位有符号和无符号整数。这些类型确保了在不同平台和编译器上的宽度一致性。2025/11/283.指针数据类型在STM32F1xx微控制器编程中,指针类型与通用的C或C++编程语言中的指针类型相同。这是因为STM32F1xx微控制器通常使用C或C++作为编程语言。下面是一些常见的指针类型及其在STM32F1xx编程中的使用示例:第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础(1)基本数据类型指针int*:指向整数的指针intvalue=10;int*ptr=&value;//ptr指向value的地址uint32_t*(如果使用了stdint.h):指向32位无符号整数的指针,常用于表示地址或配置寄存器等uint32_t register_value;uint32_t*reg_ptr=(uint32_t*)0x40021018;//假设这是某个寄存器的地址*reg_ptr=0x12345678;//将值写入寄存器2025/11/283.指针数据类型在STM32F1xx微控制器编程中,指针类型与通用的C或C++编程语言中的指针类型相同。这是因为STM32F1xx微控制器通常使用C或C++作为编程语言。下面是一些常见的指针类型及其在STM32F1xx编程中的使用示例:第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础(2)结构体指针
structMyStruct*:指向自定义结构体类型的指针。在STM32F1xx编程中,结构体经常用于表示硬件配置、消息、数据记录等。
typedefstruct{uint32_tfield1;uint16_tfield2;}MyStruct;MyStructmyInstance;MyStruct*ptr=&myInstance;2025/11/283.指针数据类型在STM32F1xx微控制器编程中,指针类型与通用的C或C++编程语言中的指针类型相同。这是因为STM32F1xx微控制器通常使用C或C++作为编程语言。下面是一些常见的指针类型及其在STM32F1xx编程中的使用示例:第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础指向数据首元素的指针,可以通过递增指针来遍历数组。intarry[]={1,2,3,4,5};int*array_ptr=arry;intvalue=*(arry_ptr+2);//value的值为32025/11/284.宏定义宏定义在STM32的寄存器定义中广泛使用,因为它们允许为复杂的寄存器地址或位定义简单的名字。例如:
第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础2025/11/284.宏定义宏定义在STM32的寄存器定义中广泛使用,因为它们允许为复杂的寄存器地址或位定义简单的名字。例如:
第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础(1)#defineGPIOA_BASE (0x40010800UL)
定义了一个名为GPIOA_BASE的基地址。它通常是一个指向GPIO端口A所有寄存器起始位置的指针或地址值。0x40010800UL是一个32位的无符号长整型(UL代表unsignedlong),表示该基地址的十六进制值。(2)#defineGPIOA_ODR_OFFSET 0x14
定义了一个名为GPIOA_ODR_OFFSET的偏移量。它表示从GPIOA_BASE基地址开始,到ODR(OutputDataRegister,输出数据寄存器)的字节偏移量。在这个例子中,偏移量是0x14(即20个字节),这是因为寄存器在内存中通常是连续排列的,但每个寄存器都有其特定的偏移量。(3)#defineGPIOA_ODR (*(uint32_t*)(GPIOA_BASE+GPIOA_ODR_OFFSET))
这个宏定义是最复杂的。它定义了一个名为GPIOA_ODR的宏。其中“(GPIOA_BASE+GPIOA_ODR_OFFSET)”将基地址和偏移量相加,得到ODR寄存器的完整地址。“(uint32_t*)”将上一步得到的地址强制转换为指向32位无符号整型(uint32_t)的指针,这是因为寄存器通常是一个固定宽度的内存区域,而ODR寄存器在这里被假定为32位宽。“*”获取该地址处的值。这样就可以通过读取或写入GPIOA_ODR宏来直接操作ODR寄存器。
综上所述,这三条宏定义提供了一种方便的方法来访问和操作GPIO端口A的ODR寄存器,而无需每次都手动计算地址或进行类型转换。在代码中就可以像操作普通变量一样使用GPIOA_ODR,而实际上是在直接操作硬件寄存器。GPIOA_ODR=0x00000001--------什么作用???2025/11/285.结构体结构体用于定义一个数据集合,这些数据可能是不同类型但相互关联的。在STM32开发中,它们通常用于表示寄存器的位域。例如:第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础
typedefstruct { uint32_tMODER:2;//端口模式位
uint32_tOTYPER:2;//端口输出类型位
uint32_tOSPEEDR:2;//端口输出速度位
uint32_tPUPDR:2;//端口上/下拉电阻位
uint32_tIDR:16;//端口输入数据寄存器位(只读)
uint32_tODR:16;//端口输出数据寄存器位
//...其他位... }GPIO_TypeDef;
#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)
在这个例子中,GPIO_TypeDef结构体定义了GPIO端口的寄存器布局,并使用宏GPIOA将GPIOA基地址强制转换为该结构体指针类型。2025/11/287.位操作:
在STM32开发中,经常需要对寄存器的特定位进行位操作。可以通过使用按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)等位操作符来实现。第6章基于STM32F103微控制器的嵌入式系统开发基础---微控制器开发语言基础8.内存访问控制:
了解volatile关键字在嵌入式编程中的重要性。volatile告诉编译器不要对该变量的访问进行优化,因为它可能在程序不知道的情况下被外部因素(如硬件)修改。目录第6章基于STM32F103微控制器的嵌入式系统开发基础(1) 6.1微控制器开发语言基础 6.2STM32F103嵌入式系统开发模式 6.2.1寄存器开发模式 6.2.2标准外设库开发模式 6.2.3基于STM32Cube平台的HAL库和LL库开发模式 6.2.3HAL库开发模式 6.2.4LL库开发模式第6章基于STM32F103微控制器的嵌入式系统开发基础---目录2025/11/28实现D1灯闪烁的实质是:1、D1灯与PA0引脚相连2、PA0引脚的状态决定灯的亮灭,为1灭,0亮3、只需要将微控制器中GPIOA的相关寄存器(ODR)的第0位置1或清零第6章基于STM32F103微控制器的嵌入式系统开发基础---示例2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F1xx片内IO编程的实现思路往地址0x4001080C-0x4001080F四个单元对应的寄存器(GPIOA_ODR)送最低位为0或1的字使用不同的送法,就对应不同的开发方式2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---STM32F103嵌入式系统开发模式STM32F103嵌入式系统开发模式 寄存器开发模式 标准外设库开发模式 基于STM32Cube平台的HAL库和LL库开发模式:
HAL库开发模式 LL库开发模式 2025/11/28寄存器开发模式寄存器开发模式的实质就是直接对寄存器对应的存储器单元进行操作,而不需要借助芯片厂商提供的任何库函数。根据获取寄存器对应存储单元地址以及使用的开发语言的不同,又可分为以下4种情况:汇编访问寄存器汇编访问位带别名区C地址指针访问寄存器C结构体成员访问寄存器
第6章基于STM32F103微控制器的嵌入式系统开发基础---寄存器开发模式2025/11/282.汇编访问位带别名区位带操作是将位带区的一位(1bit)映射到位带别名区的一个由四个存储单元组成的32位字单元,通过给该字单元送0或1,实现将位带区对应位清0或置1,从而实现了寄存器位设置的原子操作,提高了并发环境下嵌入式系统运行的可靠性。有关位带操作的详细介绍见“2.4.2位带操作”。本例中GPIOA_ODR寄存器的地址(GPIOA_ODR_address)为0x4001080C,其d0位映射到位带别名区的地址为:GPIOA_ODR_d0_alias=0x42000000+((GPIOA_ODR_address-0x40000000)*8+0)*4=0x42210180通过给位带别名区0x42210180字单元送0或1,即可实现对GPIOA_ODR寄存器的d0位清0或置1,从而实现连接在PA0上的D1灯的闪烁。具体代码如下:第6章基于STM32F103微控制器的嵌入式系统开发基础---寄存器开发模式(汇编访问位带别名区)
AREAADDCODE,CODE,READONLY ENTRYmycode MOV R2,#0x00000000 MOV R3,#0x00000001next LDR R0,=0x42210180;d0对应的位带别名区地址为0x42210180 STR R2,[R0];将R2值送位带别名区 EOR R2,R3;R2与R3异或,使R2的d0位取反 BL delay;调用延时过程 B next;循环点亮D1灯
2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---寄存器开发模式(C地址指针访问寄存器)#define RCC_APB2ENR *(volatileunsignedlong*)0x40021018#define GPIOA_CRL *(volatileunsignedlong*)0x40010800//定义GPIOA_ODR寄存器的地址指针#define GPIOA_ODR *(volatileunsignedlong*)0x4001080CvoidDelay(intnCount);intmain(void){ RCC_APB2ENR=1<<2;//APB2上的外设时钟使能 GPIOA_CRL=(2<<0)|(0<<2);//设置GPIOA引脚0的工作方式 while(1){
GPIOA_ODR=0<<0;//GPIOA_ODR寄存器d0位清零,D1灯亮 Delay(0x0FFFFF);//调用延时函数
GPIOA_ODR=1<<0;//GPIOA_ODR寄存器d0位置1,D1灯熄灭 Delay(0x0FFFFF);//调用延时函数 }}voidDelay(intnCount){for(;nCount!=0;nCount--);}3.C地址指针访问寄存器如何宏定义某个寄存器的地址指针?右边程序中涉及到三个寄存器地址RCC_APB2ENR(APB2外设时钟使能寄存器,地址为0x40021018)GPIOA_CRL(GPIOA端口配置低寄存器,地址为0x40010800)GPIOA_ODR(GPIOA端口输出数据寄存器,地址为0x40010800)
2025/11/28第6章基于STM32F103微控制器的嵌入式系统开发基础---寄存器开发模式(C地址指针访问寄存器)#defineGPIOA((GPIO_TypeDef*)0x40010800)#defineRCC_APB2ENR*(volatileunsignedlong*)0x40021018#defineGPIOA_CRL*(volatileunsignedlong*)0x40010800voidDelay(intnCount);intmain(void){ RCC_APB2ENR=1<<2; GPIOA_CRL=(2<<0)|(0<<2); while(1){
GPIOA->ODR=0<<0; //GPIOA_ODR寄存器d0位清零,D1灯亮 Delay(0x0FFFFF);//调用延时函数
GPIOA->ODR=1<<0 //GPIOA_ODR寄存器d0位置1,D1灯熄灭 Delay(0x0FFFFF);//调用延时函数 }}voidDelay(intnCount){for(;nCount!=0;nCount--);}3.C结构体成员访问寄存器为GPIO片上外设定义了一个GPIO_TypeDef结构体类型typedefstruct{ intCRL; intCRH; intIDR; intODR; intBSRR; intBRR; intLCKR;}GPIO_TypeDef#defineGPIOA((GPIO_TypeDef*)0x40010800)定义一个名为GPIOA的宏,该宏的值是一个指向GPIO_TypeDef类型的结构体指针,该指针指向地址0x40010800。通过该指针就可以访问结构体成员,对GPIO的相关寄存器进行操作了
注意:这里我们自己为GPIO定义了一个结构体变量,事实上,在意法半导体公司提供的标准库中,stm32f10x.h头文件为所有的片上外设都定义了专门的结构体类型,建议读者阅读该头文件,了解相关结构体的定义,分析这些结构体在标准库中是如何被使用的。2025/11/282.标准外设库开发模式直接操作寄存器的方式的好处:直接操作寄存器通常可以获得更高的性能,因为没有函数调用的开销;直接访问寄存器提供了对硬件的完全控制,可以执行底层硬件操作,实现更精细的定时和同步;由于没有额外的库函数调用,代码大小可能会更小;由于是通过对底层硬件的访问来实现相关的操作,更利于读者掌握嵌入式开发的底层逻辑。然而,由于目前嵌入式微控制器的片上外设越来越多,涉及到外设的寄存器也越来越来越多,所以基于寄存器的开发缺点也是显然易见的。---ST公司就先后推出了标准外设库(StandardPeripheralLibrary,SPL),硬件抽象层库(HardwareAbstractionLayer,HAL)和底层库(Low-Level,LL),以方便开发人员使用。第6章基于STM32F103微控制器的嵌入式系统开发基础---标准外设库开发模式2025/11/282.标准外设库开发模式STM32标准外设库是一个固件函数包,由程序、数据结构和宏组成,为开发者访问底层硬件提供了中间API。通过使用标准外设库,开发者无须深入掌握底层硬件细节,就可以轻松地应用每个外设。因此,使用标准外设库可以大大减少用户编写程序的时间,进而降低开发成本。
标准外设库的架构遵循CMSIS标准(CortexMicro-controllerSoftwareInterfaceStandard,Cortex微控制器软件接口标准)。由于ARM公司产品是由众多合作公司形成的生态半导体产业链,在这条产业链上,ARM公司只负责芯片内核的架构设计,而半导体厂商则根据ARM公司提供的内核标准设计各自的芯片,所以任何一个基于Corex生产的芯片其内核结构都是一样的,区别在于存储器容量、片上外设、I/O以及其他模块的设计。为了解决不同芯片厂商生产的基于Cortex核的微处理器在软件上的兼容问题,ARM公司与众多芯片和软件厂商共同制定了CMSIS标准,旨在将所有Cortex内核产品的软件接口标准化。
意法半导体推出的标准外设库、HAL库和LL库当然都是遵循这个标准的!第6章基于STM32F103微控制器的嵌入式系统开发基础---标准外设库开发模式2025/11/28标准外设库开发步骤在MDK5集成开发环境中,使用STM32F10x标准外设库,开发基于STM32F103R6微控制器驱动LED灯D1(接在GPIOA的PA0引脚)工程的主要步骤:1.启动MDK5:打开KeiluVision5集成开发环境。2.新建工程:点击菜单栏上的“Project”->“NewμVisionProject...”,然后给工程命名并选择一个保存位置(事先要创建一个用来存放该工程的工程文件夹)。3.选择MCU型号:在弹出的对话框中,选择“STMicroelectronics”->“STM32F1Series”->“STM32F103R6”或类似的MCU型号。4.添加标准外设库:将STM32F10x标准外设库的路径添加到工程设置中。这通常包括stm32f10x.h头文件和相应的库文件(.c和.h)。(1)在工程文件夹中创建一个文件夹来存放标准外设库文件(例如Libraries)。(2)将标准外设库文件复制到该文件夹中。(3)在MDK5中,右键点击工程名(缺省为Target1)->“AddGroup...”,在新出现的分组“NewGroup”点右键,点击“ManageProjectItems…”,在出现的对话框中命名该组(例如“STM32F10x_StdPeriph_Driver”),然后将库文件添加到该组中。5.配置工程设置:在Project菜单中选择“OptionsforTarget...”来配置工程设置。6.编写代码:在main.c文件中编写代码来初始化GPIOA并控制PA0引脚。7.编译和下载:保存工程,然后点击工具栏上的编译按钮(或使用快捷键F7)来编译工程。如果编译成功,就可以将生成的二进制文件下载到STM32F103R6微控制器开发板,第6章基于STM32F103微控制器的嵌入式系统开发基础---标准外设库开发模式2025/11/28标准外设库开发示例main()函数中首先调用GPIO_Config()函数,对GPIOA时钟进行使能,并通过调用GPIO_Init()函数对PA0引脚进行配置。在while循环中切换PA0的状态来控制LED灯D1的亮灭。#include"stm32f10x.h"voidGPIO_Config(void){ GPIO_InitTypeDefGPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择PA0引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置输出速度为50MHz GPIO_Init(GPIOA,&GPIO_InitStructure);//根据设定的参数初始化GPIOA的PA0引脚}intmain(void){ GPIO_Config();//初始化GPIOA while(1) {
GPIO_ResetBits(GPIOA,GPIO_Pin_0);//将PA0设置为低电平,LED灯亮 for(uint32_ti=0;i<10000
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年初级会计职称考试多选题模拟题练习题及答案
- 《关爱成长法治护航》读后感
- 2026年高考北京卷政治历年真题及答案
- 2026年保密教育线上培训考试真题试卷+解析及答案
- 2026年安徽省黄山市重点学校初一入学数学分班考试试题及答案
- 第二单元 理解权利义务 大单元教学设计-2025-2026学年统编版道德与法治八年级下册
- 第六单元名著导读《钢铁是怎样炼成的》教学设计-2023-2024学年统编版语文八年级下册
- 初中科学浙教版八年级下册第2章 微粒的模型与符号第4节 组成物质的元素教案设计
- 精液品质检查教学设计中职专业课-畜禽繁殖与改良-畜牧类-农林牧渔大类
- 第21课《古代诗歌五首》教学设计-2025-2026学年统编版语文七年级下册
- 2026年中国超高丁腈氢化丁腈橡胶市场数据研究及竞争策略分析报告
- 2026河南豫能控股股份有限公司及所管企业招聘31人备考题库及参考答案详解(精练)
- 内镜黏膜下剥离术(ESD)诊疗与护理规范
- 2026四川宜宾传媒集团有限公司及下属子公司第一批员工招聘13人笔试备考题库及答案解析
- 2026北京事业编考试题库
- 2025年陕西国防工业职业技术学院单招职业技能考试试题及答案解析
- GB 15322.1-2026可燃气体探测器第1部分:工业及商业用途点型可燃气体探测器
- 2025年扬州市职业大学单招职业技能考试题库附答案解析
- 2026年光储充一体化充电站项目可行性研究报告
- 新版部编人教版七年级下册道德与法治全册教案(完整版)教学设计含教学反思
- 中药饮片GSP培训课件
评论
0/150
提交评论