本人工作之余自学,该博客是为了记录学习过程,以及一些心得。内容如有出错,欢迎大家纠正,谢谢。
学习思路
最小硬件系统
1、 在意法半导体官网,下载数据手册、参考手册和电路原理图;
2、 根据原理图分析硬件,先分析最小系统;虽然STM32有内置时钟源,但是习惯上还是看成最小系统的一部分。下载和启动选择电路根据需求设定。
3、编写程序。
单片机内部架构
内核(Cortex-M3)和Debug是由ARM公司设计,其他的都是由半导体芯片厂商根据自身的需求设计,而我们日常的开发主要就是外设的设计。
常见外设
外设通过外设寄存器,才能控制。
存储结构
地址范围从0x0000 0000~0XFFFF FFFF,一共4GB,即32位CPU能访问的地址范围。
其中:0x0800 0000~0x0800 FFFF :存放下载的代码;
0x0200 0000~0x3FFF FFFF :内存—代码运行中产生的临时变量;
0x0400 0000~0x5FFF FFFF :外设寄存器;
0x0E00 0000~0XE00F FFFF :内部外设寄存器地址(中断、系统时钟);
实例一、操作开发板上的用户LED灯
1、 由原理图可知,User LED接在主控芯片引脚PA1串口;
2、 由外设寄存器存储结构图可知端口A(Port A),地址范围是从0x4001 0800~0x4001 0c00,共4个字节大小的地址范围。其中GPIOA有七个寄存器,每个寄存器都是32位。
3、 根据参考手册可知,其中GPIOA有七个寄存器,每个寄存器都是32位,不同寄存器有不同的功能。每个寄存器都有一个偏移地址。
4、 假设选取偏移地址为0x0C,控制引脚端口输出值(高低电平)的寄存器。由参考手册,可知0~15是可以使用的一共16位,每一位对应端口的一个引脚(GPIO 1就是PA1),而16~31位是预留。
5、 通过修改寄存器的值,就能控制单片机对应的外设,从而控制外设所连接的模块。
单片机的开发方法
1、 使用汇编操作寄存器—编写汇编代码操作寄存器
实例一:开发板LED灯,间隔1S闪烁
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
__Vectors DCD 0
DCD Reset_Handler ; Reset Handler
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
; 使能GPIOA
LDR R0, =(0x40021000 + 0x18) ; RCC_APB2ENR
LDR R1, [R0]
ORR R1, R1, #(1<<2)
STR R1, [R0]
;设置GPIOA_1为输出引脚
LDR R0, =(0x40010800 + 0) ; GPIOA_CRL
LDR R1, [R0]
ORR R1, R1, #(1<<4)
STR R1, [R0]
MainLoop
; 设置GPIOA_1为输出高电平
LDR R0,