加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1、為什么很少用C++開發(fā)單片機(jī)
    • 2、準(zhǔn)備工作
    • 3、使用說明
    • 4、定義LED類
    • 5、流水燈實(shí)現(xiàn)(main函數(shù))
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于Keil、STM32,用C++編寫流水燈程序

2021/04/23
706
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

通常來說,在單片機(jī)上編程,要么匯編,要么C語言,而用C++進(jìn)行開發(fā)的很少,那么究竟能不能用C++開發(fā)單片機(jī)呢?

答案是肯定可以的,下面講講基于Keil、STM32,用C++編寫流水燈程序的一些內(nèi)容。

1、為什么很少用C++開發(fā)單片機(jī)

不知道大家對(duì)面向過程和面向?qū)ο蟮睦斫庥卸嗌伲?/p>

C語言面向過程的語言,C++是面向?qū)ο蟮木幊陶Z言。結(jié)合本文來說,面向過程相比面向?qū)ο蟮木幊?,代碼量更小,運(yùn)行效率更高。

所以,C語言相比C++具有更小代碼量、更快的運(yùn)行速度。

當(dāng)然,這里是C相對(duì)C++而言。其實(shí),匯編相對(duì)C而言,具有更小代碼量和更快的運(yùn)行速度。可以參看文章:用 匯編 和 C語言 寫流水燈程序有什么不一樣?

因?yàn)閱纹瑱C(jī)的RAM和Flash資源相比較小,運(yùn)行速度也相對(duì)較低,所以,你會(huì)發(fā)現(xiàn):很少有人在單片機(jī)上面用C++開發(fā)項(xiàng)目。

其實(shí),隨著單片機(jī)的存儲(chǔ)資源以及運(yùn)行速度的增加,目前有些工程師開始用C++開發(fā)單片機(jī)項(xiàng)目了。

2、準(zhǔn)備工作

在Keil MDK開發(fā)環(huán)境下,用C語言開發(fā)STM32比較常見了,什么開發(fā)環(huán)境安裝、創(chuàng)建工程等這些步驟,本文不講述,請(qǐng)參看我文章:

Keil系列教程01_Keil介紹、下載、安裝與注冊(cè)Keil系列教程02_新建基礎(chǔ)軟件工程

這是Keil的基礎(chǔ)教程,有不懂的同學(xué),可以在我公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“Keil系列教程”閱讀Keil更多的使用方法。

然后就是需要懂一些C++的基礎(chǔ)語法,本文講述的內(nèi)容比較基礎(chǔ),用到C++很基礎(chǔ)的知識(shí)。比如:類、對(duì)象這些基礎(chǔ)內(nèi)容。

沒學(xué)過C++也沒關(guān)系,只要懂C語言,在網(wǎng)上現(xiàn)學(xué)C++基礎(chǔ)知識(shí),難度都不大。

3、使用說明

在Keil MDK環(huán)境下,使用的是ARM編譯器Arm Compiler),很多網(wǎng)上教程使用V6編譯,其實(shí)V5和V6版本都是支持C++編程語言的。

在工程中添加C++源代碼(比如:main.cpp)

使用V5和V6,工程配置的選項(xiàng)有些差異:

ST的開發(fā)庫都已經(jīng)做了支持,你會(huì)看到這么一段代碼:

#ifdef __cplusplus extern "C" {#endif
//這里C源代碼
#ifdef __cplusplus}#endif

什么意思呢?

這是一段預(yù)處理,從預(yù)處理代碼可以看得出來,大概意思就是:支持C和C++混合編程。

4、定義LED類

在本文默認(rèn)大家掌握了用C語言開發(fā)STM32流水燈的知識(shí),直接描述C++代碼內(nèi)容。

本文講述一個(gè)很基礎(chǔ)的例子"LED燈",比如創(chuàng)建一個(gè)main.cpp源代碼文件。

首先,定義一個(gè)LED類:

class LED_Class{}

然后定義私有成員(當(dāng)然,public也可以):

class LED_Class{private:  GPIO_TypeDef *GPIOx;  uint16_t GPIO_Pin;  uint32_t RCC_APB2Periph;}

再次就是用到的函數(shù):初始化GPIO、打開、關(guān)閉LED等。

class LED_Class{private:  GPIO_TypeDef *GPIOx;  uint16_t GPIO_Pin;  uint32_t RCC_APB2Periph;
public:  LED_Class(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin, uint32_t RCC_APB2Periph){    LED_Class::GPIOx = GPIOx;    LED_Class::GPIO_Pin = GPIO_Pin;    LED_Class::RCC_APB2Periph = RCC_APB2Periph;  }
  void Init(void){      GPIO_InitTypeDef GPIO_InitStruct;
      GPIO_InitStruct.GPIO_Pin   = GPIO_Pin;      GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;      GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;      GPIO_Init(GPIOx, &GPIO_InitStruct);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);  }
  void Open(void){    GPIO_SetBits(GPIOx, GPIO_Pin);  }
  void Close(void){    GPIO_ResetBits(GPIOx, GPIO_Pin);  }};

這個(gè)代碼是不是很簡(jiǎn)單,即使你不會(huì)C++,只要懂C語言,相信都能看懂。

5、流水燈實(shí)現(xiàn)(main函數(shù))

用C++的思路和C語言類似,先初始化,然后再實(shí)現(xiàn):

int main(void){  LED_Class LED1(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);  LED_Class LED2(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);
  LED1.Init();  LED2.Init();
  while(1)  {    LED1.Open();    LED2.Open();    Delay(10);
    LED1.Close();    LED2.Close();    Delay(10);  }}

還有一種初始化:

int main(void){  LED_Class *LED1 = new LED_Class(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);  LED_Class *LED2 = new LED_Class(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);
  LED1->Init();  LED2->Init();
  while(1)  {    LED1->Open();    LED2->Open();    Delay(50);
    LED1->Close();    LED2->Close();    Delay(50);  }}

編譯出來的代碼量相對(duì)更大:

然后,如果有開發(fā)板,直接下載即可運(yùn)行LED閃爍的現(xiàn)象。

是不是很簡(jiǎn)單,看到這里,你學(xué)廢了嗎?

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級(jí)嵌入式軟件工程師,業(yè)余維護(hù)公眾號(hào)『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。