今日学习进度:
1、构建编译环境;
2、STM32内部的寄存器,存储器映射;
学习笔记:
1、芯片内核和外设之间通过各种总线连接,通过总线矩阵来调度;
I总线(指令总线),指令指的是编译好的程序指令,指令存储在Flash、SRAM1和FSMC中,对应STM32的三种启动方式;
D总线(数据总线),读取常量,放置于Flash、SRAM1里面;
2、存储器映射;
存储器再分配一个地址就叫存储器重映射,重要的是Block0~2,存储器Block2这块区域,设计的是片上外设。例如用指针*操作可以访问到GPIOH的端口输出,GPIO是高速的,挂载到Block2的APHB1(0x4002 0000—0x4007 FFFF)这个地方,也就是都在这个地址下可以访问到GPIO端口
#define GPIOH_ORD (unsigned int*)0x4002 1C14
//#define GPIOH_ORD (unsigned int*)(GPIOH_BASE+0x14)
//上面这个查找数据手册可知偏移地址:0x14
*GPIOH_ORD = 0xFF;
2.1、外设地址映射;
拿其中的Block2来说,总线基地址中的“相对外设基地址偏移”即该总线地址与“片上外设”基地址0x4000 0000的差值。前面也说GPIO挂载在AHB1下,所以GPIOA的起始地址就是0x4002 0000
具体到寄存器,每一个寄存器占32bits,4字节。
比如说GPIOH_ORD(对应GPIOx_ORD中x为H),用于控制port output,总共有32bits:31:16bit是必须位于reset value(0)因为只有16个引脚,15:0可以用于读写(rw)
在对GPIO赋值的时候,不能直接对寄存器赋值,要使用运算符,这样不会影响到寄存器其他位:
(1<<10)示将数字1左移10位,结果是0x0400(二进制:0000 0100 0000 0000);
~(1<<10)
是对0x0400进行按位取反,结果是0xFBFF(二进制:1111 1011 1111 1111);
*GPIOH_ORD &= ~(1<<10)
是对GPIOH_ORD
寄存器进行按位与操作,若原来是0x0401,操作之后位0x0001;
同理,|=进行按位或操作。大概意思就是有个1,必然是1;有个0让他必然是0。
//目的是让PH10输出低电平
#define PERIPH_BASE ((unsigned int)0x40000000) //Block2的基地址
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000) //AHB1的地址,即GPIO基地址
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x00001C00) //GPIOH的基地址
#define GPIOH_ORD (unsignedint*)(GPIOH_BASE + 0x14) //查表相对GPIOx的偏移0x14
//PH10输出低电平
*GPIOH_ORD &= ~(1<<10);
//PH10输出高电平
*GPIOH_ORD |= (1<<10);
遇到的问题:
1、什么是DAP?
DAP(Debug Access Port)是一种用于调试和程序下载的接口
2、由于是老版本写的教程,没有下载AC5(ARMCC)编译器,需要自己手动下载。
3、GPIO运算?
对 GPIOB_ODR|=(1<<10) GPIOB_ODR&=~(1<<10)的理解-CSDN博客
4、结构体指针?
#include <stdio.h>
// 定义一个结构体类型
struct Point {
int x;
int y;
};
int main() {
// 声明一个结构体变量
struct Point p1;
// 通过结构体变量访问成员
p1.x = 10;
p1.y = 20;
// 声明一个结构体指针
struct Point *pPtr;
// 让结构体指针指向结构体变量
pPtr = &p1;
// 通过结构体指针访问和修改成员
pPtr->x = 30;
pPtr->y = 40;
// 打印结构体成员
printf("Point coordinates: (%d, %d)\n", p1.x, p1.y);
return 0;
}
地址 内容
0x1000 x成员的值
0x1004 y成员的值
地址 内容
0x2000 0x1000 (p1的地址)
假设 p1
的内存地址是 0x1000,
在 pPtr = &p1;
之后,pPtr
的值是 0x1000
,即 pPtr
保存了 p1
的地址。通过 pPtr
,我们可以间接访问和修改 p1
的成员。
参考:
Stm32——keil5项目创建步骤_keil创建新项目-CSDN博客
Keil5 添加 Arm Compiler v5.06 Keil添加编译器 - 哔哩哔哩 (bilibili.com)