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

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

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

指針變量, 位帶指針 ,LSB最低有效位 ······

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-08 11:53 ? 次閱讀

主要內(nèi)容:

1.指針變量及例子

2.指針變量---位帶操作

3.位帶別名區(qū)最低有效位

4.位帶操作另一種宏定義

1指針變量及例子

前面文章【STM32位帶操作】牽涉到的一個重要知識點就是指針變量。

這種位帶映射操作,就是操作映射過后的地址,其實就是操作指針變量。

指針變量:指存放地址的變量。

指針變量是一種特殊的變量,它不同于一般的變量,一般變量存放的是數(shù)據(jù)本身,而指針變量存放的是數(shù)據(jù)的地址?!墩园俣劝倏啤局羔樧兞俊俊?/p>

指針變量的例子

intmain(void){ uint32_t *p; p = (uint32_t *)(0x42210184); System_Initializes(); while(1) { *p =0; TIMDelay_Nms(500); *p =1; TIMDelay_Nms(500); }}

上面例子中給p指針變量賦的值是“0x42210184”,只是強制轉(zhuǎn)換成(uint32_t *)這種指針類型。

而*p = 0;代表該地址上的數(shù)據(jù)值為0;也就是上面說的該地址存放的數(shù)據(jù)為0;

前面有一個朋友問過我關(guān)于指針變量的問題,看到這里,相信你應(yīng)該知道使用指針變量,直接打印指針就可以判斷指針是否越界。

2指針變量---位帶操作

上面代碼中“0x42210184”代表STM32F103系列芯片中PA1的位帶別名地址(就是映射過去的地址),截一個圖,大家看看:

提示:上圖中對p的賦值,其實是一樣的(在STM32中),都是0x42210184。

結(jié)合公式理解

上一篇文章【STM32位帶操作】列出了關(guān)于片上外設(shè)區(qū)計算公式:

AliasAddr = 0x42000000+(A-0x40000000)*32 + n*4

對比截圖中第一個p賦的值,就是片上外設(shè)的計算公式。

第二個p只是對代碼優(yōu)化了:“&”到“-”的優(yōu)化,可以看編譯器相關(guān)手冊。

第4個p就是上一節(jié)代碼中值,有沒有發(fā)現(xiàn),位帶操作其實就操作指針變量???

這樣相比讀出寄存器,再&或者|再寫入寄存器的效率要高多啦?

3位帶別名區(qū)最低有效位

有朋友發(fā)現(xiàn),*p = 0;這樣操作對地址0x42210184(PA1輸出)寫入0,PA1輸出低。假如我寫入0x10,那么PA1輸出多少呢?

答案:輸出低。

原因在于:在位帶區(qū)中,每個比特都映射到別名地址區(qū)的一個字只有 LSB 有效,也就是最低一位有效。

4位帶操作另一種宏定義

有通過昨天的兩個公式,可以推出下圖的公式:

上面框起來的定義適合RAM和外設(shè)兩種,假如定義一個LED為PA1,只需要將PA1相關(guān)參數(shù)傳入即可。

LED另外一種定義:

#define LED BIT_ADDR((GPIOA_BASE+ 12),1)

這種定義需要注意:+12,其實是ODR相對GPIOA的基地址的偏移地址。

我曾在這里遇到的坑:我將STM32F1的移植到F4上,出現(xiàn)了問題,我找了半天才發(fā)現(xiàn)由于這個偏移地址不一樣導(dǎo)致的。

