通常來說,在單片機上編程,要么匯編,要么C語言,而用C++進行開發的很少,那么究竟能不能用C++開發單片機呢? 答案是肯定可以的,下面講講基于Keil、STM32,用C++編寫流水燈程序的一些內容。
1為什么很少用C++開發單片機
不知道大家對面向過程和面向對象的理解有多少?
C語言面向過程的語言,C++是面向對象的編程語言。結合本文來說,面向過程相比面向對象的編程,代碼量更小,運行效率更高。
所以,C語言相比C++具有更小代碼量、更快的運行速度。
當然,這里是C相對C++而言。其實,匯編相對C而言,具有更小代碼量和更快的運行速度。可以參看文章:用 匯編 和 C語言 寫流水燈程序有什么不一樣?
因為單片機的RAM和Flash資源相比較小,運行速度也相對較低,所以,你會發現:很少有人在單片機上面用C++開發項目。
其實,隨著單片機的存儲資源以及運行速度的增加,目前有些工程師開始用C++開發單片機項目了。
2準備工作
在Keil MDK開發環境下,用C語言開發STM32比較常見了,什么開發環境安裝、創建工程等這些步驟,本文不講述
然后就是需要懂一些C++的基礎語法,本文講述的內容比較基礎,用到C++很基礎的知識。比如:類、對象這些基礎內容。
沒學過C++也沒關系,只要懂C語言,在網上現學C++基礎知識,難度都不大。
3使用說明
在KeilMDK環境下,使用的是ARM編譯器(Arm Compiler),很多網上教程使用V6編譯,其實V5和V6版本都是支持C++編程語言的。
在工程中添加C++源代碼(比如:main.cpp)
使用V5和V6,工程配置的選項有些差異:
ST的開發庫都已經做了支持,你會看到這么一段代碼:
#ifdef __cplusplus extern "C" {#endif
//這里C源代碼 #ifdef __cplusplus}#endif
什么意思呢?
這是一段預處理,從預處理代碼可以看得出來,大概意思就是:支持C和C++混合編程。
4定義LED類
在本文默認大家掌握了用C語言開發STM32流水燈的知識,直接描述C++代碼內容。
本文講述一個很基礎的例子"LED燈",比如創建一個main.cpp源代碼文件。
首先,定義一個LED類:
class LED_Class{}
然后定義私有成員(當然,public也可以):
class LED_Class{private: GPIO_TypeDef *GPIOx; uint16_t GPIO_Pin; uint32_t RCC_APB2Periph;}
再次就是用到的函數:初始化GPIO、打開、關閉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); }};這個代碼是不是很簡單,即使你不會C++,只要懂C語言,相信都能看懂。
5流水燈實現(main函數)
用C++的思路和C語言類似,先初始化,然后再實現:
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); }}
編譯出來的代碼量相對更大:
然后,如果有開發板,直接下載即可運行LED閃爍的現象。
是不是很簡單,看到這里,你學廢了嗎?
編輯:jq
-
C語言
+關注
關注
180文章
7614瀏覽量
137410 -
C++
+關注
關注
22文章
2114瀏覽量
73785 -
源代碼
+關注
關注
96文章
2946瀏覽量
66849
原文標題:基于Keil、STM32,用C++編寫流水燈程序
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論