如何編程Megawin微控制器-了解基礎(chǔ)知識和閃爍LED
在為項目選擇合適的微控制器時,您必須考慮成本,性能,功能,功耗和整體尺寸。當(dāng)我們考慮價格與性能或價格與功能比時,大多數(shù)外殼mcu將花費您一大筆錢。尤其是在硅短缺的時候。這就是Megawin、Nuvoton和意法半導(dǎo)體(STMicroelectronics)等制造商發(fā)揮作用的地方。Megawin的MG82系列,Nuvoton的N76/MS51系列,STM的STM8系列。雖然這兩款控制器都很棒,但流行病已經(jīng)大大增加了它們的成本,當(dāng)我們比較功能時,Megawin微控制器勝過其他兩款。
Megawin與他們有多條產(chǎn)品線。其中包括基于1T,12T/6T內(nèi)核的8051 mcu,帶或不帶USB接口,以及基于ARM Cortex_M0的微控制器。對于本教程,我們將使用8051 1T核心微控制器,具有令人印象深刻的功能列表和有吸引力的價格,即MG82F6D17微控制器。
Megawin (MG82F6D17), Nuvoton (N76E003)和ST (STM8S003)低成本微控制器之間的差異
現(xiàn)在可以說,哪個是目前市場上最好的低成本微控制器?為了找到答案,我們比較了ST微電子公司的流行低成本微控制器STM8S003和Nuvoton Technology的N76E003與Nuvoton的MG82F6D17。您可以在下表中找到低成本微控制器的功能比較。
由于我們所有的讀者都來自不同的地理區(qū)域,并且微控制器的價格波動很大,因此很難在成本方面進行比較。但無論如何,這些控制器應(yīng)該以最小的價格差異共享相同的價格水平。在印度,寫這篇文章的時候,最便宜的是MG82F6D17,價格約為5盧比。50,其次是~Rs的STM8S003。然后是N76E003,定價為95盧比。請注意,這些是零售價格,如果大量購買,價格還會更低。
Megawin MG82F6D17
Megawin MG82F6D17是一款20引腳微控制器,可用于SMD和通孔封裝。我們將在本教程中使用的是MG82F6D17A,它來自tsssop20包,如下所示。
Megawin的MG82F6D17是一款基于先進的1t8051核心的低成本微控制器。MG82F617A配備了16KB閃存(可配置AP, IAP和ISP的Flash映射),1KB數(shù)據(jù)RAM (256B + 768B XRAM), CPU頻率高達32MHz,直接內(nèi)存訪問(DMA),四個16位定時器/計數(shù)器,8個PWM通道,高達96MHz, 8通道ADC, 12位分辨率和800Ksps采樣率,2x UART, SPI, TWI RTC和更多功能。
MG82F6D17比它的競爭對手更快,功能更豐富。下表總結(jié)了這些芯片的實際比較。MG82F6D17有多種封裝,包括DIP20、TSSOP20、sssop20、QFN20以及引腳減少的SOP8封裝。在本教程中,我將使用MG82F6D17T20,這是TSSOP20包的變體,因為我已經(jīng)有庫存了。請隨意使用適合您或您感到舒適的任何變體。上圖顯示TSSOP20型。
內(nèi)置CRC16引擎,確保flash內(nèi)容的完整性。高頻PWM功能使MG82FD17成為工業(yè)應(yīng)用的更好選擇。這些不可思議的芯片目前的成本非常低,只有0.35美元,在硅短缺之前,我們已經(jīng)能夠以0.15美元的價格購買它們。
Megawin開發(fā)委員會
Megawin微控制器不需要特殊的開發(fā)板,因為在我們的研究中,MG82F6D17只需要很少的互補組件即可運行。在這里的教程中,我使用了TSSOP到DIP適配器板,因為我擁有的微控制器是TSSOP變體MG82F6D17T20。你也可以找到一個DIP版本的芯片。我使用TSSOP變體是因為我已經(jīng)有庫存了。您可以在下面的TSSP20轉(zhuǎn)DIP適配器板上找到MG82F6D17T20焊接的圖片。
以下是MG82F6D17開發(fā)板的原理圖和Gerber文件,如果您有興趣制作開發(fā)板。開發(fā)板根本不是必要的。您還可以使用微控制器和面包板。
三維視圖
如果您有興趣構(gòu)建開發(fā)板,您可以從以下鏈接下載Gerber文件:
下載Megawin開發(fā)板PCB Gerber文件
Megawin微控制器程序員
對于編程,我們有多種選擇。我們可以使用Megawin OCD ICE調(diào)試器或Megawin 8051 ISP編程器或USB到TTL轉(zhuǎn)換器。Megawin微控制器帶有工廠ISP引導(dǎo)加載程序,這將允許我們使用ISP編程器或便宜且負擔(dān)得起的USB到TTL適配器對微控制器進行編程。只要ISP代碼存在,這種編程方式就是可能的。工廠ISP代碼使用了大約1.5KB的芯片。如果你想使用這個flash區(qū)域的代碼,你所要做的就是使用一個OCD ICE適配器。或者您甚至可以為MG82F6D17編寫自己的引導(dǎo)加載程序。但是請記住,一旦您刪除了引導(dǎo)加載程序,您將需要OCD ICE對芯片進行編程,直到您重新刷新引導(dǎo)加載程序。
這是Megawin強迫癥ICE適配器的圖片。使用OCD ICE適配器,您不僅可以對微控制器進行編程,還可以一步一步地調(diào)試芯片。這將允許我們發(fā)現(xiàn)錯誤并更有效地優(yōu)化代碼
類似地,這是一個Megawin ISP程序員的圖片。在這里你可以看到,ISP程序員只有3個引腳。你可能想知道為什么。那是因為Megawin的ISP是單線協(xié)議,它只需要一個引腳來編程芯片。我們只需要OCD SDA引腳和電源引腳。這個程序員有時也被稱為Megawin ICP程序員。
讓我們看看對MG82F6D17微控制器進行編程的最便宜的選擇。如上所述,您還可以使用USB到TTL轉(zhuǎn)換器對MG82F6D17芯片進行編程。您所要做的就是將芯片的TX0連接到USB-TTL轉(zhuǎn)換器的RX,并將芯片的RX0連接到轉(zhuǎn)換器的TX引腳。有多種USB到TTL轉(zhuǎn)換板可用,它們基于流行的轉(zhuǎn)換芯片,如FTDI的FT232, Silicon Labs的CP2102, WCH的CH340系列,多產(chǎn)的PL2303等。你可以使用它們中的任何一個與Megawin MG82F6D17。在這里,我使用了一個基于FTDI的FT232RL芯片的轉(zhuǎn)換器。您可以在下面找到該特定轉(zhuǎn)換器板的圖片。
Megawin軟件
對于開發(fā)過程,您將需要以下軟件包
1. IDE和編譯器
?KeilμVision C51
2. BSP(單板支持包)
?Megawin BSP / SPL包
?MG82F6D17司機
3. ISP/ICP程序員界面
?Megawin 8051 COM端口ISP
?Megawin 8051 ISP ICP程序
?Megawin 8051 OCD ICE用于KEIL
巨型微控制器的IDE和編譯器
適當(dāng)?shù)奈臋n和軟件支持對于任何微控制器或嵌入式系統(tǒng)開發(fā)都是非常必要的。雖然許多主要的微控制器制造商提供自己的IDE /開發(fā)環(huán)境,如用于AVR和SAMD設(shè)備的Microchip studio和用于Microchip PCI系列的MPLab IDE和用于STM32系列芯片的STM32 Cube IDE等。但不幸的是,Megawin沒有自己的IDE。但這并不意味著圍繞Megawin微控制器進行開發(fā)是困難的。為此,我們將使用帶有C51編譯器的Keil μ vision IDE。此外,在Megawin OCD ICE適配器的幫助下,可以使用Keil μ vision進行OCD或片上調(diào)試。盡管KeilμVision不是免費的,但我們可以將其作為評估版本使用,而無需許可,限制很少。
由于MG82F6D17是8051器件,我們可以使用其他IDE,如代碼塊或mcu IDE。但我們選擇Keil μ Vision IDE是因為Megawin提供了BSP(板支持包)或SPL(標(biāo)準(zhǔn)外設(shè)庫)。它由示例代碼和外圍庫組成,這將使開發(fā)更容易。
主板支持包或標(biāo)準(zhǔn)外設(shè)庫
大多數(shù)制造商為開發(fā)人員提供了一組庫,使代碼開發(fā)更加容易和高效。這些庫或支持包稱為板支持包(BSP)或標(biāo)準(zhǔn)外設(shè)庫(SPL)。Megawin也為我們提供了這樣一個關(guān)懷包,可以從上面提供的鏈接下載。它包含SPLs和示例代碼,這將使理解編程結(jié)構(gòu)變得更加容易。在本教程中,我們將使用這個BSP。
ISP ISCP程序員
一旦代碼被編譯成二進制文件,我們就有多種方式將固件刻錄或加載到芯片中。一種方法是直接從Keil IDE加載它。為此,我們需要Megawin OCD ICE適配器。這種方法在調(diào)試代碼時要容易得多。我們不需要通過任何其他的忙碌來編程和調(diào)試它。
第二種方法是使用帶有Megawin ISP適配器的ISP ICP程序員UI。一旦開發(fā)完成,這種方法更適合批量編程。界面是這樣的
第三種方法是使用USB轉(zhuǎn)TTL適配器。如果你手頭沒有OCD ICE/ISP編程器,這將是一個更合適的方法。MG82FD617從工廠配備了一個ISP引導(dǎo)加載程序。這使我們能夠通過UART端口編程,而無需OCD ICE或ISP適配器。如果你不介意保留或不使用1.5KB的閃存,這是由引導(dǎo)加載程序使用的,這種方式更便宜,更容易。為此,我們將使用Megawin COM ISP Programmer。界面是這樣的
下載和安裝Megawin軟件
上面提供了下載所有必要軟件的鏈接。請下載所有的軟件包并做好準(zhǔn)備。在下一步中,我們將展示如何安裝和設(shè)置所有這些軟件。
安裝KeilμVison C51
從給定的鏈接下載Keil μ Vison安裝程序后,打開安裝文件并按照屏幕截圖所示的步驟操作
安裝Megawin芯片數(shù)據(jù)庫
要對Megawin設(shè)備進行編程,您需要在Keil上安裝一個芯片數(shù)據(jù)庫,它將把所有需要的設(shè)備定義添加到μ vision IDE中。首先從給定的鏈接下載8051_OCD_ICE_For_Keil zip文件。將其提取,打開setup.exe,并按照圖片所示的過程進行操作
安裝編程工具
編程工具可以直接運行,不需要安裝。下載文件,解壓縮并運行exe。就是這樣。不需要為OCD ICE或ISP編程器安裝任何驅(qū)動程序。對于UART編程,如果尚未安裝,請為您正在使用的USB到TTL轉(zhuǎn)換器安裝相應(yīng)的驅(qū)動程序。
第一個項目-讓我們閃爍一個LED
首先,讓我們看看如何在Keil中為MG82F6D17創(chuàng)建一個新項目。首先,為項目創(chuàng)建一個具有所需名稱的文件夾。并在此文件夾中創(chuàng)建名為Source的子文件夾。現(xiàn)在,打開MG82F6D17 Driver zip文件,并從Code\Sample\Source中提取以下文件到新創(chuàng)建的源文件夾。
現(xiàn)在打開KeilμVison IDE,從項目菜單中選擇NewμVison項目。
現(xiàn)在打開前面創(chuàng)建的文件夾并命名項目,然后單擊Save,如下所示
從列表中選擇MG82F6D17,單擊“確定”。
如果提示要復(fù)制“STARTUP”,請單擊No。A51”文件
現(xiàn)在在μvision窗口中的目標(biāo)->源組1,右鍵單擊源組1,并選擇添加新項目到組源組1
在新窗口中選擇C file,將該文件命名為Main,并選擇我們之前創(chuàng)建的Source文件夾,然后單擊Add
同樣,在項目窗口中右鍵單擊Source Group 1并選擇Add existing files to Source Group 1
從Source/Driver/Source文件夾中選擇以下文件,然后單擊add
右鍵單擊Target 1,選擇Target ‘ Target 1 ’的選項或按ALT+F7打開選項窗口
在選項中,勾選“使用片上ROM”和“使用片上XRAM”選項
轉(zhuǎn)到輸出選項卡并啟用創(chuàng)建十六進制文件選項
在C51選項卡中選擇Included paths并添加以下文件夾位置
如果您想使用OCD ICE適配器進行調(diào)試和編程,也進行以下更改并按Ok關(guān)閉窗口。
這是一個小動畫,展示了上面介紹的所有內(nèi)容。這將使程序更容易理解。
Blink示例的原理圖
在引腳P3.3上增加了一個led和限流電阻。
下面是硬件設(shè)置。我使用TSSOP到DIP適配器將其與面包板一起使用。如圖所示,LED通過一個2.2K電阻連接到引腳P3.3。
您可以按照上面給出的電路進行連接,我已經(jīng)在面包板上構(gòu)建了所有內(nèi)容,并且還將我的程序員連接到微控制器。設(shè)置如下所示。
Megawin MG82F6D17的LED閃爍程序
現(xiàn)在我們已經(jīng)完成了IDE的設(shè)置,讓我們開始編碼。看看我在下面分享的示例blink代碼
#include "MG82F6D17_CONFIG.h"
#define MCU_SYSCLK 12000000
#define MCU_CPUCLK (MCU_SYSCLK)
#define LED_Pin P33
/*************************************************
μS Delay Function
*************************************************/
void DelayXus(u8 xUs)
{
while(xUs!=0)
{
#if (MCU_CPUCLK>=11059200)
_nop_();
#endif
#if (MCU_CPUCLK>=14745600)
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=16000000)
_nop_();
#endif
#if (MCU_CPUCLK>=22118400)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=24000000)
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=29491200)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=32000000)
_nop_();
_nop_();
#endif
xUs--;
}
}
/*************************************************
mS Delay Function
*************************************************/
void DelayXms(u16 xMs)
{
while(xMs!=0)
{
DelayXus(200);
DelayXus(200);
DelayXus(200);
DelayXus(200);
DelayXus(200);
xMs--;
}
}
void main ()
{
System_Init();
while(1)
{
LED_Pin=!LED_Pin;
DelayXms(500);
}
}
讓我們討論代碼的每個部分
在頭文件部分,我們添加了#include“MG82F6D17_CONFIG.h”,它將向代碼中添加所有必要的SPLs、頭文件和所有定義。使用#define mc_sysclk 12000000,我們將時鐘頻率設(shè)置為內(nèi)部12MHz。這不是芯片要運行的頻率。這是系統(tǒng)振蕩器的頻率。我們將使用鎖相環(huán)將該時鐘提升到高達32MHz的CPU時鐘或CPU頻率。CPU頻率通過變量MCU_CPUCLK。
下面是延遲函數(shù)。延遲功能是相當(dāng)簡單的軟件為基礎(chǔ)的,不使用任何計時器。微秒延遲是使用一些_nop_()指令生成的。_nop_()的個數(shù)與CPU主頻有關(guān)。
/*************************************************
μS Delay Function
*************************************************/
void DelayXus(u8 xUs)
{
while(xUs!=0)
{
#if (MCU_CPUCLK>=11059200)
_nop_();
#endif
#if (MCU_CPUCLK>=14745600)
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=16000000)
_nop_();
#endif
#if (MCU_CPUCLK>=22118400)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=24000000)
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=29491200)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=32000000)
_nop_();
_nop_();
#endif
xUs--;
}
}
同樣,毫秒延遲函數(shù)也是基于軟件的,它只調(diào)用微秒函數(shù)幾千次。由于這些是軟件定義的延遲,因此這些函數(shù)的準(zhǔn)確性值得懷疑。我們稍后再調(diào)查。
讓我們來看看主循環(huán)。正如您所看到的,這里只有幾行代碼。這是因為我們使用的是MG82F6D17驅(qū)動程序或SPL,它為我們做了最多的工作。System_Init()函數(shù)在開始時被調(diào)用。這是在MG82F6D17驅(qū)動程序中定義的,它初始化所有所需的系統(tǒng)寄存器。然后我們移動到while(1)循環(huán)中的主循環(huán)。工作流程非常簡單。反轉(zhuǎn)引腳狀態(tài)->等待500ms ->重復(fù)步驟。就是這樣,編程不能比這更簡單了。在本教程中,我們沒有進行任何注冊表級編程。我們將在下一個例子中做這個。
現(xiàn)在讓我們編譯這個程序,看看是否有錯誤。為此,從項目菜單中單擊Build Target,或者簡單地按F7鍵。如果沒有錯誤,IDE將編譯代碼并生成HEX文件,該文件可以在項目文件夾中的Object文件夾中找到。
上傳代碼到Megawin微控制器
正如我們已經(jīng)建立的,有多種方法可以將代碼上傳到MG82F6D17。通過OCD ICE或ISP程序員或通過UART。我們將展示兩種方法,包括使用OCD ICE和UART。
使用OCD ICE適配器
首先要使用OCD ICE上傳,將微控制器的OCD引腳連接到OCD ICE適配器,如下所示
對于MG82F6D17,我們將只使用包括VDD和GND在內(nèi)的五條線。在這種情況下不使用CLK引腳。要打開程序員UI,您可以從數(shù)據(jù)庫安裝程序文件夾(EN)8051_OCD_ICE_For_Keil_v3.19.0.4.zip文件或從Keil安裝目錄(對我來說是C:\Keil_v5\C51\INC\Megawin\ ICPProgrammer.exe)直接運行ICPProgrammer.exe。選擇正確的MCU部件號
點擊“加載文件”,選擇加載AP(代碼)或IAP(數(shù)據(jù))?!凹虞d文件”可以反復(fù)點擊,加載不同的文件。在加載IAP(數(shù)據(jù))時,用戶必須輸入地址。文件加載支持HEX和BIN數(shù)據(jù)格式。
單擊“插入ISP代碼”可選擇插入megawin提供的ISP代碼或用戶自定義的ISP代碼。如果不需要ISP功能,可以省略此步驟。
H/W選項設(shè)置讓您配置ISP內(nèi)存,IAP內(nèi)存和融合位。單擊Update target上傳固件。
使用UART - USB轉(zhuǎn)TTL板
為此,將USB轉(zhuǎn)TTL轉(zhuǎn)換器連接到MCU,從給定鏈接下載Megawin Com端口ISP文件并打開exe文件。一旦打開,選擇正確的零件號和端口號。
點擊加載文件選擇十六進制文件,點擊更新目標(biāo)將固件加載到MCU。一旦你點擊更新目標(biāo)連接,刪除并重新連接VDD到芯片。它會給你一個成功的消息,表明上傳已經(jīng)完成。
這就是結(jié)果。LED以2Hz的恒定速率閃爍,即延遲500ms。使用2.2K電阻作為限流電阻來保護LED。
#include "MG82F6D17_CONFIG.h"
#define MCU_SYSCLK 12000000
#define MCU_CPUCLK (MCU_SYSCLK)
#define LED_Pin P33
/*************************************************
μS Dealy Function
*************************************************/
void DelayXus(u8 xUs)
{
while(xUs!=0)
{
#if (MCU_CPUCLK>=11059200)
_nop_();
#endif
#if (MCU_CPUCLK>=14745600)
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=16000000)
_nop_();
#endif
#if (MCU_CPUCLK>=22118400)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=24000000)
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=29491200)
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
#endif
#if (MCU_CPUCLK>=32000000)
_nop_();
_nop_();
#endif
xUs--;
}
}
/*************************************************
mS Delay Function
*************************************************/
void DelayXms(u16 xMs)
{
while(xMs!=0)
{
DelayXus(200);
DelayXus(200);
DelayXus(200);
DelayXus(200);
DelayXus(200);
xMs--;
}
}
void main ()
{
System_Init();
while(1)
{
LED_Pin=!LED_Pin;
DelayXms(500);
}
}
本文編譯自iotdesignpro