RM新时代网站-首页

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

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

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

C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

大魚(yú)機(jī)器人 ? 來(lái)源:大魚(yú)機(jī)器人 ? 2023-05-31 09:07 ? 次閱讀

C語(yǔ)言是單片機(jī)開(kāi)發(fā)中的必備基礎(chǔ)知識(shí),這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)。

01

位操作 下面我們先講解幾種位操作符,然后講解位操作使用技巧。C語(yǔ)言支持如下6中位操作: 63d8da1e-ff45-11ed-90ce-dac502259ad0.png 六種位操作 下面我們想著重講解位操作在單片機(jī)開(kāi)發(fā)中的一些實(shí)用技巧。 ? 1. 1 在不改變其他位的值的狀況下,對(duì)某幾個(gè)位進(jìn)行設(shè)值。 這個(gè)場(chǎng)景在單片機(jī)開(kāi)發(fā)中經(jīng)常使用,方法就是先對(duì)需要設(shè)置的位用&操作符進(jìn)行清零操作,然后用 | 操作符設(shè)值。 比如我要改變GPIOA的狀態(tài),可以先對(duì)寄存器的值進(jìn)行&清零操作: 63ee23c4-ff45-11ed-90ce-dac502259ad0.png ? 然后再與需要設(shè)置的值進(jìn)行|或運(yùn)算: ? 640e261a-ff45-11ed-90ce-dac502259ad0.png ? 1.2 移位操作提高代碼的可讀性。 移位操作在單片機(jī)開(kāi)發(fā)中非常重要,下面是delay_init函數(shù)的一行代碼:

SysTick->CTRL |= 1 << 1;
這個(gè)操作就是將CTRL寄存器的第1位(從0開(kāi)始算起)設(shè)置為1,為什么要通過(guò)左移而不是直接設(shè)置一個(gè)固定的值呢?
其實(shí)這是為了提高代碼的可讀性以及可重用性。這行代碼可以很直觀(guān)明了的知道,是將第1位設(shè)置為1。如果寫(xiě)成:
SysTick->CTRL |= 0X0002;
這個(gè)雖然也能實(shí)現(xiàn)同樣的效果,但是可讀性稍差,而且修改也比較麻煩。 1.3 ~按位取反操作使用技巧 按位取反在設(shè)置寄存器的時(shí)候經(jīng)常被使用,常用于清除某一個(gè)/某幾個(gè)位。下面是delay_us函數(shù)的一行代碼:
SysTick->CTRL &= ~(1 << 0) ;    /* 關(guān)閉SYSTICK */
該代碼可以解讀為 僅設(shè)置CTRL寄存器的第0位(最低位)為0,其他位的值保持不變。
同樣我們也不使用按位取反,將代碼寫(xiě)成:
SysTick->CTRL &= 0XFFFFFFFE;        /* 關(guān)閉SYSTICK */
可見(jiàn)前者的可讀性,及可維護(hù)性都要比后者好很多。 1.4 ^按位異或操作使用技巧 該功能非常適合用于控制某個(gè)位翻轉(zhuǎn),常見(jiàn)的應(yīng)用場(chǎng)景就是控制LED閃爍,如:
GPIOB->ODR ^= 1 << 5;
執(zhí)行一次該代碼,就會(huì)使PB5的輸出狀態(tài)翻轉(zhuǎn)一次,如果我們的LED接在PB5上,就可以看到LED閃爍了。

02

define宏定義 define是C語(yǔ)言中的預(yù)處理命令,它用于宏定義(定義的是常量),可以提高源代碼的可讀性,為編程提供方便。常見(jiàn)的格式: 642be1f0-ff45-11ed-90ce-dac502259ad0.png “標(biāo)識(shí)符”為所定義的宏名。“字符串”可以是常數(shù)、表達(dá)式、格式串等。例如: 644328b0-ff45-11ed-90ce-dac502259ad0.png 定義標(biāo)識(shí)符HSE_VALUE的值為8000000,數(shù)字后的U表示unsigned的意思。 至于define宏定義的其他一些知識(shí),比如宏定義帶參數(shù)這里我們就不多講解。

03

