通常來說,在單片機(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ū)ο蟮木幊蹋纱a量(bin文件)更小,運(yùn)行效率更高。
所以,C語言相比C++具有更小代碼量(bin文件)、更快的運(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點(diǎn)燈”,用C++編程實(shí)現(xiàn)的方法很多,這里將其中一個(gè)基礎(chǔ)的方法。
首先,創(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;
RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE); 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); }
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)象。
說明:
使用C++寫單片機(jī)流水燈程序,實(shí)現(xiàn)的方法有很多,比如還有一些更高級(jí)的繼承、多態(tài)等用法,也可以引入進(jìn)來。以上只是提供一種思路,引導(dǎo)初學(xué)者學(xué)習(xí)C++編程。
是不是很簡(jiǎn)單,看到這里,你學(xué)廢了嗎?
原文標(biāo)題:基于Keil、STM32,用C++編寫流水燈程序
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44621瀏覽量
638570 -
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73858
原文標(biāo)題:基于Keil、STM32,用C++編寫流水燈程序
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Spire.XLS for C++組件說明
![Spire.XLS for <b class='flag-5'>C++</b>組件說明](https://file1.elecfans.com/web3/M00/05/E7/wKgZO2eFwUuAbuoQAAAbn_khf8A091.png)
EE-134:為SHARC系列編寫C兼容匯編代碼中斷處理程序
![EE-134:為SHARC系列<b class='flag-5'>編寫</b><b class='flag-5'>C</b>兼容匯編代碼中斷處理<b class='flag-5'>程序</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
【正點(diǎn)原子STM32H7R3開發(fā)套件試用體驗(yàn)】流水燈
低成本單片機(jī)方案——觸摸流水燈開關(guān)控制
![低成本單片機(jī)方案——觸摸<b class='flag-5'>流水燈</b>開關(guān)控制](https://file.elecfans.com/web2/M00/69/1A/poYBAGMikU-AHHhnAABM2NhiFxo132.png)
【RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用】MDK+點(diǎn)燈+流水燈
基于51單片機(jī)的跑馬燈/流水燈系統(tǒng)
![基于51單片機(jī)的跑馬燈/<b class='flag-5'>流水燈</b>系統(tǒng)](https://file1.elecfans.com//web1/M00/F3/4F/wKgZoWcVBsaAeloYAAgQbzGtTdY204.png)
使用OpenVINO GenAI API在C++中構(gòu)建AI應(yīng)用程序
![使用OpenVINO GenAI API在<b class='flag-5'>C++</b>中構(gòu)建AI應(yīng)用<b class='flag-5'>程序</b>](https://file1.elecfans.com/web2/M00/09/51/wKgZomcJ0ziAd_APAAATE9KW7lE007.png)
keil可以讀出單片機(jī)的程序嗎
keil軟件怎么運(yùn)行寫好的程序
怎樣將keil中的程序導(dǎo)出
keil實(shí)用技巧
![<b class='flag-5'>keil</b>實(shí)用技巧](https://file1.elecfans.com/web2/M00/02/F1/wKgaoma5syyAYzztAAA5LSZZo34694.png)
單片機(jī)POV LED流水燈制作
keil用c++編譯含有rtos模塊時(shí)的錯(cuò)誤問題怎么解決?
51單片機(jī)流水燈制作
![51單片機(jī)<b class='flag-5'>流水燈</b>制作](https://file1.elecfans.com/web2/M00/C1/E3/wKgaomXb8VyASKTsAACFYv8Crn0012.png)
評(píng)論