衡阳派盒市场营销有限公司

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

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

3天內不再提示

STM32學習中比較常見的一些C語言基礎知識

硬件攻城獅 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-11-28 15:07 ? 次閱讀

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

01

位操作 下面我們先講解幾種位操作符,然后講解位操作使用技巧。C語言支持以下六種位操作: 6e655cde-6ed4-11ed-8abf-dac502259ad0.png(六種位操作) 下面,重點講解一下位操作在單片機開發中的一些實用技巧。 1.1 在不改變其他位的值的狀況下,對某幾個位進行設值。 這個場景在單片機開發中經常使用,方法就是先對需要設置的位用&操作符進行清零操作,然后用 | 操作符設值。 比如,我要改變GPIOA的狀態,可以先對寄存器的值進行&清零操作: 6e7cf6c8-6ed4-11ed-8abf-dac502259ad0.png ?然后再與需要設置的值進行|或運算: 6e907644-6ed4-11ed-8abf-dac502259ad0.png ?1.2 移位操作提高代碼的可讀性。 移位操作在單片機開發中非常重要,下面是delay_init函數的一行代碼:
SysTick->CTRL |= 1 << 1;
這個操作就是將CTRL寄存器的第1位(從0開始算起)設置為1,為什么要通過左移而不是直接設置一個固定的值呢?
其實這是為了提高代碼的可讀性以及可重用性。這行代碼可以很直觀明了的知道,是將第1位設置為1。如果寫成:
SysTick->CTRL |= 0X0002;
這個雖然也能實現同樣的效果,但是可讀性稍差,而且修改也比較麻煩。 1.3 ~按位取反操作使用技巧 按位取反在設置寄存器的時候經常被使用,常用于清除某一個/某幾個位。下面是delay_us函數的一行代碼:
SysTick->CTRL &= ~(1 << 0) ;    /* 關閉SYSTICK */
該代碼可以解讀為僅設置CTRL寄存器的第0位(最低位)為0,其他位的值保持不變。
同樣我們也不使用按位取反,將代碼寫成:
SysTick->CTRL &= 0XFFFFFFFE;        /* 關閉SYSTICK */
可見,前者的可讀性及可維護性都要比后者好很多。 1.4 ^按位異或操作使用技巧 該功能非常適合用于控制某個位翻轉,常見的應用場景就是控制LED閃爍,如下:
GPIOB->ODR ^= 1 << 5;
執行一次該代碼,就會使PB5的輸出狀態翻轉一次,如果我們的LED接在PB5上,就可以看到LED閃爍了。

02

define宏定義 define是C語言中的預處理命令,它用于宏定義(定義的是常量),可以提高源代碼的可讀性,為編程提供方便。常見的格式: 6ea22632-6ed4-11ed-8abf-dac502259ad0.png ?“標識符”為所定義的宏名。“字符串”可以是常數、表達式、格式串等。例如: 6eb1e658-6ed4-11ed-8abf-dac502259ad0.png ?定義標識符HSE_VALUE的值為8000000,數字后的U表示unsigned的意思。至于define宏定義的其他一些知識,比如宏定義帶參數,這里就不多講解了。

03