STM32F1的ODR偏移是12,而F4的ODR偏移是20。所以,建議大家使用GPIOA->ODR這種方式。(不管是標(biāo)準(zhǔn)外設(shè)庫還是HAL庫都有這樣定義)。

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

    關(guān)注

    2270

    文章

    10900

    瀏覽量

    356091
  • LSB
    LSB
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    13259
  • 指針變量
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7236
收藏 人收藏

    評論

    相關(guān)推薦

    ADS1282是32ADC,在計算對紋波要求的時候,LSB按照32計算,還是按照有效位數(shù)計算?

    ADS1282是32ADC,那么在計算對紋波要求的時候,LSB按照32計算,還是按照有效位數(shù)計算(有效位數(shù)才20
    發(fā)表于 12-04 08:36

    C語言指針運算符詳解

    在C語言中,當(dāng)你有一個指向數(shù)組中某個元素的指針時,你可以對該指針執(zhí)行某些算術(shù)運算,例如加法或減法。這些運算可以用來遍歷數(shù)組中的元素,如ptr[i]等價于*(ptr + i)。然而,如果你的操作使得指針指向了數(shù)組以外的位置(除了數(shù)
    的頭像 發(fā)表于 10-30 11:16 ?255次閱讀

    C語言指針詳細(xì)解析

    的使用全局變量也能解決這個問題。 函數(shù)指針 函數(shù)指針是指指針的函數(shù),函數(shù)指針的本質(zhì)是一個
    發(fā)表于 09-14 10:03

    面試???1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針、指針函數(shù)、數(shù)組指針指針數(shù)組是一些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場景,對于提升嵌入式程序的效率和質(zhì)量至關(guān)重要。一、
    的頭像 發(fā)表于 08-10 08:11 ?863次閱讀
    面試常考+1:函數(shù)<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數(shù)、數(shù)組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數(shù)組

    DACx0004四通道16、14、121LSB INL緩沖電壓輸出數(shù)模轉(zhuǎn)換器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DACx0004四通道16、14、121LSB INL緩沖電壓輸出數(shù)模轉(zhuǎn)換器數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 07-26 09:17 ?0次下載
    DACx0004四通道16<b class='flag-5'>位</b>、14<b class='flag-5'>位</b>、12<b class='flag-5'>位</b>1<b class='flag-5'>LSB</b> INL緩沖電壓輸出數(shù)模轉(zhuǎn)換器數(shù)據(jù)表

    DACx0502雙通道16、14和12 1LSB INL電壓輸出DAC數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DACx0502雙通道16、14和12 1LSB INL電壓輸出DAC數(shù)據(jù)表.pdf》資料免費下載
    發(fā)表于 07-23 10:55 ?1次下載
    DACx0502雙通道16<b class='flag-5'>位</b>、14<b class='flag-5'>位</b>和12<b class='flag-5'>位</b> 1<b class='flag-5'>LSB</b> INL電壓輸出DAC數(shù)據(jù)表

    面試中的高頻問題:指針函數(shù)與函數(shù)指針,你能完美應(yīng)對嗎?

    的內(nèi)存分析,徹底讓大家明白指針的本質(zhì)。建議大家靜下心來再復(fù)習(xí)一遍。一、指針變量首先要明白指針是一個變量,為此寫了如下代碼來驗證之:運行后可以
    的頭像 發(fā)表于 06-22 08:11 ?1730次閱讀
    面試中的高頻問題:<b class='flag-5'>指針</b>函數(shù)與函數(shù)<b class='flag-5'>指針</b>,你能完美應(yīng)對嗎?

    指針式萬用表的使用方法

    的機械調(diào)零螺釘,使指針與零刻度線重合。歐姆調(diào)零則是在測量電阻前對電阻檔進行電氣零校準(zhǔn),通過調(diào)整歐姆檔零調(diào)節(jié)旋鈕,使指針指在歐姆標(biāo)度尺零
    的頭像 發(fā)表于 05-09 18:23 ?1864次閱讀

    STM32函數(shù)地址賦值給變量后結(jié)果會自動加1是怎么回事?

    保持為1,否則會進入故障。而常用的BX指令會導(dǎo)致T標(biāo)志清零,但如果BX REG指令中目標(biāo)地址的LSB最低有效)為1則不會清零T標(biāo)志???/div>
    發(fā)表于 04-03 06:04

    字符型、指針型等變量等該如何初始化

     對于數(shù)值類型的變量往往初始化為0,但對于其他類型的變量,如字符型、指針型等變量等該如何初始化呢?
    的頭像 發(fā)表于 03-18 11:02 ?1476次閱讀

    函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實例

    通常我們說的指針變量是指向一個整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針可以像一般函數(shù)一樣,用于調(diào)用函數(shù)、傳遞參數(shù)。
    的頭像 發(fā)表于 03-07 11:13 ?402次閱讀
    函數(shù)<b class='flag-5'>指針</b>與回調(diào)函數(shù)的應(yīng)用實例

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助你成為一名優(yōu)秀的Cer。
    發(fā)表于 03-05 14:22 ?356次閱讀
    C語言的<b class='flag-5'>指針</b>用法

    怎么理解指針指針

    怎么理解指針指針?其實這個概念并不難,只是把它放到實際應(yīng)用中,容易造成困擾。
    的頭像 發(fā)表于 02-23 16:46 ?1204次閱讀
    怎么理解<b class='flag-5'>指針</b>的<b class='flag-5'>指針</b>?

    結(jié)構(gòu)體與指針的關(guān)系

    在C語言中,結(jié)構(gòu)體(Struct)是一種用戶自定義的數(shù)據(jù)類型,它允許您將不同類型的數(shù)據(jù)項組合在一起,以便形成一個更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體可以包含多個成員變量,每個成員變量可以是不同的數(shù)據(jù)類型。而結(jié)構(gòu)
    的頭像 發(fā)表于 01-11 08:00 ?1002次閱讀
    結(jié)構(gòu)體與<b class='flag-5'>指針</b>的關(guān)系

    函數(shù)指針指針函數(shù)是不是一個東西?

    函數(shù)指針的本質(zhì)是指針,就跟整型指針、字符指針一樣,函數(shù)指針指向的是一個函數(shù)。
    的頭像 發(fā)表于 01-03 16:35 ?535次閱讀
    函數(shù)<b class='flag-5'>指針</b>和<b class='flag-5'>指針</b>函數(shù)是不是一個東西?