0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机的内存映射图解析

科技绿洲 来源:嵌入式大杂烩 作者:嵌入式大杂烩 2023-06-22 10:33 次阅读

一、如何控制单片机?

单片机的内存映射图解析

这里以STM32F429芯片为例,讲解下单片机芯片内存映射图。从此图中可以看到芯片的外设被分配了512M的空间,然而真正的外设其实没有使用到512M的内存空间。

然后我们操作外设时,只需要操作它对应的内存地址即可。更加详细的外设内存地址,可以参考芯片的用户手册(不是数据手册)的Memory map章节。

图片

因为单片机是将外设映射到内存地址上,所以我们可以像操作内存一样来操作外设(写/读)。

我们在操作内存时是通过地址来进行操作的,由于单片机已经将外设与内存进行了映射,所以我们在操作单片机外设时只需要操作外设映射的内存地址就行。

内存如何操作?

C语言中操作内存,我们可以用指针来进行操作。在汇编语言中由于没有指针这个概念,所以我们在操作地址时只能用一些内存读写指令来完成。比如:LDR,STR

结构体操作与宏定义操作的对比

C语言——宏定义形式

#define GPIOA (*(volatile uint32_t *)(0x000800E0))
#define GPIOA_DR (*(volatile uint32_t *)(0x000800E4))
#define GPIOA_MR (*(volatile uint32_t *)(0x00080108))
#define GPIOA_TR (*(volatile uint32_t *)(0x00080108))

C语言——结构体操作

struct GPIOA_Reg{
    volatile uint32_t dr;
    volatile uint32_t mr;
    volatile uint32_t tr;
}GPIOA_REG

汇编语言操作内存

LDR r0, =0x00800010
MOV r1, #2
STR r1, [r0]

二、寄存器方式操作单片机

代码结构框架:

图片

文件结构

一个芯片头文件:外设的地址宏定义以及外设相关的结构体定义

查看芯片的用户手册(注意:不是数据手册)中寄存器对应的相应地址。然后使用宏定义来将它们定义好,同时定义好结构体来更加方便的管理外设寄存器组。这里以STM32F1系列为例

  • • 一个启动文件:汇编编写的、中断向量表等
  • • 用户代码文件:剩余就是用户代码文件了
  • • 各个芯片的外设驱动函数编写(读/写、控制)、以及用户逻辑部分代码。

三、使用HAL库方式操作单片机

HAL库与固件库的区别

HAL全称Hardware abstract layer(硬件抽象层),这是一个大家公认并且遵守的一种函数名称命名、资源定义。因为是统一的命名规范,所以当用户更换芯片平台后由于函数命名与所使用的资源都与具体硬件没有关系,这样就不需要修改用户层代码了。

而所谓的标准库其实就是芯片厂商公司内部自己命名与实现的库并且各个厂商的命名规则不一样,这样就会导致可移植性变差。当用户更换了芯片平台后由于它们各自的API函数不一样就会导致用户需要修改应用层代码。

HAL库设计

1. HAL框架设计

图片

2. HAL资源命名规则

HAL函数命名规则:

图片

中断与时钟设置宏:
回调函数命名规则:

3. 文件结构:

一个芯片头文件:外设的地址宏定义以及外设相关的结构体定义

查看芯片的用户手册(注意:不是数据手册)中寄存器对应的相应地址。然后使用宏定义来将它们定义好,同时定义好结构体来更加方便的管理外设寄存器组。这里以STM32F1系列为例

一个启动文件:汇编编写的、中断向量表等。

一个HAL库全局头文件:一些全局的宏定义以及包含其他外设头文件

HAL库文件:芯片外设的驱动函数

四、HAL库组成说明

图片

1. HAL库的数据结构体

  • • 外设句柄结构体
  • • 初始化和配置结构体
  • • 特定的处理结构体(读写/控制)

** 外设句柄结构体(跟硬件不相关):**

比如:下面这个串口结构体

