一、STM32F103系列芯片的地址映射和寄存器映射原理

1.寄存器

  • 寄存器是中央处理器内的组成部分。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
  • 简单来说,寄存器就是存放东西的一个空间器物。寄存器可能存放的是指令、数据或地址。
  • 按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。
  • 存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
  • 指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。

2.地址映射和寄存器映射原理

  • 地址映射:由百度词条可知为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。
  • 寄存器映射:在存储器的区域单元中,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

二、GPIO端口初始化

1.时钟配置

本次实验采用GPIOA、B、C三个端口。该三个端口都属于APB2总线

  1. 找到时钟使能寄存器映射基地址
  2. 找到端口偏移地址以及对应端口所在位置
  3. 使能对应端口时钟
    大致代码如下:
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR     *((unsigned volatile int*)0x40021018)RCC_APB2ENR|=1<<2|1<<3|1<<4;          //APB2-GPIOA、GPIOB、GPIOC外设时钟使能

2.输入输出模式和输出速率设置

本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A4、B5、C14三个引脚。其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。

  1. 找到GPIOx端口基地址
  2. 配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL       *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL       *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH       *((unsigned volatile int*)0x40011004)
  1. 设置输出模式为推挽输出,输出速度为2Mhz
    GPIOA_CRL&=0xFFF0FFFF;     //设置位 清零GPIOA_CRL|=0x00020000;      //PA4推挽输出,把第19、18、17、16位变为0010GPIOB_CRL&=0xFF0FFFFF;     //设置位 清零GPIOB_CRL|=0x00200000;      //PB5推挽输出,把第23、22、21、20变为0010GPIOC_CRH&=0xFF0FFFFF;      //设置位 清零GPIOC_CRH|=0x00200000;      //PC14推挽输出,把第23、22、21、20变为0010

三、代码实现

1.流水灯原理

本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。
初始状态为0 0 0,
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一,一直循环达到流水灯效果。

2.C语言代码

#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR     *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL       *((unsigned volatile int*)0x40010800)
#define   GPIOA_ODR     *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL       *((unsigned volatile int*)0x40010C00)
#define   GPIOB_ODR     *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH       *((unsigned volatile int*)0x40011004)
#define   GPIOC_ODR     *((unsigned volatile int*)0x4001100C)//延时函数void Delay(){u32 i=0;for(;i<5000000;i++);}int main(void){   RCC_APB2ENR|=1<<2|1<<3|1<<4;           //APB2-GPIOA、GPIOB、GPIOC外设时钟使能GPIOA_CRL&=0xFFF0FFFF;      //设置位 清零GPIOA_CRL|=0x00020000;      //PB5推挽输出GPIOA_ODR&=~(1<<5);          //设置初始灯为灭GPIOB_CRL&=0xFF0FFFFF;     //设置位 清零GPIOB_CRL|=0x00200000;      //PB5推挽输出GPIOB_ODR&=~(1<<9);          //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF;     //设置位 清零GPIOC_CRH|=0x02000000;      //PB5推挽输出GPIOC_ODR&=~(1<<14);         //设置初始灯为灭while(1){//A灯GPIOA_ODR|=1<<5;      //PB5高电平Delay();GPIOA_ODR&=~(1<<5);      //PB5低电平,因为是置0,所以用按位与//B灯GPIOB_ODR|=1<<9;     //PB5高电平Delay();GPIOB_ODR&=~(1<<9);      //PB5低电平,因为是置0,所以用按位与//C灯GPIOC_ODR|=1<<14;        //PB5高电平Delay();GPIOC_ODR&=~(1<<14);     //PB5低电平,因为是置0,所以用按位与}
}

3.效果展示

三、STM32CubeMX生成代码使用HAL库点亮流水灯

1.安装STM32CubeMX

在官网直接下载(需要邮箱注册)
安装过程比较简单就不在此过多赘述

2.安装HAL库

STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。
和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。
并且从16年开始,ST公司就逐渐停止了对标准固件库的更新,转而倾向于HAL固件库和 Low-layer底层库的更新,停止标准库更新,也就表示了以后使用STM32CubeMX配置HAL/LL库是主流配置环境;

1.打开安装好的STMCubeMX并点击HELP->Manage embedded software packages :


2.在弹出的界面中找到你需要HAL库,点击install now,到安装成功

3.回到桌面创建新项目

4.在part name里选择自己的芯片然后点击start project

3.点击system core,进入SYS,在debug下选择serial wire:
4.接下来观察时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上:
5.将hse那里设为Crystal/Ceramic Resonator:

6.接下来就是点击相应的引脚设置输出寄存器了,就是output那一项,一共选了三个,是PA5,PB9,PC14:

7.点击project manager,配置好自己的路径和项目名,然后IDE那项改为MDK-ARM:

8.进入 code generate界面,选择生成初始化.c/.h文件,后面点击generate code,选择open project,然后就到KEIL5了:

弹出界面直接选择opean project,会直接弹出项目文件
找到项目main将如下代码替换掉主函数中的代码:

SystemClock_Config();//系统时钟初始化MX_GPIO_Init();//gpio初始化while (1){      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯HAL_Delay(1000);//ÑÓʱ1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯HAL_Delay(1000);//ÑÓʱ1sHAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯HAL_Delay(1000);//延时1s}

3.电路连接

