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

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

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

STM32中較為常見的C語言基礎(chǔ)知識

哈哈hfgfdf ? 來源:嵌入式學習資料 ? 作者:嵌入式學習資料 ? 2023-02-03 01:21 ? 次閱讀

C語言是單片機開發(fā)中的必備基礎(chǔ)知識,本文列舉了部分 STM32 學習中比較常見的一些C語言基礎(chǔ)知識。

1位操作

下面我們先講解幾種位操作符,然后講解位操作使用技巧。C語言支持以下六種位操作:

fc50364a-a31d-11ed-92c9-dac502259ad0.png

下面,重點講解一下位操作在單片機開發(fā)中的一些實用技巧。

在不改變其他位的值的狀況下,對某幾個位進行設(shè)值

這個場景在單片機開發(fā)中經(jīng)常使用,方法就是我們先對需要設(shè)置的位用&操作符進行清零操作,然后用 | 操作符設(shè)值。

比如,我要改變 GPIOA 的狀態(tài),可以先對寄存器的值進行&清零操作:

GPIOA->CRL&=0xFFFFFF0F;/*將第4~7位清零*/

然后再與需要設(shè)置的值進行 | 或運算:

GPIOA->CRL¥=0xFFFFFF0F;/*設(shè)置相應(yīng)位的值(4),不改變其他位的值*/

移位操作提高代碼的可讀性

移位操作在單片機開發(fā)中非常重要,下面是delay_init函數(shù)的一行代碼:

SysTick->CTRL|=1<

這個操作就是將CTRL寄存器的第 1 位(從 0 開始算起)設(shè)置為 1,為什么要通過左移而不是直接設(shè)置一個固定的值呢?

其實這是為了提高代碼的可讀性以及可重用性。這行代碼可以很直觀明了的知道,是將第1位設(shè)置為1。如果寫成:

SysTick->CTRL|=0X0002;

這個雖然也能實現(xiàn)同樣的效果,但是可讀性稍差,而且修改也比較麻煩。

~按位取反操作使用技巧

按位取反在設(shè)置寄存器的時候經(jīng)常被使用,常用于清除某一個/某幾個位。下面是delay_us函數(shù)的一行代碼:

SysTick->CTRL&=~(1<

該代碼可以解讀為:僅設(shè)置CTRL寄存器的第 0 位(最低位)為 0,其他位的值保持不變。

同樣我們也不使用按位取反,將代碼寫成:

SysTick->CTRL&=0XFFFFFFFE;/*關(guān)閉SYSTICK*/

可見,前者的可讀性及可維護性都要比后者好很多。

^按位異或操作使用技巧

該功能非常適合用于控制某個位翻轉(zhuǎn),常見的應(yīng)用場景就是控制 LED 閃爍,如下:

GPIOB->ODR^=1<

執(zhí)行一次該代碼,就會使PB5的輸出狀態(tài)翻轉(zhuǎn)一次,如果我們的 LED 接在 PB5 上,就可以看到 LED 閃爍了。

2define宏定義

define 是 C 語言中的預處理命令,它用于宏定義(定義的是常量),可以提高源代碼的可讀性,為編程提供方便。常見的格式:

#define標識符字符串

“標識符”為所定義的宏名?!白址笨梢允浅?shù)、表達式、格式串等。例如:

#defineHSE_VALUE8000000U

定義標識符HSE_VALUE的值為 8000000,數(shù)字后的U表示unsigned的意思。至于define宏定義的其他一些知識,比如宏定義帶參數(shù),這里就不多講解了。

3ifdef條件編譯

單片機程序開發(fā)過程中,經(jīng)常會遇到一種情況,當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。

條件編譯命令最常見的形式為:

#ifdef標識符

程序段1

#else

程序段2#endif

它的作用是:當標識符已經(jīng)被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。

其中#else部分也可以沒有,即:

#ifdef

程序段1

#endif

條件編譯在 HAL 庫里面是用得很多,在stm32mp1xx_hal_conf.h這個頭文件中經(jīng)常會看到這樣的語句:

#if!defined(HSE_VALUE)

#defineHSE_VALUE24000000U

#endif

如果沒有定義HSE_VALUE這個宏,則定義HSE_VALUE宏,并且HSE_VALUE的值為 24000000U。條件編譯也是 C 語言的基礎(chǔ)知識吧。

這里提一下,24000000U 中的 U 表示無符號整型,常見的,UL 表示無符號長整型,F(xiàn) 表示浮點型。

這里加了 U 以后,系統(tǒng)編譯時就不進行類型檢查,直接以 U 的形式把值賦給某個對應(yīng)的內(nèi)存,如果超出定義變量的范圍,則截取。

4extern變量聲明

C語言中extern可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。

這里面要注意,對于extern申明變量可以多次,但定義只有一次。在我們的代碼中你會看到看到這樣的語句:

externuint16_tg_usart_rx_sta;

這個語句是聲明g_usart_rx_sta變量在其他文件中已經(jīng)定義了,在這里要使用到。

所以,你肯定可以找到在某個地方有變量定義的語句:

uint16_tg_usart_rx_sta;

extern的使用比較簡單,但是也會經(jīng)常用到,需要掌握。

