敏矽微电子

相关文章:

敏矽微电子Cortex-M0学习笔记01——芯片简介

敏矽微电子Cortex-M0学习笔记02——Cortex-M0开发环境的建立及调试

敏矽微电子Cortex-M0学习笔记03——时钟系统设计例程

敏矽微电子Cortex-M0学习笔记04——GPIO详解及应用实例

1、目的

本篇学习笔记我们主要来了解ME32F030的中断系统,首先通过对ME32F030终端系统和中断控制存器进行学习,最后通过实际的GPIO端口中断实例掌握中断函数的编程实现来加深掌握ME32F030中断系统的编程方法。

2、ME32F030中断概述

中断是单片机系统重要的组成部分,使单片机能够快速的对事件请求做出响应。ME32F030靠内部的嵌套向量中断控制器(NVIC)来进行中断的调度,它是 Cortex™-M0 内核的一部分。它可以让 CPU 以最短的时间对中断作出反应。主要的特征有:

• 较短的中断响应延迟.

• 处理系统异常和外设中断.

• 支持 32 个中断向量.

• 四种可编程的中断响应优先级别.

• 产生软件中断.

• 可配置的不可屏蔽中断源会有详细的说明。

3、ME32F030嵌套向量中断控制器(NVIC)

嵌套向量中断控制器(NVIC)负责着整个MCU的中断管理,除了管理我们常用的外设中断源,还包括非屏蔽中断源的管理。具体管理的中断源及其中断序号,其实在CMSDK_CM0.h中定义好了,通过程序定义对具体管理的中断源一目了然,定义的内容如下图所示。

1.png

中断源

ME32F030的中断系统是由一系列的NVIC寄存器组成的,这些寄存器可用于中断 IRQ0~IRQ31, 包括中断使能,等待和优先级等操作。如果中断被允许,并且相应中断挂起被设置,NVIC 将会根据中断优先级触发中断。反之,中断被禁止,中断源只会改变中断挂起状态,而 NVIC 不会对中断源信号采取任何动作,不论任何中断优先级。具体的NVIC寄存器组如表格所示:

2.png

NVIC寄存器列表

2-1 中断允许寄存器

中断允许寄存器(ISER)用于使能中断设置,同时可返回当前允许中断设置。需要注意的是,对该寄存器写0是无效的,是不能禁止中断的。要禁止中断,就需要下面介绍的中断禁止寄存器。

2-2 中断禁止寄存器

有使能中断的设置,相应的就会有禁止中断设置,这就是中断禁止寄存器的作用。对寄存器进行写1操作,就可以禁止中断设置。。需要注意的是,对该寄存器写0是无效的。对寄存器进行读操作,同返回当前禁止中断设置。

2-3 中断挂起寄存器

当有中断事件发生时,中断挂起寄存器(ISPR)中对应的中断位就会置位 。此时读取寄存器就可以判断具体的中断源。同时我们也可以向寄存器的中断位写1,来强制中断进入挂起状态。

2-4 清除中断挂起寄存器

当MCU响应了中断请求,并且执行完对应的中断子程序后,MCU便会返回断点处继续运行。但在返回前需要通过清除中断挂起寄存器(ICPR),来清除对应的中断挂起,这样当次的中断流程算是完整结束。

2-5 中断优先级寄存器

如同我们做事情有轻重缓急之分,单片机对中断的处理也有“轻重缓急”。具体就是靠8组中断优先级寄存器IPR0~7来实现。每组寄存器对应4个中断源的优先级。这样刚好决定了中断0~中断31的优先级。

每一组的中断优先级寄存器IPRn的每个字节最高两位决定优先级,因此有0~3共4个优先级可以选择,越低的值表示优先级越高,当优先级更高的中断发生时,高优先级的中断会打断低优先级中断。如果是同优先级中断,则并不会打断当前中断,而是依次响应中断。中断优先级寄存器IPRn如图所示:

3.png

这里介绍个快速的方法来计算中断 M 的 IPR 寄存器号:

• 计算对应的 IPR 寄存器号, N, N = M / 4

• 计算 IPR 寄存器内的字节偏移量 M % 4, 其中:

– 字节偏移量 0 对应寄存器的位 7:0

– 字节偏移量 1 对应寄存器的位 15:8

– 字节偏移量 2 对应寄存器的位 23:16

– 字节偏移量 3 对应寄存器的位 31:24

4、ME32F030端口中断例程

本篇中我们首先讲解了ME32F030的GPIO中断系统,然后又介绍了嵌套向量中断控制器(NVIC)的原理。

最后,我们还是要通过具体的实例来把我们学到的理论知识应用到实际的例子中。我们将两者结合起来做个小实验,测试程序的代码如下:

    unsigned int uiCnt = 0;//端口反转次数

int main(void)
{
	PA->DIR_b.DIR0 = 1;       //PA_0 设置为输出口

	PA->IS_b.ISENSE0 = 0;    //PA_0 设置为沿触发

	PA->IBE_b.IBE0 = 1;       //PA_0 上升沿和下降沿都触发中断

	PA->IC_b.CLR0 =1 ;        //PA_0 中断标志位清除

	PA->IE_b.MASK0 = 1;      //PA_0 中断使能
 
	PB->DIR_b.DIR9=1;        //PB_9 设置为输出口

NVIC_EnableIRQ(PA_IRQn); //使能PA_IRQ中断

lcd_init();                 //LCD液晶初始化
 
while (1)
{

	uiCnt++;               //端口反转次数加1

	PA->NOT_b.NOT0=1;    //PA_0 输出取反

	SYS_DelaymS(500);

	if(uiCnt == 20)           //当反转20次时
		{
			PA->IE_b.MASK0 = 0;  //PA_0 中断关闭
		}
  }
}

//PA_IRQ中断子程序
void PA_IRQHandler(void)  
{
PB->NOT_b.NOT9=1;    //PB_9(LED灯)输出取反

  PA->IC_b.CLR0 =1 ;     //清除PA_0中断位

//LCD显示中断发生的次数
  LCD->MEMMAP1 = lcd[uiCnt/10] | (lcd[uiCnt%10]<<16);
}

