0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機的內(nèi)存映射圖解析

科技綠洲 ? 來源:嵌入式大雜燴 ? 作者:嵌入式大雜燴 ? 2023-06-22 10:33 ? 次閱讀

一、如何控制單片機?

單片機的內(nèi)存映射圖解析

這里以STM32F429芯片為例,講解下單片機芯片內(nèi)存映射圖。從此圖中可以看到芯片的外設(shè)被分配了512M的空間,然而真正的外設(shè)其實沒有使用到512M的內(nèi)存空間。

然后我們操作外設(shè)時,只需要操作它對應的內(nèi)存地址即可。更加詳細的外設(shè)內(nèi)存地址,可以參考芯片的用戶手冊(不是數(shù)據(jù)手冊)的Memory map章節(jié)。

圖片

因為單片機是將外設(shè)映射到內(nèi)存地址上,所以我們可以像操作內(nèi)存一樣來操作外設(shè)(寫/讀)。

我們在操作內(nèi)存時是通過地址來進行操作的,由于單片機已經(jīng)將外設(shè)與內(nèi)存進行了映射,所以我們在操作單片機外設(shè)時只需要操作外設(shè)映射的內(nèi)存地址就行。

內(nèi)存如何操作?

C語言中操作內(nèi)存,我們可以用指針來進行操作。在匯編語言中由于沒有指針這個概念,所以我們在操作地址時只能用一些內(nèi)存讀寫指令來完成。比如:LDR,STR

結(jié)構(gòu)體操作與宏定義操作的對比

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語言——結(jié)構(gòu)體操作

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

匯編語言操作內(nèi)存

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

二、寄存器方式操作單片機

代碼結(jié)構(gòu)框架:

圖片

文件結(jié)構(gòu)

一個芯片頭文件:外設(shè)的地址宏定義以及外設(shè)相關(guān)的結(jié)構(gòu)體定義

查看芯片的用戶手冊(注意:不是數(shù)據(jù)手冊)中寄存器對應的相應地址。然后使用宏定義來將它們定義好,同時定義好結(jié)構(gòu)體來更加方便的管理外設(shè)寄存器組。這里以STM32F1系列為例

  • ? 一個啟動文件:匯編編寫的、中斷向量表等
  • ? 用戶代碼文件:剩余就是用戶代碼文件了
  • ? 各個芯片的外設(shè)驅(qū)動函數(shù)編寫(讀/寫、控制)、以及用戶邏輯部分代碼。

三、使用HAL庫方式操作單片機

HAL庫與固件庫的區(qū)別

HAL全稱Hardware abstract layer(硬件抽象層),這是一個大家公認并且遵守的一種函數(shù)名稱命名、資源定義。因為是統(tǒng)一的命名規(guī)范,所以當用戶更換芯片平臺后由于函數(shù)命名與所使用的資源都與具體硬件沒有關(guān)系,這樣就不需要修改用戶層代碼了。

而所謂的標準庫其實就是芯片廠商公司內(nèi)部自己命名與實現(xiàn)的庫并且各個廠商的命名規(guī)則不一樣,這樣就會導致可移植性變差。當用戶更換了芯片平臺后由于它們各自的API函數(shù)不一樣就會導致用戶需要修改應用層代碼。

HAL庫設(shè)計

1. HAL框架設(shè)計

圖片

2. HAL資源命名規(guī)則

HAL函數(shù)命名規(guī)則:

圖片

中斷與時鐘設(shè)置宏:
回調(diào)函數(shù)命名規(guī)則:

3. 文件結(jié)構(gòu):

一個芯片頭文件:外設(shè)的地址宏定義以及外設(shè)相關(guān)的結(jié)構(gòu)體定義

查看芯片的用戶手冊(注意:不是數(shù)據(jù)手冊)中寄存器對應的相應地址。然后使用宏定義來將它們定義好,同時定義好結(jié)構(gòu)體來更加方便的管理外設(shè)寄存器組。這里以STM32F1系列為例

一個啟動文件:匯編編寫的、中斷向量表等。

一個HAL庫全局頭文件:一些全局的宏定義以及包含其他外設(shè)頭文件

HAL庫文件:芯片外設(shè)的驅(qū)動函數(shù)

四、HAL庫組成說明

圖片

1. HAL庫的數(shù)據(jù)結(jié)構(gòu)體

  • ? 外設(shè)句柄結(jié)構(gòu)體
  • ? 初始化和配置結(jié)構(gòu)體
  • ? 特定的處理結(jié)構(gòu)體(讀寫/控制)

** 外設(shè)句柄結(jié)構(gòu)體(跟硬件不相關(guān)):**

比如:下面這個串口結(jié)構(gòu)體

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;

初始化結(jié)構(gòu)體(跟硬件相關(guān)):

比如:下面這個串口硬件相關(guān)的結(jié)構(gòu)體

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;

特定的處理結(jié)構(gòu)體(跟硬件有關(guān)):

比如:下面這個ADC處理處理結(jié)構(gòu)體

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:狀態(tài)枚舉

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庫中斷回調(diào)函數(shù)實現(xiàn)說明

(1)使用 __ weak 定義好回調(diào)函數(shù)。如果用戶自己重寫了回調(diào)函數(shù),那么編譯器就會使用用戶重寫的這個回調(diào)函數(shù)。其中__ weak這個關(guān)鍵字是編譯器定義的。

