学习STM32第一天---了解寄存器

今日学习进度:

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)编译器,需要自己手动下载。

问题描述:Keil5遇到:*** Target ‘xxx‘ uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available._*** target 'target 1' uses arm-compiler 'default c-CSDN博客

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)

Keil MDK5.37以上版本自行添加AC5(ARMCC)编译器的方法_armcc下载-CSDN博客

C语言结构体与结构体指针的使用_c 结构体指针-CSDN博客

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值