根据设计的程序连接电路:
对于USB转TTL模块和stm32f103c8t6连接:
GND — GND
3v3 — 3v3
TXD — A10
RXD — A9

总电路:
绿——B9
黄——C14
红——A5

4.烧录运行

5.观察GPIO端口的输出波形

1.Target界面中,选择跟正确的晶振大小

2.degug页面设置


3.进入degug界面选择逻辑分析仪

4.选择要观察的引脚
(1)点击Setup Logic Analyzer,添加要观察的引脚

(2)将grid设置为1s并勾选相关信息

(3)运行程序并观察波形

四、总结

通过这次实验学习,充分了解了keil的使用方法和steam32的相关知识,并了解了流水灯的实验

Steam32寄存器实现流水灯相关推荐

  1. ​用寄存器HAL库完成LED流水灯程序

    STM32的地址映射.寄存器映射原理以及GPIO端口的初始化设置三步骤 ​(一)STM32F103系列芯片的地址映射及寄存器映射原理 1.STM32F103C8T6简要介绍 ● STM32F103C8 ...

  2. STM32实现LED流水灯

    文章目录 一.实验原理 1.STM32F103C8T6简介 2.地址映射 3.寄存器映射 4.GPIO端口初始化设置 1.时钟配置 2.输入输出模式和输出速率设置 二.C语言实现LED流水灯 1.流水 ...

  3. 基于汇编和C语言STM32流水灯依次闪烁

    目录 一.初始化 1.地址映射和寄存器映射 1.1 总线基地址 1.2 外设基地址 1.3 外设寄存器地址 1.4接线 1.4.1 将串口USB转TTL线与stm32核心板连接如图所示 1.4.2 并 ...

  4. 流水灯闪烁(c语言)

    目录 一.实验初始化 地址映射和寄存器映射 1. 总线基地址 2. 外设基地址 3. 外设寄存器地址 4.接线 5.程序下载 二.用C语言寄存器实现流水灯 1.main.c 2.加入设备 3.编译生成 ...

  5. STM32Cubemx的安装及用寄存器HAL库完成LED流水灯程序

    目录 一.STM32CubeMx安装 (一)简介 (二)下载地址 1.官方下载地址 2.网盘下载地址 二.STM32CubeMX安装过程 三.HAL库安装 四.HAL库实现LED流水灯 (一)新建项目 ...

  6. STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解

    文章目录 一.寄存器原理 1.什么是寄存器 2.如何访问寄存器 二.GPIO端口的初始化设置 1.时钟配置 (1)找到时钟使能寄存器映射基地址 (2)找到端口偏移地址以及对应端口所在位置 (3)使能对 ...

  7. 【嵌入式04】用寄存器HAL库完成LED流水灯程序

    目录 一.原理学习 1.寄存器映射原理 2.GPIO端口的初始化设置步骤 二.LED流水灯 1.程序设计思路 2.寄存器方式编程实现 3.HAL库编程实现 4.软件仿真 三.总结 四.参考链接 一.原 ...

  8. STM32F103寄存器方式点亮LED流水灯

    实验要求:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB.GPIOC.GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒.1)写出 ...

  9. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

最新文章

  1. 人生苦短,我要换Go!
  2. 充电电池和充电时间说明
  3. 暨南大学计算机专业录取分数线2019,暨南大学2019年在广东省各专业录取分数线...
  4. 转载:(C/C++函数返回多个值)
  5. 【BJDCTF 2nd—MISC/Crypto】做题+复现记录
  6. canoco5冗余分析步骤_Python怎么学习才能效果最好?网友:学习步骤在这了
  7. SAP Spartacus里的concurrently依赖
  8. oracle32位客户端安装教程,Win7系统32位Oracle11g客户端安装详述
  9. mac 开启android 模拟器,折腾mac的经验积累 2:mac上如何玩安卓模拟器
  10. 音乐和计算机跨界融合,音乐类综艺跨界融合有了新思路
  11. 卸载WPS后Office文档图标显示异常
  12. GLASS 产品使用(一)
  13. 当前系统缺少NTFS格式转换器(convert.exe)
  14. Functional Programming
  15. 阿里云oss中解决IE浏览器下载中文文件时乱码问题
  16. 电影沙龙之《黑镜-白熊公园》
  17. 深切悼念JAVA培训界第一人张孝祥老师意外辞世
  18. 门禁|梯控管理系统CPU卡读写器发卡器HX-WR03密码设置操作说明
  19. 听易中天品三国---看“草包”老板之“败家品德”
  20. 砌砖机器人公司获200万美元投资,这年头连搬砖工也要失业!

热门文章

  1. xp计算机找不到音量调节,WinXP电脑没声音且小喇叭不见了如何解决?
  2. Linux虚拟地址和物理地址的映射
  3. 开发一款棋牌游戏的成本有多大?
  4. 品牌机Windows10重置功能WinRE失效处理方法
  5. BIM技术在家装中有5大应用,您知道吗?
  6. 数学基础task04 一元函数微分学的几何应用
  7. 如何断开mongodb数据库连接_如何创建mongodb数据库连接
  8. 我是一个flag 侠
  9. Android【1】:一文教你使用Camille+夜神模拟器实现安卓应用隐私合规辅助检测
  10. 【题解】Luogu P5405 [CTS2019]氪金手游