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

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

3天內不再提示

如何在C語言環(huán)境下對其訪問歸納

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2022-02-17 15:34 ? 次閱讀

單片機的特殊功能寄存器SFR,是SRAM地址已經(jīng)確定的SRAM單元,在C語言環(huán)境下對其訪問歸納起來有兩種方法。

1、采用標準C的強制類型轉換和指針來實現(xiàn)

采用標準C的強制轉換和指針的概念來實現(xiàn)訪問MCU寄存器,例如:

#define DDRB (*(volatile unsigned char *)0x25)
分析如下:

A:(unsigned char *)0x25中的0x25只是個值,前面加(unsigned char *)表示0x25是個地址,而且這個地址所存儲的數(shù)據(jù)的數(shù)據(jù)類型是unsigned char,意思就是說讀/寫這個地址時,要寫進unsigned char的值,讀出也是unsigned char的值。

(*(volatile unsigned char *)0x25)是一個固定的指針,是不可變的,而不是指針變量。再在前面加"*",即*(volatile unsigned char *)0x25則變成了變量(普通的unsigned char變量,不是指針變量),如果是#define i (*(volatile unsigned char *)0x25),則與unsigned char i是一樣的,只不過前面i的地址是固定的。

B:關鍵字volatile確保本指令不會以為C編譯器的優(yōu)化而被省略,且要求每次直接讀值。例如使用while(*(unsigned char *)0x25)時,有時系統(tǒng)可能不能真正去讀0x25的值,而是用第一次讀出的值,如果這樣,這個循環(huán)可能就是個死循環(huán)。用了volatile則要求每次都去讀0x25的實際值。

這樣讀/寫以0x25為地址的SRAM單元,直接書寫DDRB即可,即DDRB為變量,只不過變量的地址固定為0x25。例如:
DDRB = 0xff;
這樣比直接采用指針變量的方法直觀和方便的多,例如:

unsigned char *p, i;
p = 0x25;
i = *p; //把地址為0x25單元中的數(shù)據(jù)讀出送入i變量
*p = 0; //向地址為0x25的單元中寫入0
總結一下,就是(*(volatile unsigned char *)0x25)可以看作是一個普通變量,這個變量喲固定的地址,指向0x25。而0x25只是個常量,不是指針,更不是變量

2、對C編譯器進行語法擴充

對C編譯器進行語法擴充。例如MCS51系列KeilC中擴充sfr關鍵字,舉例如下:
sfr P0 = 0x80;
這樣操作0x80單元直接寫P0即可。

下面對AVR的歌C編譯器對訪問MCU寄存器的方法進行簡介。

A:采用標準C的強制類型轉換和指針來實現(xiàn)訪問MCU的寄存器,每一個C編譯器都支持,原因很簡單,這是標準C。

B:ICCAVR和GCCAVR沒有定義新的數(shù)據(jù)類型,只能采用標準C的強制類型轉換和指針來實現(xiàn)訪問MCU的寄存器。而IAR和CodeVisionAVR編譯器對ANSI C進行了擴充,都定義了新的數(shù)據(jù)類型,是C語言可以直接訪問MCU的有關寄存器,例如,IAR中:
SFR_B(DDRB, 0x28)
CodeVisionAVR中:

sfrb DDRB = 0x28
這樣,PORTB=0xff;等同于(*(volatile unsigned char *)0x05) = 0xff;而0x25正好是寄存器PORTB在器件ATmega48/88/168中的地址。

GCCAVR每個AVR器件在頭文件不采用直接定義特殊功能寄存器宏,例如在iomx8.h文件中一個定義如下:

#define PORTB _SFR_IO8(0x25)
而在sfr_defs.h中可以找到如下兩個宏定義:
#define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr)+0x20)
#define _MMIO_BYTE(mem_addr) (*(volatile unit8_t *)(mem_addr))

實質上與直接的強制類型轉換和指針定義是一樣的。

另外,GCCAVR中宏_BV(bit)是操作I/O寄存器是頻繁用到的,avr-libc建議使用這一宏進行寄存器的位操作,他在文件sfr_defs.h中定義如下:
#define _BV(bit) (1<<(bit))
以下是他的使用示例;DDRB = _BV(PB0) | _BV(PB1); //器件頭文件中已經(jīng)定義PB0代表0,PB1代表1。

他等同于“DDRB=0x03;”,這樣寫的目的是為了提供程序的可讀性。不要擔心它會生成比“DDRB=0x03;”更大的代碼,編譯器會處理這種事情,最終會輸出與“DDRB=0x03;”同樣的結果。

審核編輯:何安

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

    關注

    31

    文章

    5295

    瀏覽量

    119838
  • C語言
    +關注

    關注

    180

    文章

    7595

    瀏覽量

    135885