typedef struct
{
    USART_TypeDef *Instance; /* USART registers base address */
    USART_InitTypeDef Init; /* Usart communication parameters */
    uint8_t *pTxBuffPtr;/* Pointer to Usart Tx transfer Buffer */
    uint16_t TxXferSize; /* Usart Tx Transfer size */
    __IO uint16_t TxXferCount;/* Usart Tx Transfer Counter */
    uint8_t *pRxBuffPtr;/* Pointer to Usart Rx transfer Buffer */
    uint16_t RxXferSize; /* Usart Rx Transfer size */
    __IO uint16_t RxXferCount; /* Usart Rx Transfer Counter */
    DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parameters */
    DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parameters */
    HAL_LockTypeDef Lock; /* Locking object */
    __IO HAL_USART_StateTypeDef State; /* Usart communication state */
    __IO HAL_USART_ErrorTypeDef ErrorCode;/* USART Error code */
}USART_HandleTypeDef;

初始化结构体(跟硬件相关):

比如:下面这个串口硬件相关的结构体

typedef struct
{
    uint32_t BaudRate; /*!< This member configures the UART communication baudrate.*/
    uint32_t WordLength; /*!< Specifies the number of data bits transmitted or received
    in a frame.*/
    uint32_t StopBits; /*!< Specifies the number of stop bits transmitted.*/
    uint32_t Parity; /*!< Specifies the parity mode. */
    uint32_t Mode; /*!< Specifies wether the Receive or Transmit mode is enabled or
    disabled.*/
    uint32_t HwFlowCtl; /*!< Specifies wether the hardware flow control mode is enabled
    or disabled.*/
    uint32_t OverSampling; /*!< Specifies wether the Over sampling 8 is enabled or
    disabled,
    to achieve higher speed (up to fPCLK/8).*/
}UART_InitTypeDef;

特定的处理结构体(跟硬件有关):

比如:下面这个ADC处理处理结构体

typedef struct 
{
  uint32_t Channel;                /*!< Specifies the channel to configure into ADC regular group.
                                        This parameter can be a value of @ref ADC_channels */
  uint32_t Rank;                   /*!< Specifies the rank in the regular group sequencer.
                                        This parameter must be a number between Min_Data = 1 and Max_Data = 16 */
  uint32_t SamplingTime;           /*!< Sampling time value to be set for the selected channel.
                                        Unit: ADC clock cycles
                                        Conversion time is the addition of sampling time and processing time (12 ADC clock cycles at ADC resolution 12 bits, 11 cycles at 10 bits, 9 cycles at 8 bits, 7 cycles at 6 bits).
                                        This parameter can be a value of @ref ADC_sampling_times
                                        Caution: This parameter updates the parameter property of the channel, that can be used into regular and/or injected groups.
                                                 If this same channel has been previously configured in the other group (regular/injected), it will be updated to last setting.
                                        Note: In case of usage of internal measurement channels (VrefInt/Vbat/TempSensor),
                                              sampling time constraints must be respected (sampling time can be adjusted in function of ADC clock frequency and sampling time setting)
                                              Refer to device datasheet for timings values, parameters TS_vrefint, TS_temp (values rough order: 4us min). */
  uint32_t Offset;                 /*!< Reserved for future use, can be set to 0 */
}ADC_ChannelConfTypeDef;

2. HAL库公共资源

HAL Status:状态枚举

Typedef enum
{
HAL_OK = 0x00,
HAL_ERROR = 0x01,
HAL_BUSY = 0x02,
HAL_TIMEOUT = 0x03
} HAL_StatusTypeDef;

HAL Locked:用于防止共享资源被意外访问

typedef enum
{
HAL_UNLOCKED = 0x00, /*!< Resources unlocked */
HAL_LOCKED = 0x01 /*!< Resources locked */
} HAL_LockTypeDef;

公共的宏定义:NULL 和 HAL_MAX_DELAY

#ifndef NULL
#define NULL (void *) 0
#endif
#define HAL_MAX_DELAY 0xFFFFFFFF

3. HAL库中断回调函数实现说明

(1)使用 __ weak 定义好回调函数。如果用户自己重写了回调函数,那么编译器就会使用用户重写的这个回调函数。其中__ weak这个关键字是编译器定义的。