(2)使用函數(shù)指針。定義一個全局的函數(shù)指針變量,在初始化函數(shù)時將我們自定義的回調(diào)函數(shù)賦值給這個全局的函數(shù)指針變量(這一步也叫做:注冊)。然后再中斷函數(shù)中通過這個全局的函數(shù)指針變量來調(diào)用我們自定義的回調(diào)函數(shù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6026

    文章

    44452

    瀏覽量

    630797
  • STM32
    +關(guān)注

    關(guān)注

    2262

    文章

    10846

    瀏覽量

    353676
  • 內(nèi)存映射
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    7403
收藏 人收藏

    評論

    相關(guān)推薦

    單片機復位電路詳解

    單片機復位電路就好比電腦的重啟部分,當電腦在使用中出現(xiàn)死機,按下重啟按鈕電腦內(nèi)部的程序從頭開始執(zhí)行。單片機也一樣,當單片機系統(tǒng)在運行中,受到環(huán)境干擾出現(xiàn)程序跑飛的時候,按下復位按鈕內(nèi)部的程序自動從頭開始執(zhí)行。本文介紹的就是
    發(fā)表于 09-05 09:09 ?7123次閱讀

    詳解單片機內(nèi)存分配

    對于初學者而言,對單片機內(nèi)存分配往往最讓人頭疼,很多人學了單片機幾年 都不知道單片機內(nèi)部的內(nèi)存使用情況是如何分配的。要了解 ROM(fla
    發(fā)表于 11-07 10:42 ?2218次閱讀

    STM32單片機內(nèi)存優(yōu)化策略

    單片機開發(fā)中,內(nèi)存優(yōu)化是至關(guān)重要的,它不僅能夠降低成本,還可以提高性能。本文將深入討論如何在STM32單片機和C語言的環(huán)境中實施內(nèi)存優(yōu)化策略,以確保項目的順利進行。
    發(fā)表于 08-21 09:21 ?2273次閱讀
    STM32<b class='flag-5'>單片機</b>的<b class='flag-5'>內(nèi)存</b>優(yōu)化策略

    如何操作單片機

    如何操作單片機?1.單片機內(nèi)存映射圖解析2.因為單片機是將外設(shè)
    發(fā)表于 01-21 13:16

    單片機延時程序圖解分析

    單片機延時程序圖解分析 上一次課中,我們已經(jīng)知道,程序中的符號R7、R6是代表了一個個的RAM單元,是用來放一些數(shù)據(jù)的,下面我們再來看一
    發(fā)表于 03-11 09:18 ?608次閱讀
    <b class='flag-5'>單片機</b>延時程序<b class='flag-5'>圖解</b>分析

    PIC單片機圖解入門教程

    本人提供的PIC 單片機圖解入門教程,希望能夠?qū)δ膶W習有所幫助。
    發(fā)表于 05-26 15:45 ?715次下載
    PIC<b class='flag-5'>單片機</b><b class='flag-5'>圖解</b>入門教程

    芯片解密(單片機破解)技術(shù)解析

    芯片解密(單片機破解)技術(shù)解析
    發(fā)表于 01-12 22:23 ?51次下載

    Freescale 16位單片機的地址映射

    原文鏈接:freescale 16位單片機的地址映射--(1)前言 freescale 16位單片機的地址映射--(2)飛思卡爾16位單片機
    發(fā)表于 11-24 07:43 ?1108次閱讀

    51單片機如何使用動態(tài)內(nèi)存

    本文檔的主要內(nèi)容詳細介紹的是51單片機如何使用動態(tài)內(nèi)存的詳細資料免費下載。
    發(fā)表于 06-14 17:44 ?0次下載
    51<b class='flag-5'>單片機</b>如何使用動態(tài)<b class='flag-5'>內(nèi)存</b>

    極簡單片機最小系統(tǒng)制作完全圖解

    極簡單片機最小系統(tǒng)制作完全圖解資料免費下載。
    發(fā)表于 04-26 09:05 ?11次下載

    基于51單片機6264擴展內(nèi)存仿真設(shè)計(proteus仿真+程序)

    基于51單片機6264擴展內(nèi)存仿真設(shè)計(proteus仿真+程序)(單片機原理及應用)-基于51單片機6264擴展內(nèi)存仿真設(shè)計(proteu
    發(fā)表于 07-22 11:45 ?82次下載
    基于51<b class='flag-5'>單片機</b>6264擴展<b class='flag-5'>內(nèi)存</b>仿真設(shè)計(proteus仿真+程序)

    【KEIL·單片機·掃盲貼】關(guān)于ARM單片機程序內(nèi)存使用情況的細致討論。

    【KEIL·單片機·掃盲貼】關(guān)于ARM單片機程序內(nèi)存使用情況的細致討論。
    發(fā)表于 11-25 12:06 ?9次下載
    【KEIL·<b class='flag-5'>單片機</b>·掃盲貼】關(guān)于ARM<b class='flag-5'>單片機</b>程序<b class='flag-5'>內(nèi)存</b>使用情況的細致討論。

    單片機內(nèi)存分配(變量的存儲位置)詳解

    對于初學者而言,對單片機內(nèi)存分配往往最讓人頭疼,很多人學了單片機幾年 都不知道單片機內(nèi)部的內(nèi)存使用情況是如何分配的。要了解 ROM、RAM
    發(fā)表于 12-31 19:47 ?2次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>內(nèi)存</b>分配(變量的存儲位置)詳解

    單片機內(nèi)存映射圖解析

    一、如何控制單片機? 單片機內(nèi)存映射圖解析 這里以STM32F429芯片為例,講解下單片機芯片
    的頭像 發(fā)表于 06-22 10:18 ?1596次閱讀
    <b class='flag-5'>單片機</b>的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>映射</b><b class='flag-5'>圖解析</b>

    單片機解析g代碼的方法

    的運動。 解析G代碼是將其轉(zhuǎn)化為單片機能夠理解和執(zhí)行的指令集。單片機解析G代碼的方法主要包括以下幾個方面:G代碼的格式解析、指令的
    的頭像 發(fā)表于 12-22 14:15 ?1427次閱讀