ifdef條件編譯 單片機(jī)程序開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到一種情況,當(dāng)滿(mǎn)足某條件時(shí)對(duì)一組語(yǔ)句進(jìn)行編譯,而當(dāng)條件不滿(mǎn)足時(shí)則編譯另一組語(yǔ)句。 條件編譯命令最常見(jiàn)的形式為:

#ifdef 標(biāo)識(shí)符
    程序段1
#else
    程序段2
#endif
它的作用是:當(dāng)標(biāo)識(shí)符已經(jīng)被定義過(guò)(一般是用#define命令定義),則對(duì)程序段1進(jìn)行編譯,否則編譯程序段2。其中#else部分也可以沒(méi)有,即:
  #ifdef
    程序段1
    #endif
條件編譯在HAL庫(kù)里面是用得很多,在stm32mp1xx_hal_conf.h這個(gè)頭文件中經(jīng)常會(huì)看到這樣的語(yǔ)句:
   #if !defined  (HSE_VALUE)
      #define HSE_VALUE            24000000U
    #endif
如果沒(méi)有定義HSE_VALUE這個(gè)宏,則定義HSE_VALUE宏,并且HSE_VALUE的值為24000000U。條件編譯也是C語(yǔ)言的基礎(chǔ)知識(shí)吧。 這里提一下,24000000U中的U表示無(wú)符號(hào)整型,常見(jiàn)的,UL表示無(wú)符號(hào)長(zhǎng)整型,F(xiàn)表示浮點(diǎn)型。 這里加了U以后,系統(tǒng)編譯時(shí)就不進(jìn)行類(lèi)型檢查,直接以U的形式把值賦給某個(gè)對(duì)應(yīng)的內(nèi)存,如果超出定義變量的范圍,則截取。

04

extern變量申明 C語(yǔ)言中extern可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。 這里面要注意,對(duì)于extern申明變量可以多次,但定義只有一次。在我們的代碼中你會(huì)看到看到這樣的語(yǔ)句:

extern uint16_t g_usart_rx_sta;
這個(gè)語(yǔ)句是申明g_usart_rx_sta變量在其他文件中已經(jīng)定義了,在這里要使用到。 所以,你肯定可以找到在某個(gè)地方有變量定義的語(yǔ)句:
 uint16_t g_usart_rx_sta;
extern的使用比較簡(jiǎn)單,但是也會(huì)經(jīng)常用到,需要掌握。

05

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

    struct _GPIO
    {
        __IO uint32_t CRL;
        __IO uint32_t CRH;
        …
};
定義了一個(gè)結(jié)構(gòu)體GPIO,這樣我們定義結(jié)構(gòu)體變量的方式為:
struct  _GPIO  gpiox;       /* 定義結(jié)構(gòu)體變量gpiox */
但是這樣很繁瑣,HAL庫(kù)中有很多這樣的結(jié)構(gòu)體變量需要定義。這里我們可以為結(jié)體定義一個(gè)別名GPIO_TypeDef,這樣我們就可以在其他地方通過(guò)別名GPIO_TypeDef來(lái)定義結(jié)構(gòu)體變量了,方法如下:
    typedef struct
    {
            __IO uint32_t CRL;
            __IO uint32_t CRH;
            …
    } GPIO_TypeDef;
Typedef為結(jié)構(gòu)體定義一個(gè)別名GPIO_TypeDef,這樣我們可以通過(guò)GPIO_TypeDef來(lái)定義結(jié)構(gòu)體變量:GPIO_TypeDef gpiox; 這里的GPIO_TypeDef就跟struct _GPIO是等同的作用了,但是GPIO_TypeDef使用起來(lái)方便很多。
審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634614
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120228
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136683

原文標(biāo)題:STM32中常用的C語(yǔ)言知識(shí)點(diǎn),開(kāi)始復(fù)習(xí)!

文章出處:【微信號(hào):All_best_xiaolong,微信公眾號(hào):大魚(yú)機(jī)器人】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)-9條語(yǔ)句

    [table][tr][td] 學(xué)習(xí)C語(yǔ)言最基礎(chǔ)的知識(shí)點(diǎn)要數(shù)9條語(yǔ)句了,雖是基礎(chǔ)內(nèi)容,但用9條語(yǔ)句卻可以實(shí)現(xiàn)很多功能??戳讼旅娴拿織l語(yǔ)句的一一舉例后,你就會(huì)覺(jué)得其實(shí)9條語(yǔ)句很簡(jiǎn)單,也不過(guò)如此
    發(fā)表于 07-19 08:16

    STM32常用C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)有哪些

    1.位操作C語(yǔ)言支持下列6種位操作符.&:按位與.|:按位或.^ :按位異或.~:取反.:左移注:操作符不包括左小角的小點(diǎn),請(qǐng)忽略小點(diǎn)2.define 宏定義define是C語(yǔ)言種的預(yù)
    發(fā)表于 07-14 07:04

    萌新求助關(guān)于STM32常用C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

    萌新求助關(guān)于STM32常用C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)
    發(fā)表于 10-14 06:26

    關(guān)于C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)總結(jié)的太棒了

    關(guān)于C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)總結(jié)的太棒了
    發(fā)表于 10-15 07:57

    STM32編程的C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)匯總,不看肯定后悔

    STM32編程的C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)匯總,不看肯定后悔
    發(fā)表于 11-25 07:34

    淺談幾個(gè)C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

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

    嵌入式C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)匯總

    C 有32個(gè)關(guān)鍵字、9種控制語(yǔ)句、34種運(yùn)算符、8種數(shù)據(jù)類(lèi)型。一、典型代碼分析1、C語(yǔ)言中包含頭文件有兩個(gè)符號(hào)“”和,雙引號(hào)“”時(shí)編譯器首先在當(dāng)前目錄下搜索需要包含的頭文件,如果當(dāng)前目錄下無(wú)該文
    發(fā)表于 12-15 07:23

    講解位操作在單片機(jī)開(kāi)發(fā)中的一些實(shí)用技巧

    導(dǎo)讀C 語(yǔ)言是單片機(jī)開(kāi)發(fā)中的必備基礎(chǔ)知識(shí)。我們這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)
    發(fā)表于 01-24 08:18

    STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)講解

    C語(yǔ)言是單片機(jī)開(kāi)發(fā)中的必備基礎(chǔ)知識(shí),這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)。0
    發(fā)表于 02-28 07:11

    單片機(jī)開(kāi)發(fā)常用C語(yǔ)言復(fù)習(xí)資料

    文章目錄前言一、位操作二、使用步驟前言這里主要是簡(jiǎn)單的復(fù)習(xí)一下幾個(gè) C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn),引導(dǎo)那些 C 語(yǔ)言
    發(fā)表于 11-26 14:21 ?12次下載
    單片機(jī)開(kāi)發(fā)常用<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>復(fù)習(xí)資料

    嵌入式C語(yǔ)言常用知識(shí)點(diǎn)

    導(dǎo)讀C 語(yǔ)言是單片機(jī)開(kāi)發(fā)中的必備基礎(chǔ)知識(shí)。我們這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見(jiàn)的C 語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)
    發(fā)表于 11-29 17:06 ?6次下載
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>常用<b class='flag-5'>知識(shí)點(diǎn)</b>

    STM32中常用的C語(yǔ)言知識(shí)點(diǎn),開(kāi)始復(fù)習(xí)!

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

    C語(yǔ)言-語(yǔ)句(if,for,while.....)

    這篇文章作為C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn),介紹C語(yǔ)言常用的幾個(gè)語(yǔ)句的用法、規(guī)則、使用案例。
    的頭像 發(fā)表于 08-14 10:00 ?1781次閱讀

    關(guān)于C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)介紹

    不可將布爾變量直接與 TRUE、 FALSE或者 1、 0進(jìn)行比較 。據(jù)布爾類(lèi)型的語(yǔ)義,零值為“ 假”(記為 FALSE),任何非零值都是“ 真”(記為T(mén)RUE)。
    發(fā)表于 02-08 15:18 ?301次閱讀

    STM32學(xué)習(xí)中關(guān)于C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)

    這個(gè)操作就是將CTRL寄存器的第1位(從0開(kāi)始算起)設(shè)置為1,為什么要通過(guò)左移而不是直接設(shè)置一個(gè)固定的值呢?
    發(fā)表于 03-20 09:52 ?306次閱讀
    RM新时代网站-首页