成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶你了解C語言訪問存儲器的方法

開發(fā) 后端
在單片機中我們經(jīng)常需要訪問某個指定的寄存器或者到指定的RAM地址,在本文為簡單描述,下文所說的存儲器可指:寄存器,RAM等。

[[425144]]

在單片機中我們經(jīng)常需要訪問某個指定的寄存器或者到指定的RAM地址,在本文為簡單描述,下文所說的存儲器可指:寄存器,RAM等。

01宏定義:

定義一個宏,將地址值轉(zhuǎn)化為C指針,然后取這個指針指向的內(nèi)容,這樣就可以訪問存儲了,代碼如下:

  1. #define SDA_DIR_REG  *(__IO uint32_t *)SDA_MOD_OFFSET 

分析:

(__IOuint32_t *)SDA_MOD_OFFSE 是強制類型轉(zhuǎn)換強制轉(zhuǎn)換為指針*(__IOuint32_t *)SDA_MOD_OFFSET 取這個指針里內(nèi)容。這是一種很簡單實用的方法,對于訪問某個寄存器是很長好用的。舉例:

  1. *(__IOuint16_t *) (((uint32_t)0x60020000) ) 

(((uint32_t)0x60020000))是32位的IO地址(物理地址,硬件上設(shè)定的,不可修改) *(__IO uint16_t*)是讀取該地址的參數(shù)值,其值為16位參數(shù)。

實際上是讀取0x60020000寄存器的參數(shù),或者可以說是這個IO口現(xiàn)在的狀態(tài)。

02結(jié)構(gòu)體:

將存儲器定義為一種數(shù)據(jù)結(jié)構(gòu),然后定義一個指向結(jié)構(gòu)體的指針。

符合CMSIS的設(shè)備驅(qū)動庫就是這樣做的

  1. typedef struct 
  2.   __IO uint32_t MODER;   /*!< GPIO port mode register,          Address offset: 0x00      */ 
  3.   __IO uint32_t OTYPER;  /*!< GPIO port output type register,        Address offset: 0x04      */ 
  4.   __IO uint32_t OSPEEDR; /*!< GPIO port output speed register,       Address offset: 0x08      */ 
  5.   __IO uint32_t PUPDR;   /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */ 
  6.   __IO uint32_t IDR;     /*!< GPIO port input data register,         Address offset: 0x10      */ 
  7.   __IO uint32_t ODR;     /*!< GPIO port output data register,        Address offset: 0x14      */ 
  8.   __IO uint16_t BSRRL;   /*!< GPIO port bit set/reset low register,  Address offset: 0x18      */ 
  9.   __IO uint16_t BSRRH;   /*!< GPIO port bit set/reset high register, Address offset: 0x1A      */ 
  10.   __IO uint32_t LCKR;    /*!< GPIO port configuration lock register, Address offset: 0x1C      */ 
  11.   __IO uint32_t AFR[2];  /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */ 
  12. } GPIO_TypeDef; 
  13.  
  14. #define PERIPH_BASE      ((uint32_t)0x40000000) 
  15. #define AHB1PERIPH_BASE  (PERIPH_BASE + 0x00020000) 
  16. #define GPIOC_BASE       (AHB1PERIPH_BASE + 0x0800) 
  17. #define GPIOC            ((GPIO_TypeDef *)GPIOC_BASE) 

大家看著上面的代碼應該很熟悉,這就是我在ST給的標準外設(shè)庫中復制的,這也是CMSIS標準的驅(qū)動發(fā)方式。

我在《STM32驅(qū)動LCD實戰(zhàn)》文中就是使用這種方式驅(qū)動操作LCD。代碼如下。

  1. typedef struct 
  2.     uint8 LCD_CMD;//用于LCD命令操作 
  3.     uint8 LCD_DATA;//用于LCD數(shù)據(jù)操作 
  4. } LCD_TypeDef; 
  5. #define LCD_BASE        ((uint32_t)(0x60000000 | 0x0000FFFF)) 
  6. #define LCD             ((LCD_TypeDef *) LCD_BASE) 

詳解如下:

LCD->LCD_CMD :是地址((uint32_t)(0x60000000| 0x0000FFFF))上的數(shù)據(jù)LCD->LCD_DATA:是地址((uint32_t)(0x60000000| 0x00010000))上的數(shù)據(jù)這種驅(qū)動方式更加簡潔,代碼結(jié)構(gòu)化。個人也更喜歡這種方式。03對比

方法1:簡單,但是生成代碼效率低,因為寄存器的地址值都會被存儲為常量,代碼體積會變大。由于需要訪問的更多寄存器來設(shè)置地址值,運行速度會更低。不過,若外設(shè)控制代碼值操作1個寄存器,效率就和方法2相同了方法2:允許外設(shè)中的多個寄存器共用一個常量作為基地址。訪問每個寄存器時可以用立即數(shù)偏移尋址模式。

本文轉(zhuǎn)載自微信公眾號「知曉編程」

 

責任編輯:姜華 來源: 知曉編程
相關(guān)推薦

2021-04-15 05:53:35

C# 索引器對象

2021-05-20 06:57:16

RabbitMQ開源消息

2021-08-11 07:02:21

npm包管理器工具

2022-02-18 08:54:21

docker操作系統(tǒng)Linux

2022-05-05 07:40:07

maskCSS

2022-01-15 10:02:03

Java Hashtable類 Java 基礎(chǔ)

2021-11-24 08:51:32

Node.js監(jiān)聽函數(shù)

2021-08-02 06:34:55

Redis刪除策略開源

2021-11-08 08:42:44

CentOS Supervisor運維

2021-12-15 11:52:34

GPLLinuxGNU

2023-09-01 16:32:36

JavaScript

2023-10-10 15:29:36

JavaScript開發(fā)

2020-10-27 10:05:32

JavaScript 數(shù)組迭代

2023-05-12 08:19:12

Netty程序框架

2021-07-28 10:02:54

建造者模式代碼

2021-06-30 00:20:12

Hangfire.NET平臺

2021-07-14 08:24:23

TCPIP 通信協(xié)議

2020-11-20 08:53:35

JavaScript

2020-11-17 11:10:21

CSS選擇器HTML

2020-10-22 08:33:22

Go語言
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一级黄色淫片 | 卡通动漫第一页 | 国产午夜精品一区二区三区嫩草 | 欧美激情国产日韩精品一区18 | 国产免费av在线 | 日本不卡一区二区三区在线观看 | 国产精品久久久久久久久动漫 | 亚洲综合一区二区三区 | 中文字幕亚洲欧美 | 天天干.com | 欧美精品在欧美一区二区 | 久久中文字幕一区 | 亚洲精品九九 | 国产一级片一区二区三区 | 欧美日韩国产中文 | 国产成人精品一区二区三区四区 | www在线视频 | 蜜桃精品视频在线 | 中文字幕久久精品 | 国产精华一区 | 九九热精品视频 | 天天综合永久 | 日韩一区二区在线视频 | 亚洲电影一级片 | 亚洲电影一区二区三区 | 国产一区二区三区视频 | 国产精品久久久亚洲 | 一级免费a| 日本不卡一二三 | 永久www成人看片 | 99精品久久 | 国产欧美日韩在线播放 | 久在线| 999久久久免费精品国产 | 欧美人妖网站 | 久久黄网 | 国产成人午夜高潮毛片 | 欧美日一区二区 | 丝袜美腿一区二区三区 | 国产麻豆一区二区三区 | 97超碰人人|