您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > STM32学习笔记-STM32F103ZET6
STM32F103系列芯片的系统架构:系统结构:在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。GPIO输入输出,外部中断,定时器,串口。理解了这四个外设,基本就入门了一款MCU。时钟控制RCC:-4~16M的外部高速晶振-内部8MHz的高速RC振荡器-内部40KHz低速RC振荡器,看门狗时钟-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL倍频后得到-外部低速32.768K的晶振,主要做RTC时钟源ARM存储器映像:数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。存储器映像与寄存器映射:寄存器1寄存器2....32bit外设1外设2....寄存器地址偏移..APB1总线低速≤36M..APB2总线全速72M..AHB总线..Block7512MB...Block3512MBBlock2512MB片上外设Block1512MBSRAM64KBBlock0512MBFlash512KB程序存储ARM存储器映像4GB0X000000000X1FFFFFFF0X200000000X3FFFFFFF0X400000000X5FFFFFFF存储器地址分配..总线基地址外设基地址寄存器映射指针地址存储单元32bit外设寄存器映射:为特定地址存储单元取别名寄存器映射到特定地址的存储单元上,对外设实现特定功能操作特定地址存储单元的别名寄存器说明:寄存器名称相对外设基地址的偏移值位表编号读写权限寄存器位功能说明使用C语言封装寄存器:1、总线和外设基地址封装利用地址偏移(1)定义外设基地址(Block2首地址)(2)定义APB2总线基地址(相对外设基地址偏移固定)(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用C语言指针操作寄存器进行读/写//定义外设基地址#definePERIPH_BASE((unsignedint)0x40000000)1)//定义APB2总线基地址#defineAPB2PERIPH_BASE(PERIPH_BASE+0x00010000)2)//定义GPIOC外设基地址#defineGPIOC_BASE(AHB1PERIPH_BASE+0x0800)3)//定义寄存器基地址这里以GPIOC为例#defineGPIOC_CRL*(unsignedint*)(GPIOC_BASE+0x00)4)#defineGPIOC_CRH*(unsignedint*)(GPIOC_BASE+0x04)#defineGPIOC_IDR*(unsignedint*)(GPIOC_BASE+0x08)#defineGPIOC_ODR*(unsignedint*)(GPIOC_BASE+0x0C)#defineGPIOC_BSRR*(unsignedint*)(GPIOC_BASE+0x10)#defineGPIOC_BRR*(unsignedint*)(GPIOC_BASE+0x14)#defineGPIOC_LCKR*(unsignedint*)(GPIOC_BASE+0x18)//控制GPIOC第0管脚输出一个低电平5)GPIOC_BSRR=(0x01(16+0));//控制GPIOC第0管脚输出一个高电平GPIOC_BSRR=(0x010);2、寄存器封装利用结构体、外设基地址和寄存器地址偏移typedefunsignedintuint32_t;/*无符号32位变量*/typedefunsignedshortintuint16_t;/*无符号16位变量*//*GPIO寄存器列表*/typedefstruct{uint32_tCRL;/*GPIO端口配置低寄存器地址偏移:0x00*/uint32_tCRH;/*GPIO端口配置高寄存器地址偏移:0x04*/uint32_tIDR;/*GPIO数据输入寄存器地址偏移:0x08*/uint32_tODR;/*GPIO数据输出寄存器地址偏移:0x0C*/uint32_tBSRR;/*GPIO位设置/清除寄存器地址偏移:0x10*/uint32_tBRR;/*GPIO端口位清除寄存器地址偏移:0x14*/uint16_tLCKR;/*GPIO端口配置锁定寄存器地址偏移:0x18*/}GPIO_TypeDef;只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。举例:将GPIOC0输出低电平,具体代码如下:GPIO_TypeDef*GPIOx;//定义一个GPIO_TypeDef型结构体指针GPIOxGPIOx=GPIOC_BASE;//把指针地址设置为宏GPIOC_BASE地址GPIOx-BSRR=(1(16+0));//通过指针访问并修改GPIOC_BSRR寄存器为了操作更简便灵活,直接使用宏定义好GPIO_TypeDef类型的指针,而且指针指向各个GPIO端口的首地址,那么即可直接用该宏访问寄存器。具体代码如下:#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)#defineGPIOD((GPIO_TypeDef*)GPIOD_BASE)#defineGPIOE((GPIO_TypeDef*)GPIOE_BASE)#defineGPIOF((GPIO_TypeDef*)GPIOF_BASE)#defineGPIOG((GPIO_TypeDef*)GPIOG_BASE)GPIOC-BSRR=(1(16+0));后面实验程序的编写,都是使用ST公司提供的固件库,已经把STM32所有外设封装好,只需要调用即可。GPIO:GPIO引脚具有推挽和开漏两种输出模式,配置引脚输出模式使用GPIOx_CRL和GPIOx_CRH寄存器。推挽:输出高电平或低电平,一般选择此模式。开漏:输出低电平或高阻态,若输出高电平,应外加上拉电阻,实现电平匹配;引脚具有线与关系,应用在I2C等总线通讯电路。GPIO工作模式通过GPIO内部的结构关系,决定了GPIO可以配置成以下几种模式。(1)输入模式(模拟、上拉、下拉、浮空)在输入模式时,施密特触发器打开,输出被禁止。可通过输入数据寄存器GPIOx_IDR读取I/O状态。输入模式可以配置为模拟、上拉、下拉以及浮空模式。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。模拟输入则用于ADC采集。(2)输出模式(推挽/开漏)在输出模式中,推挽模式时双MOS管以推挽方式工作,输出数据寄存器GPIOx_ODR可控制I/O输出高低电平。开漏模式时,只有N-MOS管工作,输出数据寄存器可控制I/O输出高阻态或低电平。输出速度可配置,有2MHz\25MHz\50MHz的选项。此处的输出速度即I/O支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。在输出模式时,施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。(3)复用功能(推挽/开漏)复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR无效;输入可用,通过输入数据寄存器可获取I/O实际状态,但一般直接用外设的寄存器来获取该数据信号。(4)模拟输入输出(上下拉无影响)模拟输入输出模式中,双MOS管结构被关闭,施密特触发器停用,上/下拉也被禁止。其它外设通过模拟通道进行输入输出。通过对GPIO寄存器写入不同的参数,就可以改变GPIO的应用模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F1xx参考手册》中对应外设的寄存器说明。在GPIO外设中,通过设置“端口配置寄存器GPIOx_CRL和GPIOx_CRH”可配置GPIO的工作模式和输出速度。CRH控制端口的高八位,CRL控制端口的低八位。STM32固件库:ST公司推出了一套固件库,内部已经将STM32的全部外设寄存器的控制封装好,给用户提供一些API函数,用户只需要学习如何使用这些API函数即可。什么是CMSIS标准?CMSIS标准英文全称是CortexMicroControllerSoftwareInterfaceStandard,翻译为中文意思就是ARMCortex微控制器软件接口标准。库文件之间的关系stm32f10x.h、system_stm32f10x.h和system_stm32f10x.c文件存放在“\STM32最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”目录下,system_stm32f10x.h是片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数。与其对应的源文件是system_stm32f10x.c。这个文件里面有一个非常重要的SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。stm32f10x.h是STM32F10x的头文件,类似于51单片机的reg.51,在开发STM32F10x程序的时候基本上都会调用这个头文件,可见其重要性。此文件内部封装了STM32的总线、内存和外设寄存器等,同时该文件还包含了一些时钟相关的定义和中断相关定义等。stm32f10x_ppp.c文件是STM32外设的驱动源文件,比如stm32f10x_gpio.c文件,里面已经封装好操作GPIO外设底层的内容,提供给我们使用的是一些API函数。stm32f10x_ppp.h就是对应的头文件。还有stm32f10x_rcc.c、misc.c和misc.h文件他们都是存放在“\STM32最新固件库v3.5\Libraries\STM32F10x_StdPeriph_Driver”内。Application.c文件用于存放用户编写的应用程序,文件名可以根据个人爱好命名。我们通常会命名为main.c,表示存放我们的主函数代码。还要将STM32的启动文件添加进来,否则系统不能启动。需根据使用的STM32芯片来选择,因为开发板上使用的是高容量的STM32F1芯片,所以选择startup_stm32f10x_hd.s。启动文件startup_stm32f10x_hd.s存放在“\STM32最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”内。利用库函数模板创建工程,库函数将底层寄存器进一步封装,无需使用底层寄存器操作外设,直接利用库函数实现外设操作,例如GPIO_SetBits(GPIOx,GPIO_Pin_n)//X:ABCDE,n:0~15Block2外设寄存器ARM存储器打包进一步封装不再直接操作寄存器STM32固件库库函数外设寄存器操作外设程序编译结束后,从编译信息可以看出,代码占用FLASH大小为:1228字节(908+320),所用的SRAM大小为:1024个字节(1024+0)。编译结果里面的几个数据的意义:ProgramSize:Code=908RO-data=320RW-data=0ZI-data=1024Code:表示程序所占用FLASH的大小。RO-data:即ReadOnly-data,表示程序定义的常量,存储在FLASH内。RW-data:即ReadWrite-data,表示已被初始化的变量,存储在SRAM内。ZI-data:即ZeroInit-data,表示未被初始化的变量,存储
本文标题:STM32学习笔记-STM32F103ZET6
链接地址:https://www.777doc.com/doc-4776422 .html