ifdef條件編譯 單片機程序開發過程中,經常會遇到一種情況,當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。
條件編譯命令最常見的形式為:
#ifdef 標識符    程序段1#else    程序段2#endif
它的作用是:當標識符已經被定義過(一般是用#define命令定義),則對程序段1進行編譯,否則編譯程序段2。 其中#else部分也可以沒有,即:
  #ifdef
    程序段1
    #endif
條件編譯在HAL庫里面是用得很多,在stm32mp1xx_hal_conf.h這個頭文件中經常會看到這樣的語句:
   #if !defined  (HSE_VALUE)
      #define HSE_VALUE            24000000U
    #endif
如果沒有定義HSE_VALUE這個宏,則定義HSE_VALUE宏,并且HSE_VALUE的值為24000000U。條件編譯也是C語言的基礎知識吧。 這里提一下,24000000U中的U表示無符號整型,常見的,UL表示無符號長整型,F表示浮點型。 這里加了U以后,系統編譯時就不進行類型檢查,直接以U的形式把值賦給某個對應的內存,如果超出定義變量的范圍,則截取。

04

extern變量申明 C語言中extern可以置于變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義。 這里面要注意,對于extern申明變量可以多次,但定義只有一次。在我們的代碼中你會看到看到這樣的語句:
extern uint16_t g_usart_rx_sta;
這個語句是申明g_usart_rx_sta變量在其他文件中已經定義了,在這里要使用到。 所以,你肯定可以找到在某個地方有變量定義的語句:
 uint16_t g_usart_rx_sta;
extern的使用比較簡單,但是也會經常用到,需要掌握。

05

typedef類型別名 typedef用于為現有類型創建一個新的名字,或稱為類型別名,用來簡化變量的定義。typedef在HAL庫用得最多的就是定義結構體的類型別名和枚舉類型了。
    struct _GPIO
    {
        __IO uint32_t CRL;
        __IO uint32_t CRH;

};
定義了一個結構體GPIO,這樣我們定義結構體變量的方式為:
struct  _GPIO  gpiox;       /* 定義結構體變量gpiox */
但這樣很繁瑣,HAL庫中有很多這樣的結構體變量需要定義。 這里我們可以為結體定義一個別名GPIO_TypeDef,這樣我們就可以在其他地方通過別名GPIO_TypeDef來定義結構體變量了,方法如下:
    typedef struct
    {
            __IO uint32_t CRL;
            __IO uint32_t CRH;

    } GPIO_TypeDef;
Typedef為結構體定義一個別名GPIO_TypeDef,這樣我們可以通過GPIO_TypeDef來定義結構體變量:GPIO_TypeDef gpiox; 這里的GPIO_TypeDef就跟struct _GPIO是等同的作用了,但是GPIO_TypeDef使用起來方便很多。
審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5363

    瀏覽量

    121192
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137727

原文標題:那些一看就會、一放就忘的C語言知識

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    新手怎么學嵌入式?

    。但面對這個復雜的領域,很多人可能會感到迷茫,不知從何處入手。別擔心,本文將為你提供一些入門學習嵌入式技術的建議。 新手入門學習嵌入式技術的途徑 1. 了解基礎知識 首先,要對嵌
    發表于 12-12 10:51

    硬件工程師需要掌握的硬件基礎知識

    作為個資深硬件工程師,我們需要掌握一些硬件基礎知識,今天總結下哪些算是基礎知識。給學電子方面想從事硬件工作的同學們
    的頭像 發表于 12-02 09:22 ?536次閱讀
    硬件工程師需要掌握的硬件<b class='flag-5'>基礎知識</b>

    一些常見的動態電路

    無論是模電還是數電,理論知識相對來說還是比較枯燥,各種電路原理理解清楚不算容易,換種生動形象的方式或許會增加一些趣味性,也更容易理解這些知識
    的頭像 發表于 11-16 09:26 ?497次閱讀
    <b class='flag-5'>一些</b><b class='flag-5'>常見</b>的動態電路

    編程語言的誤區與常見問題

    誤區:編程語言的選擇 常見問題: 初學者在選擇編程語言時,往往會被市場上的熱門語言所吸引,而忽視了自己的實際需求和興趣。
    的頭像 發表于 11-15 09:35 ?378次閱讀

    分享一些常見的電路

    理解模電和數電的電路原理對于初學者來說可能比較困難,但通過一些生動的教學方法和資源,可以有效地提高學習興趣和理解能力。 下面整理了一些常見
    的頭像 發表于 11-13 09:28 ?421次閱讀
    分享<b class='flag-5'>一些</b><b class='flag-5'>常見</b>的電路

    【《大語言模型應用指南》閱讀體驗】+ 基礎知識學習

    一些局限性。例如,模型可能無法完全理解文本中的深層含義和語境信息;同時,由于訓練數據可能存在偏差和噪聲,生成的答案也可能存在不準確或誤導性的情況。 總結以下,大語言模型通過深度學習和自然語言
    發表于 08-02 11:03

    【《大語言模型應用指南》閱讀體驗】+ 基礎篇

    今天開始學習《大語言模型應用指南》第篇——基礎篇,對于人工智能相關專業技術人員應該可以輕松加愉快的完成此篇閱讀,但對于我還是有許多的知識點、專業術語
    發表于 07-25 14:33

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?7次下載

    運算放大器和比較器的基礎知識

    電子發燒友網站提供《運算放大器和比較器的基礎知識.pdf》資料免費下載
    發表于 07-13 09:37 ?10次下載

    按照這樣學習C語言,成為卷王不是夢!

    一些學習C語言的建議,讓你在學習之路上更加游刃有余,成為C
    的頭像 發表于 07-06 08:04 ?362次閱讀
    按照這樣<b class='flag-5'>學習</b><b class='flag-5'>C</b><b class='flag-5'>語言</b>,成為卷王不是夢!

    stm32單片機學習路線

    和使用STM32的外設,包括定時器、串口、I2C、SPI等,以及各種通信協議的實現,如UART通信、I2C通信等。 3.學習高級主題:
    發表于 05-10 15:34

    如何成為名嵌入式C語言高手?

    如何成為名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是嵌入式系統開發中最常用的編程
    發表于 04-07 16:03

    細談SolidWorks教育版的一些基礎知識

    SolidWorks教育版是款廣泛應用于工程設計和教育領域的三維建模軟件。它具備直觀易用的操作界面和強大的設計功能,為學生提供了學習和實踐的平臺。在本文中,我們將詳細探討SolidWorks教育版的
    的頭像 發表于 04-01 14:35 ?394次閱讀

    如何成為名嵌入式C語言高手?

    如何成為名嵌入式C語言高手? 嵌入式系統是當今科技領域的核心,而C語言則是嵌入式系統開發中最常用的編程
    發表于 03-25 14:12

    介紹C語言中錯誤處理和異常處理的一些常用的方法和策略

    C語言種低級的、靜態的、結構化的編程語言,它沒有提供像C++或Java等高級語言中的異常處理
    的頭像 發表于 02-28 14:25 ?676次閱讀
    百家乐娱乐分析软件v4.0| 百家乐官网全自动分析软件| 棋牌真钱游戏| 豪门国际网上娱乐| 波音娱乐城送彩金| 新利国际娱乐网| 联兴棋牌| 百家乐官网筹码素材| 百家乐官网游戏公司| 冕宁县| 苏尼特左旗| 百家乐官网是哪个国家| 百家乐官网有多少网址| 百家乐官网网上投注代理商| 百家乐官网赌博娱乐城| 巴西百家乐官网的玩法技巧和规则| 免费百家乐官网过滤| 网上百家乐如何打水| 七胜百家乐赌场娱乐网规则| 大发888娱乐场下载客户端| 大发888娱乐场下载ypu| 明升国际娱乐城| 澳门百家乐官网海星王娱乐城| 百家乐官网可以破解吗| 百家乐怎么稳赚| 月亮城百家乐的玩法技巧和规则 | 东方太阳城二手房| 六合彩开奖查询| 百家乐官网娱乐城注册| 百家乐官网一起多少张牌| 百家乐视频二人雀神| 威尼斯人娱乐城总部| 网络足球投注| 视频百家乐官网赌法| 百家乐10法则| 百家乐游戏开户网址| 狮威娱乐| 百家乐官网赌场代理荐| 新澳博百家乐现金网| 百家乐都是什么人玩的| 网上百家乐是假|