测试程序是通过PA_0端口输出反转,来产生下降沿和上升沿。但同时它的端口中断功能是被使能的,因此可以通过输出电平来“触发”自己的中断。在中断服务子程序中,LED小灯端口输出取反来进行点亮和熄灭,同时加入了LCD段码液晶来显示中断发生的次数。在程序全速运行的过程中,当端口输出反转20次之后,会关闭端口的中断功能。接下来下载并仿真例程来进行说明。

程序下载并仿真后,先在程序这两处打上断点。然后用快捷键F5全速运行,程序首先会运行到第78行处的断点,这时端口还没有进行输出反转。接下来用快捷键F10单步运行观察。

4.png

仿真1

F10单步运行后,发现程序已经跳转到了PA_IRQ中断服务子程序中,继续F10单步运行并观察执行每一步的现象,直到把中断服务子程序走完。

5.png

仿真2

中断服务子程序内的代码全部运行后的效果如图所示,首先LED小灯的端口输出取反,把LED小灯给点亮后(下次再进中断会输出取反熄灭,依次往复)。LCD段码液晶显示01,这说明发生了1次中断。

6.png

仿真结果

通过单步仿真我们清楚了中断发生后的处理流程,接下来就可以把之前打的两个断点取消掉,然后在83行的位置打上一个断点,随后F5全速运行程序,等待程序停到断点处。在等待的过程中,LED小灯保持闪烁,LCD段码液晶上的数字一直在自加。当程序停到断点处后,LCD段码液晶显示为20。继续单步运行后,端口PA_0的中断功能就被关闭了。

7.png

仿真3

关闭中断后,再次全速运行程序。我们发现小灯不再闪烁了,段码液晶显示的数字也不再自加。这是因为我们已经把端口中断关闭掉了,虽然uiCnt还在自加。但是已经进不了中断子程序去更新显示。因此依旧停留显示在20。我们不妨把uiCnt添加到Watch窗口中来看一下,添加方法如图所示。双击ucCnt变量名,选中后右键选择“Add uiCnt to”,“Watch 1”,这样就添加到Watch1窗口中了。

8.png

仿真4

通过Watch1窗口看到端口已经反转37次了,但LCD液晶已经停留在20。这也说明中断确实被关闭了,因此液晶一直没能更新显示。

9.png

仿真5

10.png

仿真结果2

来源:敏矽MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 12

相关文章:

敏矽微电子Cortex-M0学习笔记01——芯片简介

敏矽微电子Cortex-M0学习笔记02——Cortex-M0开发环境的建立及调试

1.1. ME32F030R8T6的时钟树

时钟是MCU运行的基础,时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而MCU有了时钟,才能够运行执行指令,才能够做准确、稳定的进行一系列的操作 (例如:串口通信、PWM信号、ADC采样等等),因此时钟的重要性不言而喻。

ME32F030系列 具有非常灵活的时钟控制系统。用户可根据不同应用需求来配置时钟,从而取得最高的性能及优化的能耗管理。下图为 ME32F030R8T6 的时钟系统概要图:

1.png

从图中可以看出,MCU的时钟源有内部高速的IRC_OSC 和 低速的 WDT_OSC 时钟可供选择。

IRC_OSC:它属于高速时钟,可以由内部晶体振荡器控制寄存器(IRCCTRL)配置为 40/48MHz的主频, 缺省值是40MHz 频率,由工厂出厂预设并由引导程序写入。一般作为系统主时钟的时钟源。

WDT_OSC:它属于低速时钟,由看门狗振荡器控制寄存器控制。振荡器包含模拟和数字两部分。振荡器的模拟部分用于产生模拟时钟(Fclkana)。在振荡器数字部分,模拟时钟(Fclkana)输出一个32KHz 频率时钟。然后再被DIVSEL 控制的分频器分频输出到 WDT_CLK,作为看门狗时钟源。

看门狗振荡器输出频率可用下列公式推算:

WDT_CLK = Fclkana/(4 ×DIVSEL) = 8K Hz ~ 250 Hz (标称值)

1.2. ME32F030R8T6时钟源的应用控制

介绍完系统的时钟源,接下来说说时钟源主要运用到了哪些方面。

ME32F030R8T6的外设非常多,但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费。并且,同一个电路,时钟越快功耗越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题。

WDT_CLK:由看门狗振荡器控制寄存器来选择输入时钟,作为看门狗的工作时钟。

2.png

MAIN_CLK:由MAINCLK_SEL选择输入时钟源,上电默认选择IRC_OSC_CLK作为时钟源,也可以通过置位来选择WDT_OSC_CLK。

3.png

SYSTEM_CLK:由MAINCLK通过AHB 接口时钟分频器寄存器(SYSAHBCLKDIV)分频而来,默认不分频。SYSTEM_CLK时钟供内核、外设和存储器使用。其中外设通过 AHB 接口时钟控制寄存器(SYSAHBCLKCTRL)来控制外设的时钟使能,上电默认外设的时钟都是打开的。

4.png

UART:UART0/1有自己独立的时钟分频器从MAIN_CLK分频后取得UART时钟。

5.png

CLK_OUT:MCU的内部晶振器(IRC_OSC_CLK)、看门狗振荡器(WDT_OSC_CLK),主时钟(MAIN_CLK),系统时钟(SYSTEM_CLK)都可以通过CLK_OUT作为输出时钟。

使用前需要通过 CLKOUT 输出时钟源选择寄存器 (CLKOUTCLKSEL)来确定想要输出的时钟源,再经过 CLKOUT 输出时钟分频器寄存器 (CLKOUTDIV)分频后输出,该寄存器初始值默认为0,即不输出时钟。需要输出的话,设置好分频系数(1-255)便可以输出了。

6.png

7.png

2、ME32F030R8T6的时钟系统函数简介

为了便于开发者快速上手,敏矽微电子为开发者提供了丰富的库函数和开发例程。

借助于库函数,可以不用像普通单片机那样去配置繁多的寄存器,从而加快开发进程。

借助于例程中,可以更深入理解寄存器配置及功能实现。

本例中,我们就借助于敏矽微电子提供的例程来简单介绍它的时钟系统的跨函数。在sys.c文件中,包含了切换系统时钟,配置时钟主频等函数,供开发者直接使用。

1.3. 主频配置函数

①、配置IRC_CLK为40M主频

