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

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

    关注

    6001

    文章

    43973

    浏览量

    620840
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348745
  • 内存映射
    +关注

    关注

    0

    文章

    14

    浏览量

    7371
收藏 人收藏

    评论

    相关推荐

    拆解mmap内存映射的本质!

    mmap 内存映射里所谓的内存其实指的是虚拟内存,在调用 mmap 进行匿名映射的时候(比如进行堆内存
    的头像 发表于 01-24 14:30 348次阅读
    拆解mmap<b class='flag-5'>内存</b><b class='flag-5'>映射</b>的本质!

    吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的.....

    本帖最后由 吴鉴鹰 于 2014-6-14 11:10 编辑 吴鉴鹰单片机项目详细解析系列(连载)之基于单片机的实战项目Hi!大家好,我叫吴鉴鹰,100%年中国制造,长181cm,净重70kg
    发表于 03-27 22:07

    S5PV210的内存地址映射

    , 2^32 次方4G CPU 地址分配映射:SFRS 256M 地址DRAM1 内存第一个插槽 1G 外界内存DRAM2 .512M内存 1.5G , 210 32 位 为什么只支
    发表于 07-01 07:41

    CORTEX-M 单片机 文章总览 精选资料分享

    单片机makefile工程makefile-linux工程单片机的bootstm32的bootgd32的boot单片机内存stm32的内存
    发表于 07-16 07:26

    有没有单片机8x8LED点阵屏显示数字程序参考?

    单片机8x8LED点阵屏显示数字的硬件连接图解析和程序?
    发表于 10-13 06:07

    单片机攻击技术解析

    内的程序,这就是所谓单片机加密或者说锁定功能。事实上,这样的保护措施很脆弱,很容易被破解。单片机攻击者借助专用设备或者自制设备,利用单片机芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取
    发表于 12-13 07:28

    如何操作单片机

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

    有哪位大佬做过基于单片机的104规约解析

    有大佬做过基于单片机的104规约解析吗?单片机作为从站,通过104规约与主机通讯。
    发表于 09-05 14:12

    有大佬做过基于单片机的104规约解析吗?

    有大佬做过基于单片机的104规约解析吗?单片机作为从站,通过104规约与主机通讯。
    发表于 05-12 15:54

    单片机映射地址0-1FFFF范围只是给单片机看的?有意思吗?

    对于外设是16位的,地址范围只有0-FFFF吧?单片机映射地址0-1FFFF范围只是给单片机看的吧?没什么意义啊?
    发表于 06-27 08:09

    PIC单片机图解入门教程

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

    Freescale 16位单片机的地址映射

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

    浅析linux内存映射原理

    内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修
    发表于 08-24 09:35 1476次阅读
    浅析linux<b class='flag-5'>内存</b><b class='flag-5'>映射</b>原理

    单片机内存映射图解析

    一、如何控制单片机单片机内存映射图解析 这里以STM32F429芯片为例,讲解下单片机芯片
    的头像 发表于 06-22 10:18 987次阅读
    <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 523次阅读