(2)使用函数指针。定义一个全局的函数指针变量,在初始化函数时将我们自定义的回调函数赋值给这个全局的函数指针变量(这一步也叫做:注册)。然后再中断函数中通过这个全局的函数指针变量来调用我们自定义的回调函数。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44554

    浏览量

    634635
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355730
  • 内存映射
    +关注

    关注

    0

    文章

    14

    浏览量

    7415
收藏 人收藏

    评论

    相关推荐

    单片机复位电路详解

    单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。本文介绍的就是
    发表于 09-05 09:09 7321次阅读

    详解单片机内存分配

    对于初学者而言,对单片机内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(fla
    发表于 11-07 10:42 2296次阅读

    STM32单片机内存优化策略

    单片机开发中,内存优化是至关重要的,它不仅能够降低成本,还可以提高性能。本文将深入讨论如何在STM32单片机和C语言的环境中实施内存优化策略,以确保项目的顺利进行。
    发表于 08-21 09:21 2552次阅读
    STM32<b class='flag-5'>单片机</b>的<b class='flag-5'>内存</b>优化策略

    如何操作单片机

    如何操作单片机?1.单片机内存映射图解析2.因为单片机是将外设
    发表于 01-21 13:16

    PIC单片机图解入门教程

    本人提供的PIC 单片机图解入门教程,希望能够对您的学习有所帮助。
    发表于 05-26 15:45 715次下载
    PIC<b class='flag-5'>单片机</b><b class='flag-5'>图解</b>入门教程

    芯片解密(单片机破解)技术解析

    芯片解密(单片机破解)技术解析
    发表于 01-12 22:23 51次下载

    Freescale 16位单片机的地址映射

    原文链接:freescale 16位单片机的地址映射--(1)前言 freescale 16位单片机的地址映射--(2)飞思卡尔16位单片机
    发表于 11-24 07:43 1148次阅读

    51单片机如何使用动态内存

    本文档的主要内容详细介绍的是51单片机如何使用动态内存的详细资料免费下载。
    发表于 06-14 17:44 0次下载
    51<b class='flag-5'>单片机</b>如何使用动态<b class='flag-5'>内存</b>

    极简单片机最小系统制作完全图解

    极简单片机最小系统制作完全图解资料免费下载。
    发表于 04-26 09:05 11次下载

    基于51单片机6264扩展内存仿真设计(proteus仿真+程序)

    基于51单片机6264扩展内存仿真设计(proteus仿真+程序)(单片机原理及应用)-基于51单片机6264扩展内存仿真设计(proteu
    发表于 07-22 11:45 82次下载
    基于51<b class='flag-5'>单片机</b>6264扩展<b class='flag-5'>内存</b>仿真设计(proteus仿真+程序)

    单片机笔记(1)--单片机概述

    单片机概述单片机单片机微型单片机,是将单片机主机(CPU、内存和I/O接口)集成在一小块硅片上
    发表于 11-18 15:36 26次下载
    <b class='flag-5'>单片机</b>笔记(1)--<b class='flag-5'>单片机</b>概述

    【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。

    【KEIL·单片机·扫盲贴】关于ARM单片机程序内存使用情况的细致讨论。
    发表于 11-25 12:06 9次下载
    【KEIL·<b class='flag-5'>单片机</b>·扫盲贴】关于ARM<b class='flag-5'>单片机</b>程序<b class='flag-5'>内存</b>使用情况的细致讨论。

    单片机内存分配(变量的存储位置)详解

    对于初学者而言,对单片机内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM、RAM
    发表于 12-31 19:47 2次下载
    <b class='flag-5'>单片机</b>的<b class='flag-5'>内存</b>分配(变量的存储位置)详解

    单片机内存映射图解析

    一、如何控制单片机单片机内存映射图解析 这里以STM32F429芯片为例,讲解下单片机芯片
    的头像 发表于 06-22 10:18 1735次阅读
    <b class='flag-5'>单片机</b>的<b class='flag-5'>内存</b><b class='flag-5'>映射</b><b class='flag-5'>图解析</b>

    单片机解析g代码的方法

    的运动。 解析G代码是将其转化为单片机能够理解和执行的指令集。单片机解析G代码的方法主要包括以下几个方面:G代码的格式解析、指令的
    的头像 发表于 12-22 14:15 1760次阅读