STM32学习笔记(0)

下面是个人在《STM32库开发实践指南》这本书的学习过程中,从中提炼的要点笔记,以及自己的一些理解,以便后期复习回顾。由于本科阶段个人能力有限,如果以下篇幅中论述有误,欢迎大家提醒小弟。

1. STM32综述

1.1 CMSIS标准

1.1.1 设计原由

STM32是由Cortex-M3内核(CPU)、片上外设、内部总线等组成的单片微型计算机,其芯片结构如下:
在这里插入图片描述
Corten-M3是由ARM公司设计的一款处理器架构,片上外设等部件是由芯片生产商设计的,所以不同的生产商设计的单片机的硬件结构不尽相同(内核都是Cortex-M3),为了解决不同硬件平台的软件编程上的差异,ARM公司建立了CMSIS软件抽象层标准,相当于操作系统的设备无关层软件
在这里插入图片描述

1.1.2 库文件对应

1551150113072

Cortex-M3内核文件:

  • core_cm3.c:提供进入CM3内核的接口

ST库文件:

  • stm32f10x.h:定义了STM32中寄存器的地址映射情况、结构体类型
  • system_stm32f10x.c:用于设置系统时钟、总线时钟
  • 启动文件:一般是用汇编编写的,用于在处理器上电后为程序的运行建立一个合适的环境
  • 外设驱动文件:ST公式为片上外设建立的库函数文件,其中misc.c用于提供NVIC(中断向量控制器)的访问函数。

用户程序文件:

  • stm32f10x_it.c:用于提供编写中断服务函数的入口
  • stm32f10x_conf.h:其中包含了所有ST库的头文件调用

1.2 地址映射

1.2.1 STM32的地址结构

同51一样,Cortex-M3将存储器地址与外设地址一起编址,其地址总线宽度为32bit,有4GB的寻址空间,其地址分配情况如下:

1551151302526

其中0x40000000-0x5FFFFFFF的地址用于指向STM32片上外设,stm32f10x.h记录了这些寄存器的地址情况。

1.2.2 基地址层级关系
#define PERIPH_BASE ((uint32_t)0x40000000)  //外设基址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)  //APB2总线基址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)  //GPIOA外设基址

外设基址 PERIPH: Cortex-M3分配给生产厂商片上外设地址,512MB

总线外设基址 APB1, APB2, AHB: 在STM32中将不同速率的片上外设挂载在不同的总线上,其将PERIPH的地址空间划分为了三部分:

总线地址空间大小
APB14000 0000 H - 4000 FFFF H64KB
APB24001 0000 H - 4001 7FFF H28KB
AHB4001 8000 H - 5FFF FFFF H512MB - 98KB

寄存器组基址: 由于一条总线可以挂载多个外设,所以将总线地址空间又划分为多个寄存器地址空间。

1551159400674

以上为一个寄存器地址空间,每个寄存器地址空间大小为32bit,在STM32中将多个相关的寄存器划分为一个寄存器组,地址偏移0x04是先对与其寄存器组基址(GPIOx_BASH)的。在stm32f10x.h中将寄存器组封装为一个结构体,以便于访问:

typedef struct
{
    _IO uint32_t CRL;
    _IO uint32_t CRH;
    _IO uint32_t IDR;
    _IO uint32_t ODR;
    _IO uint32_t BSRR;
    _IO uint32_t BRR;
    _IO uint32_t LCKR;
} GPIO_TypeDef;

1.3 时钟系统

1.3.1 时钟系统设计准则

STM32的时钟系统比较复杂,需要经过倍频、分频以及一系列外设时钟的开关,其原因如下:

  • 倍频:考虑到电磁兼容性,直接提供频率过高的时钟源可能会给制作电路板带来一定的难度。
  • 分频:因为STM32即有高速外设又有低速外设,各种外设的工作频率不尽相同。

STM32为每个外设的时钟输出都设置了开关,这样可以有效的降低系统功耗。

1.3.2 时钟系统结构功能

STM32的系统时钟 SYSCLK 的来源有四种方式:外部时钟信号直接获取(HSE, LSE)、内部时钟信号直接获取(HSI, LSI)、外部或内部信号锁相环获取(PLLCK),下图的 SW 开关就是用于选择时钟信号的获取方式的。

1551160244599

经过一系列的分频、倍频之后得到几个与我们开发密切相关的时钟:

  • SYSCLK:系统时钟,STM32大部分其中时钟的来源
  • HCLK:由AHB预分频器直接输出,高速总线AHB的时钟信号,CPU主频n
  • FCLK:由AHB预分频器直接输出,与HCLK相互独立,用于处理休眠状态的中断
  • PCLK1:APB1预分频器输出,给APB1总线上的外设提供时钟信号,最大频率为36MHz
  • PCLK2:APB2预分频器输出,给APB2总线上的外设提供时钟信号,最大频率为72MHz

1.4 MDK的简单使用

1.4.1 工程项目结构
  • Startup:
  • USER:存放用户文件及代码
    • main.c
    • stm32f10x_it.c,stm32f10x_it.h
    • stm32f10x_conf.h
  • FWlib:
    • inc/xxx.h
    • src/xxx.c
  • CMSIS:
    • core_cm3.c,core_cm3.h
    • stm32f10x.h
    • system_stm32f10x.c,system_stm32f10x.h
  • Output:
  • Listing:
1.4.2 选项卡设定
  • Output选项卡:指定编译文件存储位置
  • C/C++选项卡:指定CMSIS库文件路径
  • Debug选项卡:配置link调试器
1.4.3 程序下载调试
  • J-Link下载:启动程序时要将J-Link同时连接PC与STM32,或者全部断开
  • 串口下载:下载是要将BOOT0接到VCC,运行时要将BOOT0接到GND

1.5 库函数开发模式

1.5.1 寄存器类别
  • 控制寄存器(xxx_CR): 用于配置外设的工作模式
  • 数据寄存器(xxx_DR): 用于发送或接受数据
  • 状态寄存器(xxx_SR): 用于反馈外设的工作状态
1.5.2 CR的库函数实现

通过初始化配置结构体实现如,配置步骤如下:

  1. 定义一个xxx_InitTypeDef类型初始化结构体;
  2. 根据其CR寄存器的功能向结构体写入特定的控制参数;
  3. 填充完结构体后,利用xxx_Init()函数向寄存器写入参数。
1.5.3 DR的库函数实现
  • 通过Set或Send函数把要输出数据,如:GPIO_SetData()USART_SendData()
  • 通过Read或Receive函数接受外设的数据,如GPIO_ReadOutputDataBit()GPIO_ReadInputDataBit()USART_ReceiveData()
1.5.4 SR的库函数实现

STM32通过事件中断来反应寄存器的变化,并在中断服务函数中处理这事件,由于多个函数可能共享一个中断服务函数,故需要对外设的SR进行检测与清除:

  • SR的检测:xxx_GetFlagStatus()xxx_GetITStatus(),当屏蔽中断使后者无法检测;
  • SR的清除:xxx_ClearFlag()xxx_ClearITPendingBit(),在处理中断时使用后者,处理标志位时使用前者。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值