STM32仿真proteus位带操作和keil增加头文件C文件

这里写目录标题

  • [第一章 STM32cubemx生成代码](#第一章 STM32cubemx生成代码)
  • [第二章 Proteus新建工程](#第二章 Proteus新建工程)
  • [第三章 STM32cubemx+Proteus仿真和keil5联合调试](#第三章 STM32cubemx+Proteus仿真和keil5联合调试)
  • [第四章 STM32位带操作和keil增加头文件C文件](#第四章 STM32位带操作和keil增加头文件C文件)
    • [1.1 位带操作介绍](#1.1 位带操作介绍)
    • [1.2 代码](#1.2 代码)
    • [1.1 代码工程配置](#1.1 代码工程配置)

第一章 STM32cubemx生成代码

https://blog.csdn.net/weixin_52733843/article/details/143637304

第二章 Proteus新建工程

https://blog.csdn.net/weixin_52733843/article/details/143578853

第三章 STM32cubemx+Proteus仿真和keil5联合调试

https://blog.csdn.net/weixin_52733843/article/details/143725200

第四章 STM32位带操作和keil增加头文件C文件

1.1 位带操作介绍

在学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机 IO 口进行位定义。但是 STM32 没有这样的关键字,而是通过访问位带别名区来实现。即将每个比特位膨胀成一个 32 位字,当访问这些字的时候就达到了访问比特的目的。比方说 BSRR 寄存器有 32 个位,那么可以映射到 32 个地址上,当我们去访问这 32 个地址就达到访问 32 个比特的目的。

(1)外设位带别名区地址

对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n,n值的范围是 0-7,则该比特在别名区的地址为:

0x42000000 是外设位带别名区的起始地址,0x40000000 是外设位带区的起始地址,(A-0x40000000)表示该比特前面有多少个字节,一个字节有 8 位,所以8,一个位膨胀后是 4 个字节,所以4,n 表示该比特在 A 地址的序号,因为一个位经过膨胀后是四个字节,所以也*4。

(2)SRAM 位带别名区地址

对于 SRAM 位带区的某个比特,记它所在字节的地址为 A,位序号为 n,n 值的范围是 0-7,则该比特在别名区的地址为:

AliasAddr= =0x22000000+ (A-0x20000000)84 +n*4

0x22000000 是 SRAM 位带别名区的起始地址,0x20000000 是 SRAM 位带区的起始地址,(A-0x20000000)表示该比特前面有多少个字节,一个字节有 8 位,所以8,一个位膨胀后是 4 个字节,所以4,n 表示该比特在 A 地址的序号,因为一个位经过膨胀后是四个字节,所以也*4。

上面我们已经把外设位带别名区地址和 SRAM 位带别名区地址使用公式表示出来,为了操作方便,我们将这两个公式进行合并,通过一个宏来定义,并把位带地址和位序号作为这个宏定义的参数。公式如下:

addr & 0xF0000000 是为了区分我们操作的是 SRAM 还是外设,实际上就是获取最高位的值是 4 还是 2。如果操作的是外设,那么 addr & 0xF0000000 结果就是 0x40000000,后面+0x2000000 就等于 0X42000000,0X42000000 是外设别名区的起始地址。如果操作的是 SRAM,那么 addr & 0xF0000000 结果就是0x20000000,后面+0x2000000 就等于 0X22000000,0X22000000 是 SRAM 别名区的起始地址。

addr & 0x000FFFFF 屏蔽了高三位,相当于减去 0X20000000 或者0X40000000,屏蔽高三位是因为 SRAM 和外设的位带区最高地址是 0X200F FFFF和 0X400F FFFF,SRAM 或者外设位带区上任意地址减去其对应的起始地址,总是低 5 位有效,所以这里屏蔽高 3 位就相当于减去了 0X20000000 或者0X40000000。<<5 相当于84, <<2 相当于*4,其作用在前面已经分析过。

最后就可以通过指针形式来操作这些位带别名区地址,实现位带区对应位的

操作。代码如下:

1.2 代码

//映射地址公式

//IO口输出输入映射

//IO口操作,只对单一的IO口!

//确保n的值为0~15

1.1 代码工程配置

STM32CubeMX工程复制第七章的。

这部分代码需要我们自行添加到工程文件,需要掌握添加.h和.c文件到keil工程文件的方法。

具体方法:

1.复制一个工程文件,复制Part01_LED重命名为Part01_LEDBIT

2.进入工程文件,进入Public文件,新建System文件夹用来存放位带的文件。

3.新建system.c和system.h两个文件,存放于Pbulic文件夹下。

system.c内容为

system.c内容为

4.添加文件到目录,并添加文件路径。以下添加文件到工程是必须要会的,下面的教程会需要用到

5.添加.c文件

6.添加.h文件

7.main.c代码修改为

添加system.h头文件

修改while函数为

8.编译生成新的hex文件。打开proteus文件开始仿真,仿真现象为LED灯闪烁。

PAout(0)=1;表示PA0引脚输出高电平

PAout(0)=0;表示PA0引脚输出低电平

68619)]

外链图片转存中...(img-3uz9FCqO-1731586068619)

8.编译生成新的hex文件。打开proteus文件开始仿真,仿真现象为LED灯闪烁。

PAout(0)=1;表示PA0引脚输出高电平

PAout(0)=0;表示PA0引脚输出低电平

比调用hal库函数HAL_GPIO_WritePin更加代码简洁,而且代码执行更加高效。

相关推荐
可待电子单片机设计定制(论文)7 小时前
【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)
stm32·单片机·嵌入式硬件
电星托马斯10 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
了一li12 小时前
STM32实现一个简单电灯
stm32·单片机·嵌入式硬件
可待电子单片机设计定制(论文)15 小时前
【STM32设计】数控直流稳压电源的设计与实现(实物+资料+论文)
stm32·嵌入式硬件·mongodb
march_birds15 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式16 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin17 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者17 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
触角0101000117 小时前
STM32F103低功耗模式深度解析:从理论到应用实践(上) | 零基础入门STM32第九十二步
驱动开发·stm32·单片机·嵌入式硬件·物联网
昊虹AI笔记18 小时前
使用STM32CubeMX和Keil在STM32上创建并运行一个简单的FreeRTOS多任务程序
stm32·单片机·嵌入式硬件