void SYS_IRCTrimto40M(void){volatile uint32_t i=0xFFFF;if (DIA->IRCTRIM!=0xFFFFFFFF)

{

SYSCON->IRCCTRL=DIA->IRCTRIM;  while(i--==0);

FMC->FLASH_RDCYC =1;

SYSCON->SYSAHBCLKDIV =1;

SystemCoreClockUpdate ();

}return ;

}

②、配置IRC_CLK为48M主频

void SYS_IRCTrimto48M(void){volatile uint32_t i=0xFFFF;if (DIA->IRCTRIM48!=0xFFFFFFFF)

{

SYSCON->IRCCTRL=DIA->IRCTRIM48;while(i--==0);

FMC->FLASH_RDCYC =1;


SYSCON->SYSAHBCLKDIV =1; //core clock to 48M

SystemCoreClockUpdate ();

}

return ;

}

1.4. 时钟源选择函数

③、选择MAIN_CLK的时钟源,可以选择IRC_CLK 或者 WATCHDOG_CLK。

void SYS_SelectMainClkSrc(uint8_t src)


{

 //switch main clk source

 SYSCON->MAINCLKUEN_b.ENA= 1; //disable main clk update

 //switch main clk source to Specifyed source

 if (src==IRC_CLK)
 
 SYSCON->MAINCLKSEL_b.SEL=0;else if (src==WATCHDOG_CLK)

  SYSCON->MAINCLKSEL_b.SEL=2;

 
  SYSCON->MAINCLKUEN_b.ENA=0; //enable main clk update

 SystemCoreClockUpdate ();

 return;

}

④、设置AHB 接口时钟分频器的分频系数,在这里请注意,函数如果检查到当前时钟为IR_CLK且分频系数小于2,这样系统时钟SYSTEM_CLK的主频肯定大于30M, 而FLASH的擦写速度最高支持到30MHz。此时CPU时钟超过Flash的最大读取速度,这就需要插入延迟时钟,延迟时钟由 RDCYC 寄存器控制。

void SYS_SetAHBClkDivider (uint8_t div)

{

 //setup flash access speed if SystemCoreClock is going tomore than 30MHz 

 if ((SYSCON->MAINCLKSEL_b.SEL==0)&&(div<2))  

 FMC->FLASH_RDCYC = 1;                
  
  SYSCON->SYSAHBCLKDIV_b.DIV = div;  //setup ahb clock divider

 SystemCoreClockUpdate ();   //update MainClock and SystemCoreClock

 return;
}

//⑤、设置WDT_CLK的时钟源,可以选择IRC_CLK 或者 WATCHDOG_CLK。

    void SYS_SelectWDTClkSrc(uint8_t src){if (src==IRC_CLK)



    SYSCON->WDTOSCCTRL_b.WDTCLKSRC = 0;

    else if (src==WATCHDOG_CLK)

    SYSCON->WDTOSCCTRL_b.WDTCLKSRC = 1;

 return;

}

//⑥、设置CLK_OUT的时钟源,可以选择IRC_CLK 、SYS_CLK、 WATCHDOG_CLK、MAIN_CLK中的一个。

void SYS_SelectClkOutSrc(uint8_t src)

{switch (src)


{

case IRC_CLK:

src=0;break;case SYS_CLK:

src=1;break;case WATCHDOG_CLK:

src=2;break;case MAIN_CLK:

src=3;break;

 default:return;

    }

    //switch clock

    SYSCON->CLKOUTUEN_b.ENA = 1;

    SYSCON->CLKOUTCLKSEL_b.SEL = src; //select clk out source

    SYSCON->CLKOUTUEN_b.ENA = 0;

     return;

}

//⑦、设置CLK_OUT时钟的输出分频系数。

void SYS_SetClkOutDivider(uint8_t div)

{

SYSCON->CLKOUTDIV_b.DIV = div;

return;}

3、ME32F030R8T6时钟系统例程

上面介绍了sys.c中关于系统时钟的部分函数,下面我们来编写一个关于时钟配置的例程。使大家能够对时钟配置有一个简单的了解。

本例实现的功能是:将AHB 接口时钟进行2分频,IRC时钟切换到48M主频,最后将系统时钟进行分频输出。

int main(void)

{

 SYS_SetAHBClkDivider (2);     // AHB 接口时钟进行2分频

 SYS_IRCTrimto48M(); // IRC时钟切换到48M主频

 SYS_SelectClkOutSrc(SYS_CLK); // 选择SYS_CLK作为OUT_CLK输出时钟 

 SYS_SetClkOutDivider(10); // 对OUT_CLK时钟进行10分频

 SYS_EnableClkOut(); // 使能OUT_CLK输出端口

}

来源:敏矽MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16

相关文章:敏矽微电子Cortex-M0学习笔记01——芯片简介

本篇先简单介绍MDK的安装流程,然后重点说明如何把敏矽微电的Cortex-M0的PACK包添加到mdk中,这样才能顺利的在MDK环境下开发敏矽微电子Cortex-M0新片。最后用了很大篇幅介绍如何建立工程,工程中各种文件的添加等等。

1、敏矽微电子Cortex-M0的开发环境

敏矽微电子Cortex-M0是基于ARM内核的,所以基于ARM的开发环境都可以用来开发敏矽微电子Cortex-M0的芯片。最常见的两种ARM开发平台是MDK和IAR。我们今天着重介绍MDK环境下如何建立基于敏矽微电子Cortex-M0芯片的项目,以及如何在MDK环境下调试敏矽微电子Cortex-M0芯片。

需要说明的是:MDK软件是需要注册的,强烈建议大家使用正版软件。不过在刚开始学习以及资金有限的情况下,可以使用MDK的评估版本,评估版本的程序容量是32K版本。这个程序容量对于初学来说,是足够用的。

闲话少说,马上开始我们今天的学习之旅。

2、MDK安装

1、首先打开Keil安装包(资料链接中附有MDK 5.28版本安装包),打开后如图1.1所示。

1.png

图1

2、随后点击“Next”,进入后续的安装流程,勾选红圈选项后,点击“Next”下一步。随后会提示MDK的安装路径,强烈建议采用默认路径。如果要自定义安装路径,请保证自定义的安装路径中不要出现任何中文名字!点击“Next”下一步后,输入下姓名、公司、邮箱等信息,随意填写下即可,继续点击“Next”便开始正式安装。期间软件会自动安装仿真器驱动,耐心等待即可。

2.png

