STM32学习笔记_STM32F103ZET6

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32F103 系列芯片的系统架构:

系统结构:

在每一次复位以后,所有除SRAM 和FLITF 以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR 来打开该外设的时钟。

GPIO 输入输出,外部中断,定时器,串口。理解了这四个外设,基本就入门了一款MCU。

时钟控制RCC:

-4~16M 的外部高速晶振

-内部8MHz 的高速RC 振荡器

-内部40KHz低速RC 振荡器,看门狗时钟

-内部锁相环(PLL,倍频),一般系统时钟都是外部或者内部高速时钟经过PLL 倍频后得到

- 外部低速32.768K 的晶振,主要做RTC 时钟源

ARM存储器映像:

数据字节以小端格式存放在存储器中。一个字里的最低地址字节被认为是该字的最低有效字节,而最高地址字节是最高有效字节。

存储器映像与寄存器映射:

ARM 存储器映像

4GB

0X0000 00000X1FFF FFFF

0X2000 00000X3FFF FFFF

0X4000 00000X5FFF FFFF

寄存器说明:

寄存器名称

相对外设基地址的偏移值

编号

位表

读写权限

寄存器位

功能说明

使用C语言封装寄存器:

1、总线和外设基地址封装利用地址偏移

(1)定义外设基地址(Block2 首地址)

(2)定义APB2总线基地址(相对外设基地址偏移固定)

(3)定义GPIOX外设基地址(相对APB2总线基地址偏移固定)(4)定义GPIOX寄存器地址(相对GPIOX外设基地址偏移固定)(5)使用 C 语言指针操作寄存器进行读/写

//定义外设基地址

#define PERIPH_BASE ((unsigned int)0x40000000) 1)

//定义APB2 总线基地址

#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) 2)

//定义GPIOC 外设基地址

#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800) 3)

//定义寄存器基地址这里以GPIOC 为例

#define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) 4)

#define GPIOC_CRH *(unsigned int*)(GPIOC_BASE+0x04)

#define GPIOC_IDR *(unsigned int*)(GPIOC_BASE+0x08)

#define GPIOC_ODR *(unsigned int*)(GPIOC_BASE+0x0C)

#define GPIOC_BSRR *(unsigned int*)(GPIOC_BASE+0x10)

#define GPIOC_BRR *(unsigned int*)(GPIOC_BASE+0x14)

#define GPIOC_LCKR *(unsigned int*)(GPIOC_BASE+0x18)

//控制GPIOC 第0 管脚输出一个低电平5)

GPIOC_BSRR = (0x01<<(16+0));

//控制GPIOC 第0 管脚输出一个高电平

GPIOC_BSRR = (0x01<<0);

2、寄存器封装利用结构体、外设基地址和寄存器地址偏移

typedef unsigned int uint32_t; /*无符号32 位变量*/

typedef unsigned short int uint16_t; /*无符号16 位变量*/

/* GPIO 寄存器列表*/

typedef struct

{

uint32_t CRL; /*GPIO 端口配置低寄存器地址偏移: 0x00 */

uint32_t CRH; /*GPIO 端口配置高寄存器地址偏移: 0x04 */

uint32_t IDR; /*GPIO 数据输入寄存器地址偏移: 0x08 */

uint32_t ODR; /*GPIO 数据输出寄存器地址偏移: 0x0C */

uint32_t BSRR; /*GPIO 位设置/清除寄存器地址偏移: 0x10 */

uint32_t BRR; /*GPIO 端口位清除寄存器地址偏移: 0x14 */

uint16_t LCKR; /*GPIO 端口配置锁定寄存器地址偏移: 0x18 */

}GPIO_TypeDef;

只要给结构体设置好首地址,就能把结构体内成员的地址确定下来,然后就能以结构体的形式访问寄存器。

举例:将GPIOC0 输出低电平,具体代码如下:

GPIO_TypeDef * GPIOx; //定义一个GPIO_TypeDef 型结构体指针GPIOx GPIOx = GPIOC_BASE; //把指针地址设置为宏GPIOC_BASE 地址

GPIOx->BSRR =(1<<(16+0)); //通过指针访问并修改GPIOC_BSRR 寄存器

为了操作更简便灵活,直接使用宏定义好GPIO_TypeDef 类型的指针,而且指针指向各个GPIO 端口的首地址,那么即可直接用该宏访问寄存器。具体代码如下:

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)

GPIOC->BSRR = (1<<(16+0));

后面实验程序的编写,都是使用ST 公司提供的固件库,已经把STM32 所有外设封装好,只需要调用即可。

相关文档
最新文档