收藏 人收藏

    評論

    相關推薦

    MCU編程語言和開發(fā)環(huán)境介紹

    MCU編程語言 MCU編程語言是用于編寫MCU程序的高級編程語言,它們使得開發(fā)者能夠更高效地開發(fā)嵌入式應用程序。以下是一些常用的MCU編程語言: 1.1
    的頭像 發(fā)表于 11-01 11:51 ?347次閱讀

    何在不同應用場景構建音頻測試環(huán)境

    在之前的文章中,我們已經(jīng)詳細介紹了基礎音頻參數(shù)和AP525的軟硬件配置。本文將延續(xù)這一主題,以泰凌TLSR9518A EVB作為測試設備(DUT),向大家展示如何在不同應用場景構建音頻測試環(huán)境。
    的頭像 發(fā)表于 07-03 15:00 ?421次閱讀
    如<b class='flag-5'>何在</b>不同應用場景<b class='flag-5'>下</b>構建音頻測試<b class='flag-5'>環(huán)境</b>

    FX2 CY7C68013A如何在C++環(huán)境中使用LoadEEPROM函數(shù)?

    我使用的是 FX2 CY7C68013A 芯片。 我知道 CyUSB.NET 庫中有我需要的 LoadEEPROM 函數(shù)。 請問如何在 C++ 環(huán)境而不是
    發(fā)表于 05-31 06:59

    鴻蒙OpenHarmony【 配置遠程訪問環(huán)境

    在搭建了Windows和Ubuntu開發(fā)環(huán)境后,需要通過下述設置,使得Windows可以遠程訪問Ubuntu,為后續(xù)燒錄文件的傳輸做好準備。
    的頭像 發(fā)表于 04-19 20:08 ?429次閱讀
    鴻蒙OpenHarmony【 配置遠程<b class='flag-5'>訪問</b><b class='flag-5'>環(huán)境</b>】

    C語言中的錯誤處理機制解析

    C 語言不提供對錯誤處理的直接支持,但是作為一種系統(tǒng)編程語言,它以返回值的形式允許您訪問底層數(shù)據(jù)。
    的頭像 發(fā)表于 02-26 11:19 ?465次閱讀

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言
    的頭像 發(fā)表于 02-05 14:11 ?2141次閱讀

    vb語言c++語言的區(qū)別

    Microsoft開發(fā)的一種面向對象的事件驅動編程語言。它的設計目標是簡化編程過程,讓初學者也能快速上手。與之相比,C++語言是一種通用的、面向對象的編程語言,
    的頭像 發(fā)表于 02-01 10:20 ?1960次閱讀

    何在Ununtu環(huán)境對Tc264開發(fā)板進行開發(fā)?

    何在Ununtu環(huán)境對Tc264開發(fā)板進行開發(fā)
    發(fā)表于 01-23 07:58

    如何解決C語言中的“訪問權限沖突”異常?C語言引發(fā)異常原因分析

    一些措施來解決和防止發(fā)生。本文將詳細介紹C語言訪問權限沖突異常的原因以及解決方法。 一、訪問權限沖突異常的原因分析
    的頭像 發(fā)表于 01-12 16:03 ?4747次閱讀

    詳解C語言變量和數(shù)據(jù)類型

    C語言大家都不陌生吧,計算機、電子信息、通信工程、自動化等專業(yè)的必學課程,前面和大家介紹過C語言的歷史和編程環(huán)境,今天再來介紹一
    的頭像 發(fā)表于 12-11 10:40 ?784次閱讀
    詳解<b class='flag-5'>C</b><b class='flag-5'>語言</b>變量和數(shù)據(jù)類型

    何在Saber中使用C語言進行建模呢?

    Saber不僅支持MAST語言和VHDL‐AMS語言建立模型,也支持C語言建立器件模型,這對熟悉C語言
    的頭像 發(fā)表于 12-05 11:30 ?1066次閱讀
    如<b class='flag-5'>何在</b>Saber中使用<b class='flag-5'>C</b><b class='flag-5'>語言</b>進行建模呢?

    常用的c語言開發(fā)環(huán)境有哪些

    C語言是一種廣泛應用于系統(tǒng)編程、嵌入式開發(fā)和科學計算等領域的高級編程語言。為了能夠高效地開發(fā)C語言程序,我們需要一個適用的開發(fā)
    的頭像 發(fā)表于 11-27 16:14 ?5512次閱讀

    C語言運行環(huán)境是什么

    C語言運行環(huán)境C language runtime environment)是指在執(zhí)行C語言
    的頭像 發(fā)表于 11-27 16:13 ?3286次閱讀

    c語言codeblocks怎么運行

    C語言中,Code::Blocks 是一個常用的集成開發(fā)環(huán)境(IDE),可以用于編寫、調試和運行C語言程序。下面是關于如
    的頭像 發(fā)表于 11-26 09:24 ?3647次閱讀

    C語言如何創(chuàng)建數(shù)組

    C語言是一種非常強大和靈活的編程語言,它提供了若干數(shù)據(jù)類型來存儲和操作數(shù)據(jù)。其中之一就是數(shù)組,它可以用來存儲一系列具有相同數(shù)據(jù)類型的元素。本文將詳細介紹如何在
    的頭像 發(fā)表于 11-24 10:08 ?1668次閱讀