如何编程Megawin微控制器-了解基础知识和闪烁LED
扫描二维码
随时随地手机看文章
在为项目选择合适的微控制器时,您必须考虑成本,性能,功能,功耗和整体尺寸。当我们考虑价格与性能或价格与功能比时,大多数外壳mcu将花费您一大笔钱。尤其是在硅短缺的时候。这就是Megawin、Nuvoton和意法半导体(STMicroelectronics)等制造商发挥作用的地方。Megawin的MG82系列,Nuvoton的N76/MS51系列,STM的STM8系列。虽然这两款控制器都很棒,但流行病已经大大增加了它们的成本,当我们比较功能时,Megawin微控制器胜过其他两款。
Megawin与他们有多条产品线。其中包括基于1T,12T/6T内核的8051 mcu,带或不带USB接口,以及基于ARM Cortex_M0的微控制器。对于本教程,我们将使用8051 1T核心微控制器,具有令人印象深刻的功能列表和有吸引力的价格,即MG82F6D17微控制器。
Megawin (MG82F6D17), Nuvoton (N76E003)和ST (STM8S003)低成本微控制器之间的差异
现在可以说,哪个是目前市场上最好的低成本微控制器?为了找到答案,我们比较了ST微电子公司的流行低成本微控制器STM8S003和Nuvoton Technology的N76E003与Nuvoton的MG82F6D17。您可以在下表中找到低成本微控制器的功能比较。
由于我们所有的读者都来自不同的地理区域,并且微控制器的价格波动很大,因此很难在成本方面进行比较。但无论如何,这些控制器应该以最小的价格差异共享相同的价格水平。在印度,写这篇文章的时候,最便宜的是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数据RAM (256B + 768B XRAM), CPU频率高达32MHz,直接内存访问(DMA),四个16位定时器/计数器,8个PWM通道,高达96MHz, 8通道ADC, 12位分辨率和800Ksps采样率,2x UART, SPI, TWI RTC和更多功能。
MG82F6D17比它的竞争对手更快,功能更丰富。下表总结了这些芯片的实际比较。MG82F6D17有多种封装,包括DIP20、TSSOP20、sssop20、QFN20以及引脚减少的SOP8封装。在本教程中,我将使用MG82F6D17T20,这是TSSOP20包的变体,因为我已经有库存了。请随意使用适合您或您感到舒适的任何变体。上图显示TSSOP20型。
内置CRC16引擎,确保flash内容的完整性。高频PWM功能使MG82FD17成为工业应用的更好选择。这些不可思议的芯片目前的成本非常低,只有0.35美元,在硅短缺之前,我们已经能够以0.15美元的价格购买它们。
Megawin开发委员会
Megawin微控制器不需要特殊的开发板,因为在我们的研究中,MG82F6D17只需要很少的互补组件即可运行。在这里的教程中,我使用了TSSOP到DIP适配器板,因为我拥有的微控制器是TSSOP变体MG82F6D17T20。你也可以找到一个DIP版本的芯片。我使用TSSOP变体是因为我已经有库存了。您可以在下面的TSSP20转DIP适配器板上找到MG82F6D17T20焊接的图片。
以下是MG82F6D17开发板的原理图和Gerber文件,如果您有兴趣制作开发板。开发板根本不是必要的。您还可以使用微控制器和面包板。
三维视图
如果您有兴趣构建开发板,您可以从以下链接下载Gerber文件:
下载Megawin开发板PCB Gerber文件
Megawin微控制器程序员
对于编程,我们有多种选择。我们可以使用Megawin OCD ICE调试器或Megawin 8051 ISP编程器或USB到TTL转换器。Megawin微控制器带有工厂ISP引导加载程序,这将允许我们使用ISP编程器或便宜且负担得起的USB到TTL适配器对微控制器进行编程。只要ISP代码存在,这种编程方式就是可能的。工厂ISP代码使用了大约1.5KB的芯片。如果你想使用这个flash区域的代码,你所要做的就是使用一个OCD ICE适配器。或者您甚至可以为MG82F6D17编写自己的引导加载程序。但是请记住,一旦您删除了引导加载程序,您将需要OCD ICE对芯片进行编程,直到您重新刷新引导加载程序。
这是Megawin强迫症ICE适配器的图片。使用OCD ICE适配器,您不仅可以对微控制器进行编程,还可以一步一步地调试芯片。这将允许我们发现错误并更有效地优化代码
类似地,这是一个Megawin ISP程序员的图片。在这里你可以看到,ISP程序员只有3个引脚。你可能想知道为什么。那是因为Megawin的ISP是单线协议,它只需要一个引脚来编程芯片。我们只需要OCD SDA引脚和电源引脚。这个程序员有时也被称为Megawin ICP程序员。
让我们看看对MG82F6D17微控制器进行编程的最便宜的选择。如上所述,您还可以使用USB到TTL转换器对MG82F6D17芯片进行编程。您所要做的就是将芯片的TX0连接到USB-TTL转换器的RX,并将芯片的RX0连接到转换器的TX引脚。有多种USB到TTL转换板可用,它们基于流行的转换芯片,如FTDI的FT232, Silicon Labs的CP2102, WCH的CH340系列,多产的PL2303等。你可以使用它们中的任何一个与Megawin MG82F6D17。在这里,我使用了一个基于FTDI的FT232RL芯片的转换器。您可以在下面找到该特定转换器板的图片。
Megawin软件
对于开发过程,您将需要以下软件包
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和编译器
适当的文档和软件支持对于任何微控制器或嵌入式系统开发都是非常必要的。虽然许多主要的微控制器制造商提供自己的IDE /开发环境,如用于AVR和SAMD设备的Microchip studio和用于Microchip PCI系列的MPLab IDE和用于STM32系列芯片的STM32 Cube IDE等。但不幸的是,Megawin没有自己的IDE。但这并不意味着围绕Megawin微控制器进行开发是困难的。为此,我们将使用带有C51编译器的Keil μ vision IDE。此外,在Megawin OCD ICE适配器的帮助下,可以使用Keil μ vision进行OCD或片上调试。尽管KeilµVision不是免费的,但我们可以将其作为评估版本使用,而无需许可,限制很少。
由于MG82F6D17是8051器件,我们可以使用其他IDE,如代码块或mcu IDE。但我们选择Keil μ Vision IDE是因为Megawin提供了BSP(板支持包)或SPL(标准外设库)。它由示例代码和外围库组成,这将使开发更容易。
主板支持包或标准外设库
大多数制造商为开发人员提供了一组库,使代码开发更加容易和高效。这些库或支持包称为板支持包(BSP)或标准外设库(SPL)。Megawin也为我们提供了这样一个关怀包,可以从上面提供的链接下载。它包含SPLs和示例代码,这将使理解编程结构变得更加容易。在本教程中,我们将使用这个BSP。
ISP ISCP程序员
一旦代码被编译成二进制文件,我们就有多种方式将固件刻录或加载到芯片中。一种方法是直接从Keil IDE加载它。为此,我们需要Megawin OCD ICE适配器。这种方法在调试代码时要容易得多。我们不需要通过任何其他的忙碌来编程和调试它。
第二种方法是使用带有Megawin ISP适配器的ISP ICP程序员UI。一旦开发完成,这种方法更适合批量编程。界面是这样的
第三种方法是使用USB转TTL适配器。如果你手头没有OCD ICE/ISP编程器,这将是一个更合适的方法。MG82FD617从工厂配备了一个ISP引导加载程序。这使我们能够通过UART端口编程,而无需OCD ICE或ISP适配器。如果你不介意保留或不使用1.5KB的闪存,这是由引导加载程序使用的,这种方式更便宜,更容易。为此,我们将使用Megawin COM ISP Programmer。界面是这样的
下载和安装Megawin软件
上面提供了下载所有必要软件的链接。请下载所有的软件包并做好准备。在下一步中,我们将展示如何安装和设置所有这些软件。
安装KeilµVison C51
从给定的链接下载Keil μ Vison安装程序后,打开安装文件并按照屏幕截图所示的步骤操作
安装Megawin芯片数据库
要对Megawin设备进行编程,您需要在Keil上安装一个芯片数据库,它将把所有需要的设备定义添加到μ vision IDE中。首先从给定的链接下载8051_OCD_ICE_For_Keil zip文件。将其提取,打开setup.exe,并按照图片所示的过程进行操作
安装编程工具
编程工具可以直接运行,不需要安装。下载文件,解压缩并运行exe。就是这样。不需要为OCD ICE或ISP编程器安装任何驱动程序。对于UART编程,如果尚未安装,请为您正在使用的USB到TTL转换器安装相应的驱动程序。
第一个项目-让我们闪烁一个LED
首先,让我们看看如何在Keil中为MG82F6D17创建一个新项目。首先,为项目创建一个具有所需名称的文件夹。并在此文件夹中创建名为Source的子文件夹。现在,打开MG82F6D17 Driver zip文件,并从Code\Sample\Source中提取以下文件到新创建的源文件夹。
现在打开KeilµVison IDE,从项目菜单中选择NewµVison项目。
现在打开前面创建的文件夹并命名项目,然后单击Save,如下所示
从列表中选择MG82F6D17,单击“确定”。
如果提示要复制“STARTUP”,请单击No。A51”文件
现在在µvision窗口中的目标->源组1,右键单击源组1,并选择添加新项目到组源组1
在新窗口中选择C file,将该文件命名为Main,并选择我们之前创建的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”选项
转到输出选项卡并启用创建十六进制文件选项
在C51选项卡中选择Included paths并添加以下文件夹位置
如果您想使用OCD ICE适配器进行调试和编程,也进行以下更改并按Ok关闭窗口。
这是一个小动画,展示了上面介绍的所有内容。这将使程序更容易理解。
Blink示例的原理图
在引脚P3.3上增加了一个led和限流电阻。
下面是硬件设置。我使用TSSOP到DIP适配器将其与面包板一起使用。如图所示,LED通过一个2.2K电阻连接到引脚P3.3。
您可以按照上面给出的电路进行连接,我已经在面包板上构建了所有内容,并且还将我的程序员连接到微控制器。设置如下所示。
Megawin MG82F6D17的LED闪烁程序
现在我们已经完成了IDE的设置,让我们开始编码。看看我在下面分享的示例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,我们将时钟频率设置为内部12MHz。这不是芯片要运行的频率。这是系统振荡器的频率。我们将使用锁相环将该时钟提升到高达32MHz的CPU时钟或CPU频率。CPU频率通过变量MCU_CPUCLK。
下面是延迟函数。延迟功能是相当简单的软件为基础的,不使用任何计时器。微秒延迟是使用一些_nop_()指令生成的。_nop_()的个数与CPU主频有关。
/*************************************************
µ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--;
}
}
同样,毫秒延迟函数也是基于软件的,它只调用微秒函数几千次。由于这些是软件定义的延迟,因此这些函数的准确性值得怀疑。我们稍后再调查。
让我们来看看主循环。正如您所看到的,这里只有几行代码。这是因为我们使用的是MG82F6D17驱动程序或SPL,它为我们做了最多的工作。System_Init()函数在开始时被调用。这是在MG82F6D17驱动程序中定义的,它初始化所有所需的系统寄存器。然后我们移动到while(1)循环中的主循环。工作流程非常简单。反转引脚状态->等待500ms ->重复步骤。就是这样,编程不能比这更简单了。在本教程中,我们没有进行任何注册表级编程。我们将在下一个例子中做这个。
现在让我们编译这个程序,看看是否有错误。为此,从项目菜单中单击Build Target,或者简单地按F7键。如果没有错误,IDE将编译代码并生成HEX文件,该文件可以在项目文件夹中的Object文件夹中找到。
上传代码到Megawin微控制器
正如我们已经建立的,有多种方法可以将代码上传到MG82F6D17。通过OCD ICE或ISP程序员或通过UART。我们将展示两种方法,包括使用OCD ICE和UART。
使用OCD ICE适配器
首先要使用OCD ICE上传,将微控制器的OCD引脚连接到OCD ICE适配器,如下所示
对于MG82F6D17,我们将只使用包括VDD和GND在内的五条线。在这种情况下不使用CLK引脚。要打开程序员UI,您可以从数据库安装程序文件夹(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(数据)。“加载文件”可以反复点击,加载不同的文件。在加载IAP(数据)时,用户必须输入地址。文件加载支持HEX和BIN数据格式。
单击“插入ISP代码”可选择插入megawin提供的ISP代码或用户自定义的ISP代码。如果不需要ISP功能,可以省略此步骤。
H/W选项设置让您配置ISP内存,IAP内存和融合位。单击Update target上传固件。
使用UART - USB转TTL板
为此,将USB转TTL转换器连接到MCU,从给定链接下载Megawin Com端口ISP文件并打开exe文件。一旦打开,选择正确的零件号和端口号。
点击加载文件选择十六进制文件,点击更新目标将固件加载到MCU。一旦你点击更新目标连接,删除并重新连接VDD到芯片。它会给你一个成功的消息,表明上传已经完成。
这就是结果。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