3、等到最后出现下面的界面,软件便已安装成功。

3.png

3、MDK注册

1、启动Keil 5,在File选项中选择License Management子选项。

4.png

2、按照提示进行注册即可,请按照官方正版途径注册。

3、如果点击Add LIC提示以下的错误信息,看红色下划线的信息,得知是因为没有在管理员模式下操作,权限不足导致的。这个是Windows管理员模式产生的问题。如果你的注册过程没有此错误提示,可以跳过第7步。解决的办法也很简单,按照步骤4操作即可。

5.png

4、以管理员模式运行Keil 5,鼠标右键Keil 图标,点击“以管理员身份运行”即可。随后重新按照步骤5操作即可。管理员运行方法如图所示:

6.png

5、软件注册完成后,出现“LIC Added Sucessfully”的提示,说明注册成功。

4、安装ME32F030 PACK包

1、KEIL安装完成后,就需要安装芯片支持的PACK包,来让KEIL支持我们的芯片,这里建议安装资料提供的Keil 5版本,因为其对应的PACK包是傻瓜式一键安装,操作十分的方便,找到我们的PACK包双击安装即可。

7.png

2、PACK包安装完成后,我们可以先确认下,看下KEIL是否已经识别并支持我们的芯片,方法如下,首先创建个新工程,选择project->New uVision Project来建立工程。

8.png

3、新建工程时会提示选择芯片类型,从图中看出KEIL已经支持我们的Mesilicon系列芯片。

9.png

5、新建工程

1、选择project->New uVision Project来建立工程。

 10.png

2、选择芯片类型,选择开发板的芯片为Mesilicon->ME32F030 Series->ME32F030C8x6,选择好后,点击“OK”。

11.png

3、出现下面的界面,这个是根据需求自己添加开发组件,不多介绍,直接点取消跳过。

12.png

4、接下来将资料中的Lib2.3 for keil5x例程解压缩出来,其中公用的.c和.h等文件都在common文件夹内,随后开始向工程中添加.c和.h文件。点击如图所示的快捷按钮。

13.png


5、弹出如下界面,在Groups右边有4个按钮,依次为“新建”、“删除”、“上移”、“下移”功能,先选择新建comm、app两个组,你也可以尝试下删除组,把初始自带的Source Group通过红叉按钮删除掉。

14.png

向每个Group中添加.程序c文件。那就先举个简单的例子作为开始,首先我们选中需要添加程序的组,比如我们向app组里添加需要的main.c文件,选中app组后,点击右侧的Files框体下的Add Files,选中要添加的main.c文件。点击Add便完成添加。

15.png

添加成功后的效果如下图所示,右侧的Files中已包含main.c文件,那么想要删除的话,可以在选中文件后,通过点击上方的红叉进行删除。

16.png

依次类推,我们接下来要向comm中添加.c文件。

①、添加core_cm0.c,这个就是我们的单片机的M0内核文件,它在

Lib2.3 for keil 5->common->CoreSupport文件夹中。

17.png

②、添加system_CMSDK.c,它在Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk文件夹中。

18.png

③、添加startup_CMSDK_CM0.s文件,这个是启动程序文件,它是由汇编语言写成的。是以.s为结尾的文件,所以在添加它的时候需要注意将文件类型选择为All Files才能看见它。

Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk->Startup->arm文件夹中。

19.png

20.png

④、前面添加都属于单片机的系统文件,接下来就要开始添加我们自己的.c文件了,这个都在Lib2.3 for keil 5->common->Drivers->Source文件夹内。

21.png

⑤、第一次新建工程时可以参照现有的例程,比如以Demo-Touch Me按键触摸试验为模板,尝试建立一下工程。添加自己所需要的文件,如图所示:

22.png

6、添加完成后,关闭Manage Project Items功能栏。返回KEIL主界面后,在左侧的Project工程栏里,可以看到之前添加的所有程序文件。

23.png

7、接下来我们是不是可以编译程序了呢?那不妨先试一下。编译后发现提示很多此类的报错,提示 cannot open source input file "gpio.h": No such file or directory,这是因为我们只添加了.c文件,而需要的头文件路径还没有指定位置。那么接下来就指定头文件路径。

24.png

点击红圈标注的Options快捷按钮,也可以通过快捷键ALT + F7来打开。

25.png

打开后选中C/C++选项卡,在下面可以看到Include Paths栏,这个就是需要指定的头文件路径,点击右边的 。。。按钮来进行添加。

26.png

点击。。。按钮后,通过弹出的对话框来添加头文件路径。同上文讲到的一样,红圈的四个按钮依次为“新建”、“删除”、“上移”、“下移”功能。

27.png

那就新建路径吧,点击新建后会生成一个新的路径框,点击红圈标识的。。。来添加。

28.png

以core_cm0.c文件对应的头文件core_cm0.h为例子,一路进到上文中添加core_cm0.c的文件夹中,进入如图所示的路径后,点击选择文件夹。

29.png

添加完成后,刚才新添加的路径便显示出来了。

30.png

依次类推,再添加以下3个路径。

Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk

Lib2.3 for keil 5->common->Drivers->Include

Lib2.3 for keil 5->Demo-Touch Me->myapp->include

这里添加的时候要注意,是要选择.h文件所在的那个文件夹,错选成它的上级或下级文件夹,是无法找到需要的头文件的!添加完成后的效果如下。

31.png

这时候我们再去编译一下试试。没有报错也没有警告,说明项目工程顺利建立。

32.png

6、下载与调试

1、程序编译没问题后,接下来就可以下载程序并仿真测试了。在开始前先插上仿真器并连接开发板,打开Options for Target选项卡,选中Debug。这个时候选择仿真器类型(根据实际进行选择,建议买一个U-LINK2仿真器),勾选上Run to main,这样程序下载后直接运行到main函数,否则会先运行startup_CMSDK_M0.s中Reset_Handler程序。虽然这段程序最后也会跳转到我们的main函数,但我们没有必要每次去仿真它。点击Settings查看我们的仿真器配置情况。

33.png

点击Settings后,在Debug子选项中看到下面的信息。则说明仿真器识别正常。

34.png

再点击查看下Flash Download的选项。这时候看到ME20F030单片机的FLash的下载地址和RAM空间地址都已经明确了,这就是为什么前面强烈推荐安装KEIL 5版本,随后打上PACK包,很多设置项都是PACK包整合配置好的,我们直接用就可以了。