5typedef類型別名

typedef用于為現(xiàn)有類型創(chuàng)建一個新的名字,或稱為類型別名,用來簡化變量的定義。typedef在 HAL 庫用得最多的就是定義結(jié)構(gòu)體的類型別名和枚舉類型了。

struct_GPIO
{
__IOuint32_tCRL;
__IOuint32_tCRH;
…
};

定義了一個結(jié)構(gòu)體GPIO,這樣我們定義結(jié)構(gòu)體變量的方式為:

struct_GPIOgpiox;/*定義結(jié)構(gòu)體變量gpiox*/

但這樣很繁瑣,HAL庫中有很多這樣的結(jié)構(gòu)體變量需要定義。

這里我們可以為結(jié)構(gòu)體定義一個別名GPIO_TypeDef,這樣我們就可以在其他地方通過別名GPIO_TypeDef來定義結(jié)構(gòu)體變量了,方法如下:

typedefstruct
{
__IOuint32_tCRL;
__IOuint32_tCRH;
…
}GPIO_TypeDef;

Typedef為結(jié)構(gòu)體定義一個別名GPIO_TypeDef,這樣我們可以通過GPIO_TypeDef來定義結(jié)構(gòu)體變量:

GPIO_TypeDefgpiox;

這里的GPIO_TypeDef就跟struct _GPIO是等同的作用了,但是GPIO_TypeDef使用起來方便很多。

審核編輯黃宇

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

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628297
  • STM32
    +關(guān)注

    關(guān)注

    2257

    文章

    10828

    瀏覽量

    352433
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134022
  • HAL
    HAL
    +關(guān)注

    關(guān)注

    2

    文章

    69

    瀏覽量

    12541
收藏 人收藏

    評論

    相關(guān)推薦

    C語言基礎(chǔ)知識科普

    C語言是單片機開發(fā)的必備基礎(chǔ)知識,本文列舉了部分STM32學習中比較常見的一些
    發(fā)表于 07-21 10:58 ?1815次閱讀

    STM32單片機C語言基礎(chǔ)知識

    C語言是單片機開發(fā)的必備基礎(chǔ)知識,本文列舉了部分STM32學習中比較常見的一些
    發(fā)表于 09-21 17:21 ?4435次閱讀

    C語言基礎(chǔ)知識(5)--循環(huán)語句

    C語言基礎(chǔ)知識(5)--循環(huán)語句
    的頭像 發(fā)表于 06-15 10:18 ?1775次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>基礎(chǔ)知識</b>(5)--循環(huán)語句

    c語言基礎(chǔ)知識

    c語言基礎(chǔ)知識
    發(fā)表于 08-17 17:03

    關(guān)于C語言基礎(chǔ)知識

    一、C語言基礎(chǔ)知識關(guān)于C語言C語言相對于匯編是屬于高
    發(fā)表于 08-20 07:03

    淺談幾個C語言基礎(chǔ)知識

    文章目錄前言一、位操作二、使用步驟前言這里主要是簡單的復習一下幾個 C 語言基礎(chǔ)知識點,引導那些 C 語言
    發(fā)表于 12-09 07:14

    STM32學習中會遇見的C語言基礎(chǔ)知識點講解

    C語言是單片機開發(fā)的必備基礎(chǔ)知識,這里就列舉部分STM32學習中會遇見的C
    發(fā)表于 02-28 07:11

    C++語言基礎(chǔ)知識講解

    C++語言基礎(chǔ)知識講解,喜歡的朋友可以下載來學習。
    發(fā)表于 01-14 15:30 ?21次下載

    適合C語言小白看的基礎(chǔ)知識梳理總結(jié)

    C語言是當代人學習及生活的必備基礎(chǔ)知識,應(yīng)用十分廣泛,下面為大家?guī)?b class='flag-5'>C語言
    的頭像 發(fā)表于 01-04 11:07 ?4638次閱讀

    C語言基礎(chǔ)知識講解

    C語言基礎(chǔ)知識講解
    發(fā)表于 05-19 17:39 ?13次下載

    STM32常用的C語言知識點,開始復習!

    要學嵌入式,關(guān)注@我要學嵌入式,嵌入式猛男的加油站。C語言是單片機開發(fā)的必備基礎(chǔ)知識,這里就列舉部分STM32學習中會遇見的
    發(fā)表于 01-13 15:37 ?10次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>中</b>常用的<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>知識</b>點,開始復習!

    單片機C語言基礎(chǔ)知識

    單片機C語言基礎(chǔ)知識
    發(fā)表于 10-08 09:30 ?7次下載

    STM32C語言基礎(chǔ)知識

    C語言是單片機開發(fā)的必備基礎(chǔ)知識,本文列舉了部分STM32學習中比較常見的一些
    的頭像 發(fā)表于 04-27 17:42 ?1209次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>中</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>基礎(chǔ)知識</b>

    C語言基礎(chǔ)知識

    C語言是單片機開發(fā)的必備基礎(chǔ)知識,這里就列舉部分STM32學習中會遇見的C
    的頭像 發(fā)表于 05-31 09:07 ?830次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>基礎(chǔ)知識</b>點

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費下載
    發(fā)表于 07-19 10:58 ?6次下載