1. stm32 mcu简介
1.1 stm32 mcu结构
1.2 STM32 MCU存储器映像
1.3 STM32 MCU系统时钟树
1.4 Cortex-M3简介
1.1 stm32 mcu结构
- 由控制单元、从属单元和总线矩阵三大部分组成,控制单元和从属单元通过总线矩阵相连接
- 控制单元包括Cortex-M3内核和两个DMA控制器(DMA1和DMA2)
- 从属单元包括存储器(Flash和SRAM等)和设备(连接片外设备的接口和片内设备)
- 连接片外设备的接口有并行接口和串行接口,并行接口即通用IO接口GPIO,串行接口有 USART、SPI、I2C、USB和CAN等
- 片内设备有定时器TIM、模数转换器ADC和数模转换器DAC等
1.2 STM32 MCU存储器映像
程序存储器、数据存储器和输入输出端口寄存器被组织在同一个4GB的线性地址空间内
地址范围 | 设备名称 |
0XE000 0000 -0XE00F FFFF(1MB) | 内核设备(SYSTick和NVIC等) |
0X4000 0000 -0X5FFF FFFF(512MB) | 片上设备(GPIO、USART、TIM和ADC等) |
0X2000 0000 -0X3FFF FFFF(512MB) | SRAM |
0X0000 0000 -0X1FFF FFFF(512MB) | FLASH |
1.3 STM32 MCU系统时钟树
- 系统时钟树由系统时钟源、系统时钟和设备时钟等部分组成
- 系统时钟源有4个:高速外部时钟HSE、低速外部时钟LSE、高速内部时钟HSI和低速内部时钟LSI
- 外部时钟用OSC实现,内部时钟用RC实现
- 系统时钟SYSCLK可以是HSE或HSI,也可以是HSE或HSI通过锁相环倍频后的锁相环时钟PLLCLK
- SYSCLK经AHB预分频器分频后得到AHB总线时钟HCLK,HCLK经APB1/APB2预分频器分频后得到APB1/APB2总线时钟PCLK1和PCLK2
系统时钟树中的时钟选择、预分频值和外设时钟使能等都可以通过对复位和时钟控制(RCC)寄存器编程实现
偏移地址 | 名称 | 类型 | 复位值 | 说明 |
0X14 | RCC_AHBENR | 读/写 | 0X0000 0014 | AHB设备时钟使能寄存器 |
0X18 | RCC_AHB2ENR | 读/写 | 0X0000 0000 | AHB2设备时钟使能寄存器 |
0X1C | RCC_AHB1ENR | 读/写 | 0X0000 0000 | AHB1设备时钟使能寄存器 |
APB2设备时钟使能寄存器(RCC_APB2ENR)
位 | 名称 | 类型 | 复位值 | 说明 |
0 | AFIOEN | 读/写 | 0 | AFIO时钟使能:0-关闭时钟,1-开启时钟 |
2 | GPIOAEN | 读/写 | 0 | GPIOA时钟使能:0-关闭时钟,1-开启时钟 |
3 | GPIOBEN | 读/写 | 0 | GPIOB时钟使能:0-关闭时钟,1-开启时钟 |
9 | ADC1EN | 读/写 | 0 | ADC1时钟使能:0-关闭时钟,1-开启时钟 |
11 | TIM1EN | 读/写 | 0 | TIM1时钟使能:0-关闭时钟,1-开启时钟 |
12 | SPI1EN | 读/写 | 0 | SPI1时钟使能:0-关闭时钟,1-开启时钟 |
14 | USART1EN | 读/写 | 0 | USART1时钟使能:0-关闭时钟,1-开启时钟 |
1.4 Cortex-M3简介
- Cortex-M3是采用哈佛结构的32位处理器内核,拥有独立的指令总线和数据总线,两者共享同一个4GB存储空间
- Cortex-M3内建一个嵌套向量中断控制器(NVIC:Nested Vectored Interrupt Controller),支持可嵌套中断、向量中断和动态优先级等
- Cortex-M3内部还包含一个系统滴答定时器SysTick
- SYSTick的核心是1个24位递减计数器,使用时根据需要设置初值,启动后在系统时钟的作用下递减,减到0时置技术标志位并重装初值
- 系统可以查询计数标志位,也可以在中断允许时产生SYSTick中断
SYSTick通过4个32位寄存器进行操作
地址 | 名称 | 类型 | 复位值 | 说明 |
0XE000E010 | CTRL | 读/写 | 0 | 控制状态寄存器 |
0XE000E014 | LOAD | 读/写 | - | 重装值寄存器(24位),计数到0时重装到VAL |
0XE000E018 | VAL | 读/写清除 | - | 当前值寄存器(24位),写清除,同时清除计数标志 |
0XE000E01C | CALIB | 读 | - | 校准寄存器 |
控制状态寄存器有3个控制位1个状态位
位 | 名称 | 类型 | 复位值 | 说明 |
0 | ENABLE | 读/写 | 0 | 定时器允许:0-停止定时器,1-启动定时器 |
1 | TICKINT | 读/写 | 0 | 中断允许:0-计数到0时不中断,1-计数到0时中断 |
2 | CLKSOURCE | 读/写 | 0 | 时钟源选择:0-时钟源为HCLK/8,1-时钟源为HCLK |
16 | COUNTFLAG | 读 | 0 | 计数标志:SYSTick计数到0时置1,读取后自动清零 |
- SYSTick等片内设备接口的编程操作方法有2种:
- 直接操作寄存器和使用库函数
- 使用库函数和使用自定义结构操作寄存器本质相同
和使用库函数相比,使用直接操作寄存器进行软件设计有下列优点:
(1)源程序简单,目标程序小。
(2)直接操作寄存器有利于对硬件的理解,比较适合电子、通信和自动化等相关专业的学生学习使用
- 直接操作寄存器的主要缺点是移植性差,而使用库函数移植性较好,比较合适计算机等相关专业的学生学习使用
嵌入式系统的C语言程序设计与一般的C语言程序设计基本相同,主要差别有2点:
(1)嵌入式系统的C语言程序设计主要使用寄存器操作,而寄存器操作和变量操作实质相同,寄存器的名称实质就是变量名称
(2)寄存器操作中控制和状态寄存器的操作通常是位操作包括“位与&”、“位或|”和“位异或^”(注意“位与&”和“位或|”与“逻辑与&&”和“逻辑或||”的区别)使用位操作的主要目的是只对控制和状态寄存器的指定位进行操作,对其他位的值不产生影响