35.png

2、仿真选项设置好之后,开始下载程序。点击工具栏上的

 36.png

图标来下载并仿真程序。

 37.png

图标所示的功能也可以下载程序,但是它是不带仿真功能的,这点需要注意!下载成功后会多出下面的工具条。

 38.png

下面我们分别来介绍一下这些仿真调试按钮的功能:

1:复位,点击后程序会从头开始重新运行。

2:全速运行,点击后程序便开始全速运行,运行到断点处会停止,或者使用停着功能。

3:停止,当程序在运行状态下,使用此功能,程序便会停止运行。

4:执行进去,本质是单步运行,如果下一步是要执行的是个函数,那么就行进入到函数 里面,进行单步仿真。

5:段执行,也是单步运行,但不同的是,如果下一步是要执行的是个函数,那么会直接运行整个函数,并不会进入函数内部运行,它是直接以一整段代码为单位进行执行的。

6:执行跳去,当不需要再继续在某个函数里继续单步仿真时,执行此功能,就会直接执行完函数内剩余的代码,随后跳出该函数后会暂停,等待下一步操作。

7:执行到光标处,使用此功能前,先确定想运行到地方,鼠标单击运行的那一行,此时光标便会在这一行显示,这时候再点击此按钮,程序会全速运行,直到在光标处停止。

8:全速运行,此功能是让程序全速运行,除非认为暂停或者遇到断点,否则程序会一直运行。

来源:敏矽MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 22

1.敏矽微电子Cortex-M0学习手记01-芯片简介

1.1. 概述

ME32F030R8T6 的出现为嵌入式的开发带来了极大地便利,ME32F030R8T6 是一款内嵌 ARM Cortex™ M0 核的 32 位微控制器。64Kflash、8K的RAM可以容纳更多的代码,工程师们可以尽情的丰富与完善产品的功能。对于硬件工程师来说,芯片管脚的复用极大的便利了PCB的排版,工程师可以根据走线的需要选择最优的管脚。ME32F030R8T6 管脚功能由 IO 控制寄存器IOCON配置,除电源管脚,其余管脚均可复用。系统复位后,管脚功能将被设置成默认值。

工程师可以通过IOCON寄存器来配置引脚的功能,引脚功能丰富,极大地方便了工程开发。

1.png

1.2. 基本功能

ME32F030R8T6 是一款内嵌 ARM Cortex™ M0 核的 32 位微控制器。

这款控制器具备我们经常使用的一些功能,像检测电压需要用到的ADC,ME32F030R8T6 有多达12个通道的ADC,12位ADC转换,1MHz的转换速率,检测速度与精度相比一般的单片机有了大大的提高。

2.png

存储器分配图

还有常用的UART串口该控制器具备有常用外设和功能,如高速 12 位的 ADC 转换器,UART 串口,SPI 接口,I2C 总线接口,看门狗定时器(WDT),7 个通用计数器/定时器。除此之外,ME32F030R8T6还集成人机界面控制器和马达控制功能,如 LCD 驱动,电容触摸按键,直流无刷电机控制 PWM 模块。

1.3. 应用场景

ME32F030R8T6 适用于家电、厨电、其他消费电子、工业类等场合

3.jpg

来源: 敏矽MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 13

1、概述

ME32x系列是内嵌ARM Cortex™ M0/M3核的32位微控制器。该系列控制器由敏矽微电子有限公司自主开发,并具有自主知识产权。敏矽微电子的微控制器包括有通用MCU和专用SOC系列,具有非常高的性价比,是MCU产品升级换代和国外产品替代的最佳选择。通用功能有高精度ADC,CAN接口,I2S音频接口,UART串口,SPI接口,I2C总线接口,看门狗定时器(WDT),通用计数器/定时器。特殊接口包括人机界面控制器(LCD驱动,电容触摸按键)和马达控制功能模块。

EEPROM作为比较廉价和方便数据存储器,被广泛使用并且习惯思维。而MCU Flash与EEPROM相比,除使用方法略有差异外,作为数据存储器,所起的效果是一样的。

2、MCU Flash与EEPROM使用比较

擦除

擦除时间

编程

编程时间

硬件接口

擦写寿命

MCU Flash

扇区为单位擦除,擦除后数据为0xFF

5ms

32位word 编程

7us

通过寄存器接口设置编程,读Flash通过指针直接读

10万次

EEPROM

没有单独擦除功能

-

Byte编程

-

I2C接口

100万次

3、使用MCU Flash 存储数据举例

以ME32S003系列为例,下面说明如何使用MCU Flash 存储小量的数据(注意,本例重点在探讨实现的一个思路,程序调试请用户自行解决)。

ME32S003系列有32K Flash,我们拿出1K, 即两个扇区来存储数据,在这里约定一个数据存储单元为64 Bytes(包括标志)。

两个扇区有16个存储单元,换句话说,可以存储10万x 16 =160 次数据,远远超过EEPROM的寿命。

所有需要存储数据放在一个数据结构中,方便存储和提取数据:

