<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          那些一看就會、一放就忘的C語言知識

          共 715字,需瀏覽 2分鐘

           ·

          2022-02-11 08:04

          C語言是單片機開發(fā)中的必備基礎(chǔ)知識,本文列舉了部分STM32學(xué)習(xí)中比較常見的一些C語言基礎(chǔ)知識,希望能對大家有所幫助。


          01?



          位操作

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

          (六種位操作)

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

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

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

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


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


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

          移位操作在單片機開發(fā)中非常重要,下面是delay_init函數(shù)的一行代碼:
          SysTick->CTRL |= 1 << 1;
          這個操作就是將CTRL寄存器的第1位(從0開始算起)設(shè)置為1,為什么要通過左移而不是直接設(shè)置一個固定的值呢?

          其實這是為了提高代碼的可讀性以及可重用性。這行代碼可以很直觀明了的知道,是將第1位設(shè)置為1。如果寫成:
          SysTick->CTRL |= 0X0002;
          這個雖然也能實現(xiàn)同樣的效果,但是可讀性稍差,而且修改也比較麻煩。

          1.3 ~按位取反操作使用技巧

          按位取反在設(shè)置寄存器的時候經(jīng)常被使用,常用于清除某一個/某幾個位。下面是delay_us函數(shù)的一行代碼:
          SysTick->CTRL &= ~(1 << 0) ; /* 關(guān)閉SYSTICK */
          該代碼可以解讀為僅設(shè)置CTRL寄存器的第0位(最低位)為0,其他位的值保持不變。

          同樣我們也不使用按位取反,將代碼寫成:
          SysTick->CTRL &= 0XFFFFFFFE; /* 關(guān)閉SYSTICK */
          可見,前者的可讀性及可維護性都要比后者好很多。

          1.4 ^按位異或操作使用技巧

          該功能非常適合用于控制某個位翻轉(zhuǎn),常見的應(yīng)用場景就是控制LED閃爍,如下:
          GPIOB->ODR ^= 1 << 5;
          執(zhí)行一次該代碼,就會使PB5的輸出狀態(tài)翻轉(zhuǎn)一次,如果我們的LED接在PB5上,就可以看到LED閃爍了。

          02



          define宏定義

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


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


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

          03



          ifdef條件編譯

          單片機程序開發(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) #define HSE_VALUE 24000000U #endif
          如果沒有定義HSE_VALUE這個宏,則定義HSE_VALUE宏,并且HSE_VALUE的值為24000000U。條件編譯也是C語言的基礎(chǔ)知識吧。

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

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



          04



          extern變量申明

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

          這里面要注意,對于extern申明變量可以多次,但定義只有一次。在我們的代碼中你會看到看到這樣的語句:
          extern uint16_t g_usart_rx_sta;
          這個語句是申明g_usart_rx_sta變量在其他文件中已經(jīng)定義了,在這里要使用到。

          所以,你肯定可以找到在某個地方有變量定義的語句:
          uint16_t g_usart_rx_sta;
          extern的使用比較簡單,但是也會經(jīng)常用到,需要掌握。

          05



          typedef類型別名

          typedef用于為現(xiàn)有類型創(chuàng)建一個新的名字,或稱為類型別名,用來簡化變量的定義。typedef在HAL庫用得最多的就是定義結(jié)構(gòu)體的類型別名和枚舉類型了。
          struct _GPIO { __IO uint32_t CRL; __IO uint32_t CRH;????};
          定義了一個結(jié)構(gòu)體GPIO,這樣我們定義結(jié)構(gòu)體變量的方式為:
          struct _GPIO gpiox; /* 定義結(jié)構(gòu)體變量gpiox */
          但這樣很繁瑣,HAL庫中有很多這樣的結(jié)構(gòu)體變量需要定義。

          這里我們可以為結(jié)體定義一個別名GPIO_TypeDef,這樣我們就可以在其他地方通過別名GPIO_TypeDef來定義結(jié)構(gòu)體變量了,方法如下:
          typedef struct { __IO uint32_t CRL; __IO uint32_t CRH; } GPIO_TypeDef;
          Typedef為結(jié)構(gòu)體定義一個別名GPIO_TypeDef,這樣我們可以通過GPIO_TypeDef來定義結(jié)構(gòu)體變量:GPIO_TypeDef gpiox;

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

          來源:玩轉(zhuǎn)嵌入式

          版權(quán)申明:內(nèi)容來源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無法確認,都會標明作者及出處,如有侵權(quán),煩請告知,我們會立即刪除并致歉


          瀏覽 66
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  风韵十足的良家美少妇酒店偷情 | 中文字幕亚洲视频在线 | 午夜日B网 | 影音先锋成人在线观看 | 成人网站在线免费 |