色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

STM32中C語言的基礎(chǔ)知識(shí)

巧學(xué)模電數(shù)電單片機(jī) ? 來源:巧學(xué)模電數(shù)電單片機(jī) ? 2023-04-27 17:42 ? 次閱讀

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

01位操作

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

746ed8f8-e48b-11ed-ab56-dac502259ad0.png
(六種位操作)

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

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

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

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

7472f06e-e48b-11ed-ab56-dac502259ad0.png

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

7479504e-e48b-11ed-ab56-dac502259ad0.png ?

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

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

SysTick->CTRL |= 1 << 1;

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

其實(shí)這是為了提高代碼的可讀性以及可重用性。這行代碼可以很直觀明了的知道,是將第1位設(shè)置為1。如果寫成:
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,其他位的值保持不變。

同樣我們也不使用按位取反,將代碼寫成:
SysTick->CTRL &= 0XFFFFFFFE;        /* 關(guān)閉SYSTICK */

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

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

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

02define宏定義


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

74823844-e48b-11ed-ab56-dac502259ad0.png ?

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

748714ea-e48b-11ed-ab56-dac502259ad0.png ?


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

03ifdef條件編譯

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

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

#ifdef 標(biāo)識(shí)符    程序段1#else    程序段2#endif
它的作用是:當(dāng)標(biāo)識(shí)符已經(jīng)被定義過(一般是用#define命令定義),則對(duì)程序段1進(jìn)行編譯,否則編譯程序段2。

其中#else部分也可以沒有,即:
  #ifdef
    程序段1
    #endif
條件編譯在HAL庫里面是用得很多,在stm32mp1xx_hal_conf.h這個(gè)頭文件中經(jīng)常會(huì)看到這樣的語句:
   #if !defined  (HSE_VALUE)      #define HSE_VALUE            24000000U    #endif


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

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

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

04extern變量申明

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

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

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

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

05typedef類型別名

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

    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庫中有很多這樣的結(jié)構(gòu)體變量需要定義。

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

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

審核編輯:湯梓紅

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

    關(guān)注

    6061

    文章

    44844

    瀏覽量

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

    關(guān)注

    31

    文章

    5405

    瀏覽量

    122975
  • STM32
    +關(guān)注

    關(guān)注

    2288

    文章

    10988

    瀏覽量

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

    關(guān)注

    180

    文章

    7628

    瀏覽量

    139982
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1249

    瀏覽量

    53399

原文標(biāo)題:沒精深C語言,竟如此不堪!

文章出處:【微信號(hào):巧學(xué)模電數(shù)電單片機(jī),微信公眾號(hào):巧學(xué)模電數(shù)電單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    STM32單片機(jī)C語言基礎(chǔ)知識(shí)

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

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

    C語言是單片機(jī)開發(fā)的必備基礎(chǔ)知識(shí),本文列舉了部分 STM32 學(xué)習(xí)中比較常見的一些C
    的頭像 發(fā)表于 02-03 01:21 ?1862次閱讀

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

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

    c語言基礎(chǔ)知識(shí)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    要學(xué)嵌入式,關(guān)注@我要學(xué)嵌入式,嵌入式猛男的加油站。C語言是單片機(jī)開發(fā)的必備基礎(chǔ)知識(shí),這里就列舉部分STM32學(xué)習(xí)中會(huì)遇見的
    發(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'>知識(shí)</b>點(diǎn),開始復(fù)習(xí)!

    單片機(jī)C語言基礎(chǔ)知識(shí)

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

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

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

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

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?8次下載
    主站蜘蛛池模板: 亚洲 日韩经典 中文字幕 | 伦理片在线线看手机版 | 国产精品视频免费观看 | 亚洲伊人精品综合在合线 | 久久日本片精品AAAAA国产 | 国产精品69人妻无码久久 | 丝瓜涩涩屋黄瓜香蕉丝瓜 | 色吧.com| xxx军人3p大gay | 亚洲免费成人 | 无码成A毛片免费 | 一个人的免费完整在线观看HD | 狠狠色丁香久久婷婷综合_中 | 亚洲狠狠97婷婷综合久久久久 | 国产精品香蕉视频在线 | 亚洲综合春色另类久久 | youjizz护士 | 精品久久综合1区2区3区激情 | 99re6久久热在线视频 | 又长又大又粗又硬3p免费视频 | 狠狠躁日日躁人人爽 | 久久精品亚洲视频 | 亚洲伊人色综合久久天天伊人 | 久久99re7在线视频精品 | 久久青草热热在线精品 | 亚洲精品无码葡京AV天堂 | 日本久久中文字幕 | 性派对xxxhd| 国产精品你懂的在线播放 | 免费看国产精品麻豆 | 日本阿v直播在线 | AV天堂午夜精品蜜臀AV | 亚洲日韩欧美国产中文在线 | 青草在线观看视频 | 精品国产成人AV在线看 | 日本亚洲中文字幕无码区 | 国产欧美一区二区三区在线看 | 亚洲乱码国产乱码精品精98 | 大地影院日本韩国电影免费观看 | 99视频这里只有精品 | 亚洲精品无码国产爽快A片百度 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品