#defineDATA_AREA_ADDRESS 62*512 //数据扇区起始地址
#defineDATA_AREA_SIZE 2*512 //两个扇区大小
#defineDATA_UINT_SIZE 64 //每一个存储单元大小,一定要整除扇区大小(512)
#defineDATA_UINT_FLAG 0x5555AAAA
typedef struct {
uint32_t flag;
uint32_t data1;
…
} data_uint_type;
voidflash_erase(uint32_t startaddr, uint32_t size)
{
uint32_t endaddr;
endaddr=startaddr+size;
     //erase sector
     while(startaddr<endaddr)
     {
              FMC->ADDR = startaddr; // setup addr
              FMC->CMD = 0x04; //Triggerprogramming
              while ((FMC->CMD &0x100)!=0);
              startaddr+=512;
     }
return;  
}
uint8_t flash_word_program(uint32_taddr, uint32_t worddata) //返回一个非0的数据当错误发生时
{
     //program word
              FMC->ADDR = addr; // set upaddr     
              FMC->DATA =worddata;
              FMC->CMD = 0x02; //Triggerprogramming
              while ((FMC->CMD &0x100)!=0);
              if (*(uint32_t *)addr== worddata)
      return 0;
else
      return 1;
}
data_uint_type* data_area_init(void)//返回一个指向数据单元的指针,空指针表示没有数据
{
data_uint_type* ptr;
ptr=get_last_data_uint_ptr();
if (((uint32_t) ptr==DATA_AREA_ADDRESS)&&(ptr->flag!==DATA_UINT_FLAG))
{
flash_erase(DATA_AREA_ADDRESS,DATA_AREA_SIZE);
ptr= null;
}
}
data_uint_type* get_last_data_uint_ptr(void)//返回一个指向数据单元的指针
{
uint32_tstartuintaddr,enduintaddr,temp;
startuintaddr= DATA_AREA_ADDRESS/DATA_UINT_SIZE;
enduintaddr= startuintaddr+DATA_AREA_SIZE/ DATA_UINT_SIZE-1;
while(startuintaddr!=enduintaddr)
{
              temp= (startuintaddr+ enduintaddr)>1;
              if ((data_uint_type*)(temp* DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                       startuintaddr= temp;          
else
                enduintaddr= temp
}
startuintaddr =startuintaddr * DATA_UINT_SIZE;
if (((data_uint_type*)startuintaddr)->flag!=DATA_UINT_FLAG)
return (data_uint_type*) 0;
else
                {
                        If (startuintaddr< (DATA_AREA_ADDRESS+DATA_AREA_SIZE))
                                 {
                                          If  (((data_uint_type*)(startuintaddr+ DATA_UINT_SIZE)->flag==DATA_UINT_FLAG)
                                          return(data_uint_type*)(startuintaddr+ DATA_UINT_SIZE) ;
}else
return (data_uint_type*)(startuintaddr) ;
}
}
uint8_tstore_data_uint(data_uint_type* sur_data_ptr, data_uint_type* dst_data_ptr) //返回一个非0的数据当错误发生时
{
     uint32_t n,temp0,temp1,temp2,*dataptr;
     temp1= sizeof(data_uint_type) >>2;
if((temp1<<2)!= sizeof(data_uint_type))
     temp1++;
     temp2=(uint32_t) dst_data_ptr;
     dataptr=(uint32_t *) sur_data_ptr;
     //erase sector
     if ((DATA_AREA_ADDRESS==temp2)&&(dst_data_ptr->flag==DATA_UINT_FLAG))
     {
              flash_erase(DATA_AREA_ADDRESS, DATA_AREA_SIZE);//erase whole data sectors
     }
     for (n=0;n<temp1;n++)
     {
              if (flash_word_program(temp2, *dataptr++))
      return 1;
              temp2 +=4;
     }
return 0;
}

系统启动时,先调用data_area_init()函数,返回当前数据单元指针,你可以使用memory copy 复制数据到你的程序中。如果是空指针,你需要对你的数据赋予初值,并把它存储到数据区。

全局变量:

data_uint_typemydata;
data_uint_type * dataptr;
main(void)
{
…
dataptr=data_area_init();//初始化
if((uint32_t)dataptr==0) //空指针
{
//对mydata赋予初值
…
//存储数据到Flash 数据区
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint(&mydata,data_ptr);
}
…
//任何时候,调用store_data_uint()把mydata数据存储到Flash
data_ptr++;
if ((uint32_t)data_ptr==DATA_AREA_ADDRESS)
data_ptr =(data_uint_type *) DATA_AREA_ADDRESS;
store_data_uint(&mydata,data_ptr);
…
//data_ptr永远指向当前Flash 数据
…
}

注意事项:

由于mydata的地址是编译器自动设定的,如果发生mydata地址不是word对齐地址,需要手动设置。总之,要确保mydata地址是word对齐的。

4、Revision History

来源:敏矽MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:
cathy@eetrend.com)。

围观 31

本篇先简单介绍MDK的安装流程,然后重点说明如何把敏矽微电的Cortex-M0的PACK包添加到mdk中,这样才能顺利的在MDK环境下开发敏矽微电子Cortex-M0新片。最后用了很大篇幅介绍如何建立工程,工程中各种文件的添加等等。

1、敏矽微电子Cortex-M0的开发环境

敏矽微电子Cortex-M0是基于ARM内核的,所以基于ARM的开发环境都可以用来开发敏矽微电子Cortex-M0的芯片。最常见的两种ARM开发平台是MDK和IAR。我们今天着重介绍MDK环境下如何建立基于敏矽微电子Cortex-M0芯片的项目,以及如何在MDK环境下调试敏矽微电子Cortex-M0芯片。
需要说明的是:MDK软件是需要注册的,强烈建议大家使用正版软件。不过在刚开始学习以及资金有限的情况下,可以使用MDK的评估版本,评估版本的程序容量是32K版本。这个程序容量对于初学来说,是足够用的。

闲话少说,马上开始我们今天的学习之旅。

2、MDK安装

1、首先打开Keil安装包(资料链接中附有MDK 5.28版本安装包),打开后如图1.1所示。

“
图1

2、随后点击“Next”,进入后续的安装流程,勾选红圈选项后,点击“Next”下一步。随后会提示MDK的安装路径,强烈建议采用默认路径。如果要自定义安装路径,请保证自定义的安装路径中不要出现任何中文名字!点击“Next”下一步后,输入下姓名、公司、邮箱等信息,随意填写下即可,继续点击“Next”便开始正式安装。期间软件会自动安装仿真器驱动,耐心等待即可。

“敏矽微电子Cortex-M0开发环境的建立及调试"

3、等到最后出现下面的界面,软件便已安装成功。

“敏矽微电子Cortex-M0开发环境的建立及调试"

3、MDK注册

1、启动Keil 5,在File选项中选择License Management子选项。

“敏矽微电子Cortex-M0开发环境的建立及调试"

2、按照提示进行注册即可,请按照官方正版途径注册。

3、如果点击Add LIC提示以下的错误信息,看红色下划线的信息,得知是因为没有在管理员模式下操作,权限不足导致的。这个是Windows管理员模式产生的问题。如果你的注册过程没有此错误提示,可以跳过第7步。解决的办法也很简单,按照步骤4操作即可。

“敏矽微电子Cortex-M0开发环境的建立及调试"

4、以管理员模式运行Keil 5,鼠标右键Keil 图标,点击“以管理员身份运行”即可。随后重新按照步骤5操作即可。管理员运行方法如图所示:

“敏矽微电子Cortex-M0开发环境的建立及调试"

5、软件注册完成后,出现“LIC Added Sucessfully”的提示,说明注册成功。

4、安装ME32F030 PACK包

1、KEIL安装完成后,就需要安装芯片支持的PACK包,来让KEIL支持我们的芯片,这里建议安装资料提供的Keil 5版本,因为其对应的PACK包是傻瓜式一键安装,操作十分的方便,找到我们的PACK包双击安装即可。

“敏矽微电子Cortex-M0开发环境的建立及调试"

2、PACK包安装完成后,我们可以先确认下,看下KEIL是否已经识别并支持我们的芯片,方法如下,首先创建个新工程,选择project->New uVision Project来建立工程。

“敏矽微电子Cortex-M0开发环境的建立及调试"

3、新建工程时会提示选择芯片类型,从图中看出KEIL已经支持我们的Mesilicon系列芯片。

“敏矽微电子Cortex-M0开发环境的建立及调试"

5、新建工程

1、选择project->New uVision Project来建立工程。

“敏矽微电子Cortex-M0开发环境的建立及调试"

2、选择芯片类型,选择开发板的芯片为Mesilicon->ME32F030 Series->ME32F030C8x6,选择好后,点击“OK”。

“敏矽微电子Cortex-M0开发环境的建立及调试"

3、出现下面的界面,这个是根据需求自己添加开发组件,不多介绍,直接点取消跳过。

“敏矽微电子Cortex-M0开发环境的建立及调试"

4、接下来将资料中的Lib2.3 for keil5x例程解压缩出来,其中公用的.c和.h等文件都在common文件夹内,随后开始向工程中添加.c和.h文件。点击如图所示的快捷按钮。

“敏矽微电子Cortex-M0开发环境的建立及调试"

5、弹出如下界面,在Groups右边有4个按钮,依次为“新建”、“删除”、“上移”、“下移”功能,先选择新建comm、app两个组,你也可以尝试下删除组,把初始自带的Source Group通过红叉按钮删除掉。

“敏矽微电子Cortex-M0开发环境的建立及调试"

向每个Group中添加.程序c文件。那就先举个简单的例子作为开始,首先我们选中需要添加程序的组,比如我们向app组里添加需要的main.c文件,选中app组后,点击右侧的Files框体下的Add Files,选中要添加的main.c文件。点击Add便完成添加。

“敏矽微电子Cortex-M0开发环境的建立及调试"

添加成功后的效果如下图所示,右侧的Files中已包含main.c文件,那么想要删除的话,可以在选中文件后,通过点击上方的红叉进行删除。

“敏矽微电子Cortex-M0开发环境的建立及调试"

依次类推,我们接下来要向comm中添加.c文件。

①、添加core_cm0.c,这个就是我们的单片机的M0内核文件,它在Lib2.3 for keil 5->common->CoreSupport文件夹中。

“敏矽微电子Cortex-M0开发环境的建立及调试"

②、添加system_CMSDK.c,它在Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk文件夹中。

“敏矽微电子Cortex-M0开发环境的建立及调试"

③、添加startup_CMSDK_CM0.s文件,这个是启动程序文件,它是由汇编语言写成的。是以.s为结尾的文件,所以在添加它的时候需要注意将文件类型选择为All Files才能看见它。

Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk->Startup->arm文件夹中。

“敏矽微电子Cortex-M0开发环境的建立及调试"

“敏矽微电子Cortex-M0开发环境的建立及调试"

④、前面添加都属于单片机的系统文件,接下来就要开始添加我们自己的.c文件了,这个都在Lib2.3 for keil 5->common->Drivers->Source文件夹内。

“敏矽微电子Cortex-M0开发环境的建立及调试"

⑤、第一次新建工程时可以参照现有的例程,比如以Demo-Touch Me按键触摸试验为模板,尝试建立一下工程。添加自己所需要的文件,如图所示:

“敏矽微电子Cortex-M0开发环境的建立及调试"

6、添加完成后,关闭Manage Project Items功能栏。返回KEIL主界面后,在左侧的Project工程栏里,可以看到之前添加的所有程序文件。

“敏矽微电子Cortex-M0开发环境的建立及调试"

7、接下来我们是不是可以编译程序了呢?那不妨先试一下。编译后发现提示很多此类的报错,提示 cannot open source input file "gpio.h": No such file or directory,这是因为我们只添加了.c文件,而需要的头文件路径还没有指定位置。那么接下来就指定头文件路径。

“敏矽微电子Cortex-M0开发环境的建立及调试"

点击红圈标注的Options快捷按钮,也可以通过快捷键ALT + F7来打开。

“敏矽微电子Cortex-M0开发环境的建立及调试"

打开后选中C/C++选项卡,在下面可以看到Include Paths栏,这个就是需要指定的头文件路径,点击右边的 。。。按钮来进行添加。

“敏矽微电子Cortex-M0开发环境的建立及调试"

点击。。。按钮后,通过弹出的对话框来添加头文件路径。同上文讲到的一样,红圈的四个按钮依次为“新建”、“删除”、“上移”、“下移”功能。

“敏矽微电子Cortex-M0开发环境的建立及调试"

那就新建路径吧,点击新建后会生成一个新的路径框,点击红圈标识的。。。来添加。

“敏矽微电子Cortex-M0开发环境的建立及调试"

以core_cm0.c文件对应的头文件core_cm0.h为例子,一路进到上文中添加core_cm0.c的文件夹中,进入如图所示的路径后,点击选择文件夹。

“敏矽微电子Cortex-M0开发环境的建立及调试"

添加完成后,刚才新添加的路径便显示出来了。

“敏矽微电子Cortex-M0开发环境的建立及调试"

依次类推,再添加以下3个路径。

Lib2.3 for keil 5->common->DeviceSupport->arm->cmsdk
Lib2.3 for keil 5->common->Drivers->Include
Lib2.3 for keil 5->Demo-Touch Me->myapp->include

这里添加的时候要注意,是要选择.h文件所在的那个文件夹,错选成它的上级或下级文件夹,是无法找到需要的头文件的!添加完成后的效果如下。

“敏矽微电子Cortex-M0开发环境的建立及调试"

这时候我们再去编译一下试试。没有报错也没有警告,说明项目工程顺利建立。

“敏矽微电子Cortex-M0开发环境的建立及调试"

6、下载与调试

1、程序编译没问题后,接下来就可以下载程序并仿真测试了。在开始前先插上仿真器并连接开发板,打开Options for Target选项卡,选中Debug。这个时候选择仿真器类型(根据实际进行选择,建议买一个U-LINK2仿真器),勾选上Run to main,这样程序下载后直接运行到main函数,否则会先运行startup_CMSDK_M0.s中Reset_Handler程序。虽然这段程序最后也会跳转到我们的main函数,但我们没有必要每次去仿真它。点击Settings查看我们的仿真器配置情况。

“敏矽微电子Cortex-M0开发环境的建立及调试"

点击Settings后,在Debug子选项中看到下面的信息。则说明仿真器识别正常。

“敏矽微电子Cortex-M0开发环境的建立及调试"

再点击查看下Flash Download的选项。这时候看到ME20F030单片机的FLash的下载地址和RAM空间地址都已经明确了,这就是为什么前面强烈推荐安装KEIL 5版本,随后打上PACK包,很多设置项都是PACK包整合配置好的,我们直接用就可以了。

“敏矽微电子Cortex-M0开发环境的建立及调试"

2、仿真选项设置好之后,开始下载程序。点击工具栏上的

“敏矽微电子Cortex-M0开发环境的建立及调试"

图标来下载并仿真程序。

“敏矽微电子Cortex-M0开发环境的建立及调试"

图标所示的功能也可以下载程序,但是它是不带仿真功能的,这点需要注意!下载成功后会多出下面的工具条。

“敏矽微电子Cortex-M0开发环境的建立及调试"

下面我们分别来介绍一下这些仿真调试按钮的功能:

1:复位,点击后程序会从头开始重新运行。

2:全速运行,点击后程序便开始全速运行,运行到断点处会停止,或者使用停着功能。

3:停止,当程序在运行状态下,使用此功能,程序便会停止运行。

4:执行进去,本质是单步运行,如果下一步是要执行的是个函数,那么就行进入到函数 里面,进行单步仿真。

5:段执行,也是单步运行,但不同的是,如果下一步是要执行的是个函数,那么会直接运行整个函数,并不会进入函数内部运行,它是直接以一整段代码为单位进行执行的。

6:执行跳去,当不需要再继续在某个函数里继续单步仿真时,执行此功能,就会直接执行完函数内剩余的代码,随后跳出该函数后会暂停,等待下一步操作。

7:执行到光标处,使用此功能前,先确定想运行到地方,鼠标单击运行的那一行,此时光标便会在这一行显示,这时候再点击此按钮,程序会全速运行,直到在光标处停止。

8:全速运行,此功能是让程序全速运行,除非认为暂停或者遇到断点,否则程序会一直运行。

来源:敏矽MCU
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 256

概述

ME32x系列是内嵌ARM Cortex™ M0/M3核的32位微控制器。该系列控制器由敏矽微电子有限公司自主开发,并具有自主知识产权。敏矽微电子的微控制器包括有通用MCU和专用SOC系列,具有非常高的性价比,是MCU产品升级换代和国外产品替代的最佳选择。通用功能有高精度ADC,CAN接口,I2S音频接口,UART串口,SPI接口,I2C总线接口,看门狗定时器(WDT),通用计数器/定时器。特殊接口包括人机界面控制器(LCD驱动,电容触摸按键)和马达控制功能模块。

调试端口

所有ME32x系列产品都支持ARMSWD 两线调试协议。由于调试端口与IO复用,调试端口管脚在系统初始化时为SWD调试功能SWD_CLK和SWD_IO(用户加密情况除外),调试管脚状态在BootLoader运行时不会改变。用户可以使用Jlink或Ulink仿真器与之连接,从而下载和调试用户程序。

调试技巧

3.1 如何确认硬件连接

理论上,仿真器与目标板只需要连接GND,SWD_CLK和SDW_IO三根线即可调试(建议nRST也连接)。如目标板没有电源,JLINK/ULINK仿真器是可以通过USB5V提供一个3.3V电源给目标板供电,前提是目标板是3.3V供电并且电源功耗所需要电流不超过USB能提供的电流:

JLINK缺省是输出3.3V

ULINK缺省是不输出3.3V电源,接口芯片电源要外供。要输出3,3V,需要把一个3针排插全部连在一起(ULINK标准版)
如果目标板系统接口是1.8V或5V,就只能使用ULINK,并且使用不输出3.3V电源设置,目标板需要自己供电,并且1.8V或5V 电源还需要接入仿真器的接口电源。

连接好电源及信号线后,可以检验一下你的工作结果:

打开一个对应的MCU 的工程,在OPTION窗口的Debug Tab,选择你的仿真器,再点击Setting按键


如果你能看到IDCCODE,那么恭喜你,你的硬件连接没有问题了。

3.2 程序下载失败

在确认硬件连接没有问题后,如果出现程序下载失败并且连续重试也一样(已确认对应Flash烧写算法已正确设置并且运行Flash算法的SRAM地址空间也正确设置,不同芯片设置不同,看下图),可能有以下原因:


SWD端口被用户程序复用,此时端口功能不再具有SWD功能

解决方法:MCUBoot引脚接地,重新上电或用Reset重启系统,这样系统会停留在Bootloader,同时SWD引脚功能恢复,即可下载。

SWD接口需要重启

解决方法:在OPTION->Debug->SettingTAB 窗口,选择设置Connect &Reset Options使用Reset,如下图


如nRST没有连接,也可以选择SYSRESETREQ Reset。

3.3 不能进入调试界面或总是从调试界面弹出

有时用户会发现,以前的工程可以下载,但不能进入调试界面进行调试,并且还可能导致SWD不工作,但换一个工程又可以调试。其原因是该工程上次调试有非法操作(如访问非法地址),并且非法操作被工程记录,每一次进入调试都会调用该操作,从而导致Keil从调试窗口弹出。

所以我们要做的事情就是把保留在工程的非法操作从工程中清除掉。

在工程Options->DebugTab,拿掉下面的勾选项目:


选择OK保存。

再在File->SaveAll 保存所有工程内容。

退出工程。

重新调入工程即可解决问题了。

Revision History


来源: 敏矽MCU

围观 158
订阅 RSS - 敏矽微电子