m051学习笔记(1)
今天有空,仔细翻阅了NuMicro M051 Series Technical Reference Manual EN.pdf。主要是了解一些与系统运行有关和特别的地方。整理如下。1。MO51有个USER CONFIGURATION寄存器,这个寄存器的名字和地址为:CONFIG (Address = 0x0030_0000),它是个FLASH寄存器,这个寄存器提供用户选择:系统使用内部还是外部时钟;启动后是从LDROM还是从APROM执行;BOD的电压设置和允许;保密位等。
The NuMicro M051™ series flash memory consists of Program memory (64/32/16/8KB), data flash,ISP loader program memory, user configuration. User configuration block provides several bytes to control system logic, like flash security lock, boot select, brown out voltage level, data flash base address, ..., and so on. It works like a fuse for power on setting. It is loaded from flash memory to its
corresponding control registers during chip power on. User can set these bits according to application request by writer before chip is mounted on PCB.
这个CONFIG FLASH 寄存器如同AVR的熔丝位。
有一个问题:如果设置使用外部晶体作为系统时钟,但是外部晶体没有安装,此时M051是否也同AVR一样被“锁死”?在手册中没有找到答案,需要测试!
2。关于LVR和BOD。M051有2个低电压检测功能:LVR和BOD,提供2级的电压检测保护。
LVR的值是固定的2.0V,电压低于该值,直接RESET。BOD的阈值用户可以设置,可以中断,也可以RESET。
有了这两个的配合,掉电保护就方便多了。比如设置BOD为4.5v,允许BOD中断;允许LVR;当电压低于4.5v时,进入BOD中断,进行掉电保护,然后循环等待,看电压是否恢复,或者电压掉到2.0V以下,系统RESET。
这个比AVR好。一般的AVR只有BOD RESET,不能中断。掉电保护需要外加电路。
3.和M3内核相同,系统时钟的控制非常复杂,选择非常多。电源系统的控制也复杂,每个功能模块都有自己的时钟控制、电源管理和复位。 [引用马老师的" 有一个问题:如果设置使用外部晶体作为系统时钟,但是外部晶体没有安装,此时M051是否也同AVR一样被“锁死”?在手册中没有找到答案,需要测试!"]
这个我测试过,默认是外部12MHz晶振的。如果加上
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_22M;
这句,那么就算有
PWRCON |= XTL12M_EN; //使用外部12M晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz时钟稳定
这样的写法。它依然会运行,而不会死等,当然,这时就运行在22MHz的状态下的。
我是短路晶振两个脚来测试的。或许不代表没有接晶振,,,只是粗略测试。
如果没有CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_22M;这句,那就会死等。 楼上,根据你的测试,是否可以这样认为:
其实,M051从RESET后,总是以内部22M开始执行代码的,然后再根据用户的设置,转换到使用外部晶体的?
在这个地方,官方的手册中没有给出具体的说明。 板凳,听课! 回复【2楼】machao
楼上,根据你的测试,是否可以这样认为:
其实,m051从reset后,总是以内部22m开始执行代码的,然后再根据用户的设置,转换到使用外部晶体的?
在这个地方,官方的手册中没有给出具体的说明。
-----------------------------------------------------------------------
一般来说ARM启动后都是先使用内部晶振的,调试器能进入也是内部晶振的作用,然后启动中有一个切换过程 mark,学习了。 马老师好: 开始听讲............ 跟着马老师学 现在有一个问题,那是不是如果在运行中导致外部晶振停震,这个时候,内部晶振会自动启用呢?还是一旦切换到外部晶振,内部的振荡器就会自动停止? 认真听课,专心学习。 mark,学习下 学习! mark 好呀!开课了./emotion/em204.gif 学! 学些了,哈哈 有个问题,当设置从LDROM启动后,注:LDROM为空。烧写示范代码smpl_LED,结果LED不闪烁程序不运行。按复位也没用。AVR若BOOT为空,也会自动进入APP区的啊。M051 LDROM为空时,为什么不能进入APROM运行呢,还是我设置问题? 先支持 听课! 听课 markkkkk,多谢晒 回复【楼主位】machao
有一个问题:如果设置使用外部晶体作为系统时钟,但是外部晶体没有安装,此时M051是否也同AVR一样被“锁死”?
-----------------------------------------------------------------------
在NUC100刚出的测试版,这个情况发生过,
后来NUC100的正式版,硬件工程师就做了特别的检测,可以防止芯片没了外部时钟。
再到后来的M051,也继承了这个特别检测的机制。
其实还有一个情况,就是程序在运行中,将自己的时钟关了怎么办?
同样会锁死。Nu-link/ICP工具有特别的流程,将锁死的芯片内部的程序全部擦除。这种锁死可以恢复的。
以上事情都是在研发过程中遇到的。
可惜没有马老师这样的预见性,不然也能少走不少的弯路。 唉,我也想用芯唐的M0,只是申请了一点反映都没有,芯片也买不到~~~~
本来有个项目都打算要用的,前两个星期正好在画样品的板子,一直在等样品但没有等到,最后还是又用STM32了~~~~~ 哈,刚上老师开课,第一课,找好位置,认真听每一讲~~~ 认真听课。 呵呵,开讲了啊~~ 回复【21楼】X-Hawk
谢谢你的解答。在玩STM32的时候,我的体会就是内核部分比较复杂,涉及到系统的时钟、RESET后的动作、电源管理、中断机制等内容。而ST公司的手册对内核的介绍非常少,需要专门看ARM公司的资料。M051的手册也是如此,对于以上内容同样也没做详细的说明。
我不明白(不了解)你所指“硬件工程师就做了特别的检测,可以防止芯片没了外部时钟”是什么意思,采用什么手段。
我看了新唐提供的例程代码,基本上开始有下面一段,是否就是你所说的“特别检测”:
新唐提供的例程代码,好象全部使用外部12M,所以都有这样的开始:
main(void)
{
Un_Lock_Reg();
PWRCON |= XTL12M_EN;
while((CLKSTATUS & XTL12M_STB) == 0); //Wait until 12M clock is stable.
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //Set external crystal as the system clock
......
}
1。为什么首先要Un_Lock_Reg();?上电的时候电源是不稳定的,M051没有AVR的上电延时启动的功能,上电后马上Un_Lock_Reg();是非常危险的,一旦程序飞掉,容易造成重要的寄存器被误写。
2。PWRCON |= XTL12M_EN;这句必要吗?根据手册的解释:
XTL12M_EN:External 12 MHz Crystal Oscillator Control
The bit default value is set by flash controller user configuration register config0 .When the default clock source is from 12 MHz crystal. The bit is automatically set to “1”
1 = Crystal oscillation enable
0 = Crystal oscillation disable
这个位实际就是用户设置的值,没有必要再设置一次的,为什么这里要这句?
3。第3句是等待外部12M稳定了。这里“好象”说明,M051启动后首先是以内部22M工作,然后转换系统的时钟系统,而且这个转换不是硬件自动的,是用户代码起的作用(有点傻)。
如果是这样的话,那么不管是否外部有无晶体,还是在运行过程中外部12M失效,M051都不会“死锁”,因为M051每次上电,总是能执行指令。而AVR的“死锁”,是根本不能执行任何的指令。
但上面是“好象”!因为手册中对PWRCON寄存器中OSC22M_EN的描述非常简单:
OSC22M_ENInternal 22.1184 MHz Oscillator Control
1 = 22.1184 MHz Oscillation enable
0 = 22.1184 MHz Oscillation disable
而且RESET后的值为“0”,这个与“M051启动后首先是以内部22M工作”有点小矛盾。
所以我才说要做测试和继续学习。如果那位知道,请介绍一下,可以节省时间。可能还要看在startup_M051.s中,先做了什么事情。
4。新唐的例程代码,都在开始Un_Lock_Reg();了,但是根本没有及时的Lock_Reg();掉,那样一旦后面用户代码中稍微有点错误,这些重要的寄存器可就麻烦了。这样的DEMO,有点“害人”(技术上我从不客气)。所以真的要用新唐的M051做产品,使用他们的库或例程,要充分认识到里面可能出现的BUG或缺陷!下面是对保护的说明:
After the protection is disabled, user can check the protection disable bit at address 0x5000_0100 bit0,“1” is protection disable, “0” is protection enable.
Then user can update the target protected register value and then write any data to the address “0x5000_0100” to enable register protection.
注意后面一句中and then ......描述 !! 回复【4楼】fanwt
楼上,根据你的测试,是否可以这样认为:
其实,m051从reset后,总是以内部22m开始执行代码的,然后再根据用户的设置,转换到使用外部晶体的?
在这个地方,官方的手册中没有给出具体的说明。
-----------------------------------------------------------------------
一般来说arm启动后都是先使用内部晶振的,调试器能进入也是内部晶振的作用,然后启动中有一个切换过程
-----------------------------------------------------------------------
还是没有说透彻。这个切换过程是硬件自动完成的,还是必须由用户代码切换,还是在startup_M051.s中的代码切换的(也属于用户代码切换)。如果是硬件自动切换的,那么外部没有晶体,切换不成功,硬件将如何处理?哪些寄存器会有影响?
调试器的进入,未必是内部晶体的作用,因为调试器本身提供CLK,靠这个CLK,芯片就能工作。 回复【16楼】plc_avr 不要迷恋哥只是传说
有个问题,当设置从ldrom启动后,注:ldrom为空。烧写示范代码smpl_led,结果led不闪烁程序不运行。按复位也没用。avr若boot为空,也会自动进入app区的啊。m051 ldrom为空时,为什么不能进入aprom运行呢,还是我设置问题?
-----------------------------------------------------------------------
这个主要是代码空间的问题。
AVR的代码空间是独立的一块,所以当BOOT为空,取代码会一条一条下去,到达最后,然后回转到0000了,此时是用户代码了。
而MO51或STM32等ARM,它的代码FLASH、RAM、寄存器都在一个逻辑空间,LDROM空的话,会继续下去,进入到达RAM、寄存器的空间,通常不会回到00000(后面的寄存器等有东西的),也就是APROM了。
以上只是从原理上的分析判断。具体可能不是这样的。因此不管是使用AVR还是使用M051,设置必须正确。没有LDROM或BOOT,一定要设置从0000开始执行。 跟着马老师学习 m051毕竟是32位的ARM架构。所以起步的条件应该是在熟悉8位的基础上,最好是已经非常熟悉了AVR。
我是从具备上面的基础再讨论M051的使用。看看,对于最基本的工作条件:一个系统时钟还有问题没有搞定,没有这么容易。 听课啦。 记号!学习! 马老师您好,这部分我知道一些,不足之处请不吝指正:
1. flash的config位的时钟配置,是由芯片硬件读入的并设定的。
硬件做完之后,才会进入LDROM或APROM的"软件"程序, 然后才会进入main().
“特别检测”指的是硬件在载入config时,发现配置为外部时钟,但又没有实际检测到的情况下,
会启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。
2. 12M不是必须的。
但是USB模块需要48M时钟,
对于USB程序,需要设定PLL寄存器,产生比较精确的48M,
就最好用外部12M作为时钟源, 产生48M比较方便。
用内部的22.1184M,不那么好输出48M.
3. 如果用户已经在config位设置了用外部12M启动,
PWRCON |= XTL12M_EN确实没有必要。
但这样写,不管config位的配置如何,都能确保使能XTL12M.
总之就是硬件可以根据config, 决定启动时的clock.
启动进入软件流程后,可以通过PWRCON,CLKSEL,PLLCON等再重新系统的clock.
4. Un_Lock_Reg()您教诲的很对,最好在重要的事情做完之后重新Lock_Reg()。 【8楼】 tiancaigao7 天才杨威利
积分:744
派别:
等级:------
来自:北京工业大学
现在有一个问题,那是不是如果在运行中导致外部晶振停震,这个时候,内部晶振会自动启用呢?还是一旦切换到外部晶振,内部的振荡器就会自动停止?
那是不是如果在运行中导致外部晶振停震,这个时候,内部晶振会自动启用呢?--不会。
还是一旦切换到外部晶振,内部的振荡器就会自动停止?-- 也不会。 回复【33楼】X-Hawk
马老师您好,这部分我知道一些,不足之处请不吝指正:
1. flash的config位的时钟配置,是由芯片硬件读入的并设定的。
硬件做完之后,才会进入ldrom或aprom的"软件"程序, 然后才会进入main().
“特别检测”指的是硬件在载入config时,发现配置为外部时钟,但又没有实际检测到的情况下,
会启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。
2. 12m不是必须的。
但是usb模块需要48m时钟,
对于usb程序,需要设定pll寄存器,产生比较精确的48m,
就最好用外部12m作为时钟源, 产生48m比较方便。
用内部的22.1184m,不那么好输出48m.
3. 如果用户已经在config位设置了用外部12m启动,
pwrcon |= xtl12m_en确实没有必要。
但这样写,不管co......
-----------------------------------------------------------------------
按你1的解释,“硬件硬件在载入config时,发现配置为外部时钟,但又没有实际检测到的情况下,会启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。”
那么以后将会使用内部时钟一直工作下去,还是停在某个代码上?,因为此时与PWRCON中的OSC22M_EN位的设置是矛盾的,因OSC22M_EN为“0”。换句话说,在这个非正常的情况下,OSC22M_EN是否就不起作用了?
你所讲的“总之就是硬件可以根据config, 决定启动时的clock.启动进入软件流程后,可以通过PWRCON,CLKSEL,PLLCON等再重新系统的clock. ”
正常情况是没有问题的,这个我明白。我们讨论的是非正常情况,“用户设置使用外部,而其实外部没有,那么硬件转换与PWRCON的矛盾如何解决的”。这个好象在讨论先有鸡还是先有蛋的问题。
或者这样解释:
1。硬件硬件在载入config时,发现配置为外部时钟,但又没有实际检测到的情况下,会启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。”进入2
2。此时PWRCON中的OSC22M_EN位为0,而XTL12M_EN为“1”,硬件转换外部时钟。进入3
3。又没有实际检测到,启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。”进入2(死在这里)
或者这样解释:
1。硬件硬件在载入config时,发现配置为外部时钟,但又没有实际检测到的情况下,会启动内部时钟,好让芯片不会在进入"软件"程序之前死掉。”进入2
2。此时PWRCON中的设置无效,当程序写一次PWRCON后,PWRCON的设置开始有效。
-----------------------------------------------------------------------------------
在CLKSTATUS寄存器中有个CLK_SW_FAIL状态位:
Clock switch fail flag
1 = Clock switch if fail
0 = Clock switch if success
This bit will be set when target switch clock source is not stable. Write 1 to clear this bit to zero.
是否这个标志为1时,PWRCON的设置是无效的?
===============================================================================================================
34楼的回答,其实也涉及到这个问题。如果OSC22M_EN起作用,你说的两个不会是正确的。但如何解释上面开始的过程? 对以下这段DEMO中的代码:
main(void)
{
Un_Lock_Reg();
PWRCON |= XTL12M_EN;
while((CLKSTATUS & XTL12M_STB) == 0);//Wait until 12M clock is stable.
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //Set external crystal as the system clock
......
}
建议换成:
main(void)
{
while(CLKSTATUS & CLK_SW_FAIL){}; 如果转换失败,死循环
if (PWRCON & XTL12M_EN)
while((CLKSTATUS & XTL12M_STB) == 0);//Wait until 12M clock is stable.
else
while((CLKSTATUS & OSC22M_STB) == 0);//Wait until 22M clock is stable.
Un_Lock_Reg();
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M; //Set external crystal as the system clock
Lock_Reg();
......
} 回复【16楼】plc_avr 不要迷恋哥只是传说
有个问题,当设置从ldrom启动后,注:ldrom为空。烧写示范代码smpl_led,结果led不闪烁程序不运行。按复位也没用。avr若boot为空,也会自动进入app区的啊。m051 ldrom为空时,为什么不能进入aprom运行呢,还是我设置问题?
-----------------------------------------------------------------------
这个主要是代码空间的问题。
AVR的代码空间是独立的一块,所以当BOOT为空,取代码会一条一条下去,到达最后,然后回转到0000了,此时是用户代码了。
而MO51或STM32等ARM,它的代码FLASH、RAM、寄存器都在一个逻辑空间,LDROM空的话,会继续下去,进入到达RAM、寄存器的空间,通常不会回到00000(后面的寄存器等有东西的),也就是APROM了。
以上只是从原理上的分析判断。具体可能不是这样的。因此不管是使用AVR还是使用M051,设置必须正确。没有LDROM或BOOT,一定要设置从0000开始执行。
---------------------------------------------
请问马老师怎么设置成0000开始执行,我把LDROM擦除了。。原来的程序也不行运行了。
解决了,用ICP编程软件选择从APROM启动就行了。 回复【37楼】CoolBird007
回复【16楼】plc_avr 不要迷恋哥只是传说
有个问题,当设置从ldrom启动后,注:ldrom为空。烧写示范代码smpl_led,结果led不闪烁程序不运行。按复位也没用。avr若boot为空,也会自动进入app区的啊。m051 ldrom为空时,为什么不能进入aprom运行呢,还是我设置问题?
-----------------------------------------------------------------------
这个主要是代码空间的问题。
avr的代码空间是独立的一块,所以当boot为空,取代码会一条一条下去,到达最后,然后回转到0000了,此时是用户代码了。
而mo51或stm32等arm,它的代码flash、ram、寄存器都在一个逻辑空间,ldrom空的话,会继续下去,进入到达ram、寄存器的空间,通常不会回到00000(后面的寄存器......
-----------------------------------------------------------------------
这个需要在M051的ICP专用软件中单独设置,如同AVR设置熔丝位,这个我试过了。在KEIL中也应该可以设置(环境设置),我还没具体用。
你是如何设置的从LDROM启动的?芯片出厂时的设置为从APROM启动。如果你只有ISP的方法,这个设置是不能动的。在ISP的环境中,禁止了这个设置。 谢谢马老师的指点,发现个新问题,加密后就不能进行ISP了。见这个贴子。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4346774&bbs_page_no=1&bbs_id=9999 学习! 回复【39楼】plc_avr 不要迷恋哥只是传说
谢谢马老师的指点,发现个新问题,加密后就不能进行isp了。见这个贴子。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4346774&bbs_page_no=1&bbs_id=9999
-----------------------------------------------------------------------
这个还没有到这步。不过已经再关注了。手册中关于加密位的描述如下:
Security Lock
0 = Flash data is locked
1 = Flash data is not locked.
When flash data is locked, only device ID, Config0 and Config1 can be read by writer and ICP thru serial debug interface. Others data is locked as 0xFFFFFFFF. ISP can read data anywhere regardless of LOCK bit value.
好象看这个加密位是对ICP起作用。ISP是万能的。这个可以理解,ISP本身也是用户代码,它读其它的FLASH,把数据送出这个位是管不了的。
是否为一个漏洞不可知,X-Hawk有个测试,但与这个有出入。如果专门写个上位机软件,使得LDROM的程序读APROM数据并送出就麻烦了!
新唐的ISP软件对这个加密做任何处理不知道,或许是个BUG?
M051的FMC可以操作FLASH,包括APROM、LDROM、CONFIG、DATAROM。是否为了避免这个漏洞,在新唐的ISP软件中,如果选择了加密,就把CONGFIG转到APROM启动,这样ISP就没有用了。这只是我的猜测,等别人回答吧。
关于加密这个问题,新唐应该有个完整的方案的,手册中看不出。目前也没有找到更多的资料和说明。 照目前测试的方式,加密后就不能通过ISP下载了,再想升级APROM区代码就要用ICP方式下载。那这个ISP功能就可有可无啦,因为要实现ISP就不能加密,要加密就不能ISP。 另外就是内部的RC调整:是否出厂时已经调整到1%了?那么每块芯片的这个调整值是不同的吧,放在哪里?用户能读吗?用户能否调整? 你是如何设置的从LDROM启动的?芯片出厂时的设置为从APROM启动。如果你只有ISP的方法,这个设置是不能动的。在ISP的环境中,禁止了这个设置。
我用的是会上发的那块小板,默认是从APROM还是LDROM上启动我不知道了,我只是看见LDROM上有程序,我就把它擦除了(用ICP只擦除了LDROM,再次连接上时读出来是空的,而APROM中的程序我没擦除,也还存在),复位后程序就没运行。
这其间我改过CONFIG位。。。可能是时钟设置问题,还是什么原因。因为看见这个配置,又看见程序里的时钟配置,我当时是糊里糊涂的。。。呵呵。
现在是无法试ISP了,现在回到研究这个时钟的问题上来。我还是糊涂。。等马老师的答案。 牛!必须标志,期待学习这个M051 LS要想用ISP,见我发的贴子吧。注意不要写加密位。http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4346774&bbs_page_no=1&bbs_id=9999 首先表扬X-Hawk。了解并能解答些比较深入的低层的问题。
我接触过许多公司的产品,考虑到在实际工程和控制中的使用,会问很多深入和低层,同时也是一些关键的问题。大部分公司的的决大部分FAE(包括ATMEL)都是对我摇手的。这里的问题有两个方面:
1。芯片本身的功能是完善的,但FAE们根本没有了解。这个只能自己从手册中找答案。如果手册写的不好,就麻烦了。
2。芯片本身存在一些不足,生产者想糊过去。不敢去做深入的说明。 谢谢【46楼】,学习了。
是啊,还有这个问题也郁闷的。。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4343945&bbs_page_no=1&search_mode=1&search_text=M0&bbs_id=9999 mark 回复【44楼】CoolBird007
你是如何设置的从ldrom启动的?芯片出厂时的设置为从aprom启动。如果你只有isp的方法,这个设置是不能动的。在isp的环境中,禁止了这个设置。
我用的是会上发的那块小板,默认是从aprom还是ldrom上启动我不知道了,我只是看见ldrom上有程序,我就把它擦除了(用icp只擦除了ldrom,再次连接上时读出来是空的,而aprom中的程序我没擦除,也还存在),复位后程序就没运行。
这其间我改过config位。。。可能是时钟设置问题,还是什么原因。因为看见这个配置,又看见程序里的时钟配置,我当时是糊里糊涂的。。。呵呵。
现在是无法试isp了,现在回到研究这个时钟的问题上来。我还是糊涂。。等马老师的答案。
-----------------------------------------------------------------------
会上发的那块小板上带NU-LINK-ME的,所以ICS肯定没有问题。主要概念清楚,试几次ISP就出来了。
至于到底是用ISP还是使用ICP,我现在认为是ICP!这个同ISP占用相同的I/O线,而且还不冲突(AVR的JTAG与I/O冲突,用了JTAG,它占的口再做I/O用非常麻烦,所以应该使用SPI的ISP),至少我从手册上没有看出矛盾,没有发现如何禁止ICP的,以及ICP与I/O之间的关系描述。当然,需要测试后才能知道。
我在等我的转换板。发的那个板是个鸡肋,只有NU-LIKE-ME有价值。 回复【49楼】CoolBird007
谢谢【46楼】,学习了。
是啊,还有这个问题也郁闷的。。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4343945&bbs_page_no=1&search_mode=1&search_text=m0&bbs_id=9999
-----------------------------------------------------------------------
看过你的帖子,可能是你的测试方式不对。
首先明白上电复位和RESET复位的不同:上电是系统没有电,上电后自动执行。RESET是指系统有电,按下RESET的复位。如果你用ICE调试查看,那么可能就是其它RESET了。因为ICE开始前一般要RESET的,这个不是上电,也不是按键RESET。
正确测试方法是写段代码,程序运行后通过UART输出复位寄存器的值。不使用任何调试方式,让芯片自己运行。比较关电后再上电,以及上电后按RESET键,看输出是否相同。 回马老师,我是用LCD显示那个寄存器的值的。。你试试看结果是否一样。 Mark 回复【52楼】machao
回复【49楼】coolbird007
谢谢【46楼】,学习了。
是啊,还有这个问题也郁闷的。。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4343945&bbs_page_no=1&search_mode=1&search_text=m0&bbs_id=9999
-----------------------------------------------------------------------
看过你的帖子,可能是你的测试方式不对。
首先明白上电复位和reset复位的不同:上电是系统没有电,上电后自动执行。reset是指系统有电,按下reset的复位。如果你用ice调试查看,那么可能就是其它reset了。因为ice开始前一般要reset的,这个不是上电,也不是按键reset。 ......
-----------------------------------------------------------------------
稍微看了一下手册,看看下面这个位的功能
在AIRCR寄存器中,有个SYSRESETREQ位,手册上讲:
Writing this bit 1 will cause a reset signal to be asserted to the chip to indicate a reset is requested.
The bit is a write only bit and self-clears as part of the reset sequence.
这个位初始化为“0”,表示不记录RESET的情况。你的代码中在开始部分增加一句,把这个位置“1”,意思是记录RESET的情况,然后做测试看。
只能是参考啦。不知道是这个位的原因吗。 MARK下,好资料 mark下... 回马老师55楼问题:
头文件里找不到这个寄存器定义。。。
正确的这个寄存器名字叫作 SCR
确实,跟你说的一样,置位后就可以正确读出/RESET脚的复位值了。。感谢马老师啊。 M051的pwm
驱动仪表线圈时发现pwm送比较值CMR时,只会在下一个定时器周期送值,也就是计数器到0时才送CMR值,芯片有个缓冲器保存这个数据
这个不好,stm8s可以选择立即送值还是下一个周期送值。
由于不能立即送值,依靠时序的线圈换象限时会摆动。 通常PWM过程中更改CMR都是需要缓冲的,然后在0的时候同时更新。这样才能保证产生的PWM波没有歧变。
立即送值并不能保证本次PWM的有效,比如你送的CMR为30,而T/C已经到了60,那也只能到下一次PWM才有效的。
如果你的一个PWM波的变化就会造成线圈换象限时摆动,说明你的PWM波的频率太低了。应该提高。
说句实在的话,对于工业上的实时应用,要求非常高,比那些什么手记、MP3、MP4、导航都难,难在需要真正的考虑硬件和低层。从你说用库,我就知道问题多多。
现在是2瓶茅台了,请楼上的记住。 回复【58楼】CoolBird007
回马老师55楼问题:
头文件里找不到这个寄存器定义。。。
正确的这个寄存器名字叫作 scr
确实,跟你说的一样,置位后就可以正确读出/reset脚的复位值了。。感谢马老师啊。
-----------------------------------------------------------------------
手册上的名字,不是我自己起的。
AIRCRSCS_BA + 0xD0CR/WApplication Interrupt and Reset Control Register 0x0000_0000
不用什么感谢,我只是看看手册。测试是你做的。我也知道怎样使用了,共同学习。 回复【41楼】machao
-----------------------------------------------------------------------
回马老师:
ISP软件的加密方案是:
ISP固件是“只收不出”的程序,对数据只接收并写入flash, 绝对不含将flash数据发送到windows端的接口。
想到一种可能的破_解办法就是用“缓冲区溢出”,
看是否某条ISP固件的命令接口,含有“缓冲区溢出”的漏洞,利用此漏洞,注入一段程序,将flash数据传出来。
ISP固件的代码ourdev上有,有兴趣可以尝试看看。
ICP软件没有特别的加密办法,这部分由硬件完成的:一旦config中的lock位为0,
并且调试器接口上有调试器连上,硬件会阻止flash的数据往内部数据总线上送, 于是ICP软件就拿不到数据。 PWRCON中的OSC22M_EN 和 XTL12M_EN 可以同时设置为1,都没有问题的。
系统当前用的哪一个,在寄存器 CLKSEL0.HCLK_S 中。 回复【61楼】machao
回复【58楼】coolbird007
回马老师55楼问题:
头文件里找不到这个寄存器定义。。。
正确的这个寄存器名字叫作 scr
确实,跟你说的一样,置位后就可以正确读出/reset脚的复位值了。。感谢马老师啊。
-----------------------------------------------------------------------
手册上的名字,不是我自己起的。
aircrscs_ba + 0xd0cr/wapplication interrupt and reset control register 0x0000_0000
不用什么感谢,我只是看看手册。测试是你做的。我也知道怎样使用了,共同学习。
-----------------------------------------------------------------------
写AIRCR 是ARM官方定义的reset办法。
每一家M0/M3的芯片都支持的。 学习! 库用来初始化硬件,应该没问题。
时序处理操作寄存器或汇编。
频率122hz,不能提高,线圈特性要求的。
吉林不出茅台,马老师改吉林特产,人参两支行吗? 回复【63楼】X-Hawk
pwrcon中的osc22m_en 和 xtl12m_en 可以同时设置为1,都没有问题的。
系统当前用的哪一个,在寄存器 clksel0.hclk_s 中。
-----------------------------------------------------------------------
1.关于ISP的加密问题,我明白。看手册,保密位是不能控制ISP的。至于ISP的固件是人写的,留出“后门”就可以了。当然,新唐官方推出的东西是不会留后门的。至于是否有“漏洞”,要看水平。WINDOW够厉害了,经常要打补丁,补洞。这个留给高手们去找吧。
2。关于时钟的问题,还是没有真正说明这几个寄存器的作用。
“PWRCON中的OSC22M_EN 和 XTL12M_EN 可以同时设置为1,都没有问题的。系统当前用的哪一个,在寄存器 CLKSEL0.HCLK_S 中。”
比如:我设置使XTL12M,可是没有焊上晶体。
那么上电后,PWRCON中的OSC22M_EN = 0,XTL12M_EN = 1。这个与“此时系统使用内部22M工作”就有矛盾。OSC22M_EN=0。意味者22M的震荡器不工作,也谈不上给系统了。
另外CLKSEL0.HCLK_S上电初始值也来自用户设置,但在这样的非正常情况下,其值是什么?如果PWRCON中的OSC22M_EN = 0,此时设置CLKSEL0.HCLK_S选择使用OSC22M,会产生什么情况。
其实,所有那些在上电后对电源选择的设置,都是要执行代码的,应该有一个CLK在工作。能否说明在这样的非正常情况下,硬件上是如何处理的,这些寄存器中的值是否有变化,以及软件上开始应该如何正确的处理。 回复【66楼】sde_arm9
库用来初始化硬件,应该没问题。
时序处理操作寄存器或汇编。
频率122hz,不能提高,线圈特性要求的。
吉林不出茅台,马老师改吉林特产,人参两支行吗?
-----------------------------------------------------------------------
pwm的输出到线圈,总需要通过低通平滑,变成模拟量吧。你的线圈有什么特殊要求?直接给它PWM的数字波吗?
尽管人的眼睛滞留时间是1/25秒,但需要100HZ的扫描,基本上才能做到无闪烁。道理是相同的。
如果PWM的频率用244HZ,同一个值送2遍,或者4*122HZ,正常情况,同一个值送4遍。需要改变的话,可在这4遍的过程中,任何一遍后变化。
如果这个方法能用,需要4支人参了。采用1、2、4、8、的增加方式。 学习~~~ 呵呵呵。。。估计马老师也再为那些初始值为0x0000x 后面那个x郁闷了。。手册上很多描述都是这样,然而,它又有个默认值。。 x是因为那个值随config配置会改变。
如果PWRCON中的OSC22M_EN = 0,此时设置CLKSEL0.HCLK_S选择使用OSC22M,会产生什么情况。
-----------------------------------
这个程序会锁死芯片。
另外CLKSEL0.HCLK_S上电初始值也来自用户设置,但在这样的非正常情况下,其值是什么?
-----------------------------------
在马老师面前真不好轻易“糊弄”过去,暂时摆手。等俺找出答案再来当“二传手”,呵呵 回复【70楼】CoolBird007
呵呵呵。。。估计马老师也再为那些初始值为0x0000x 后面那个x郁闷了。。手册上很多描述都是这样,然而,它又有个默认值。。
-----------------------------------------------------------------------
xx没有影响,手册上到是都有说明这个XX的值来自什么地方。关键是要弄明白他们实际的作用。我查过官网,没有找到这方面的解释和例子。
AVR简单。你设置使用外部晶体,但没有装这个晶体,那么它就不工作,锁死。什么程序也不执行。
但M051在此时能工作(我没测试,是根据网友的实验),那就需要了解它此时的机制,其后才能正确使用,东西才能做的更好。
如果是工业控制上使用,在程序运行中出现外部震荡出问题,系统不工作锁死也是可以的。但上电前外部震荡出了问题,你一上电。程序能执行,不过以快一倍的频率工作,整个系统就可能乱套(比如AD采样快了,采的值就不对了,还要控制其它的工作,产生了错误),出现危险(其实,此时还是不工作的好!) 还有以下两句程序
IPRSTC1 |=CPU_RST;
IPRSTC1 |=CHIP_RST;
都可以使单片机复位,除了名称不同,RSTSRC的值不一样外,还有什么不同呢?
真见鬼,,原来一真读不对复位值,后来把SCR的置位后就行了,
之后要测试其它,又把那句去掉后,而结果也大出我意料,不用那句也可以正确读出复位状态了。
之所以说我认为是SCR而不是AIRCR是因为在M051.h里面找不到这个寄存器的定义,而对比手册上的分配情况来看。看下面两个图,而猜出来的。。
而刚好就能正确读出。。。。
现在我还是分不出究竟是对还是错。。。郁闷中。
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_592821XQATDU.JPG
(原文件名:未命名.JPG)
http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_592822LA5PMS.JPG
(原文件名:未命名2.JPG) ISP 回复【73楼】CoolBird007
还有以下两句程序
iprstc1 |=cpu_rst;
iprstc1 |=chip_rst;
都可以使单片机复位,除了名称不同,rstsrc的值不一样外,还有什么不同呢?
-----------------------------------------------------------------------
前者是RESET内核 仅CPU,外设没有RESET(用户寄存器中的设置值还在,T/C还继续工作......)。
后者是RESET整个芯片,包括CPU和全部的外设(所有寄存器都复位到初始值,T/C停止工作......)
请看手册,SCR是与休眠相关的位。
既然没有就自己加上:
#define AIRCR (*((volatile unsigned long *) (SCS_BA+0x00000D0C))) 明白了,我试了定义一个变量,复位后那个值也复位了,我以为复位CPU是不会清除的。呵呵
请马老师再看看73楼那两个图。。
或许真跟那个无关,但是我是不是应该把
#define AIRCR (*((volatile unsigned long *) (SCS_BA+0x00000D0C)))
这句加到M051.h上去。。。
呵呵,竟然同时编辑了回复了。谢谢了。。 回复【76楼】CoolBird007
明白了,我试了定义一个变量,复位后那个值也复位了,我以为复位cpu是不会清除的。呵呵
请马老师再看看73楼那两个图。。
-----------------------------------------------------------------------
定义变量?这个不能算。应该配置2个寄存器,一个是内核的,一个是外设的,才能看出区别。
照道理,如果变量分配在RAM中,那么CPU复位,这个变量是不会复位的。但CPU复位后是从初始化代码执行,最先执行的哪个xxxx.s里面通常有将整个RAM清零的处理。
后面的已经答复了。 回复【43楼】machao
另外就是内部的rc调整:是否出厂时已经调整到1%了?那么每块芯片的这个调整值是不同的吧,放在哪里?用户能读吗?用户能否调整?
--------------------------------------------------------------------
出厂已经校准调整,具体是放在一个RCADJ的寄存器中,客户可以读写。 折腾了一天,原来,要在读出复位状态值后要写相应位为1清零,否则复位后的值还是原来的。。巨汗啊!!!
RSTSRC = RSTSRC;
加了这句,可以正常读出,但不知这样写1清零的做法正确不???编译时没被“优化”掉。 请收到M051板子的网友按这个贴子的方法试一下ISP功能:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4346774&bbs_page_no=1&bbs_id=9999加密后就不能通过ISP下载了,再想升级APROM区代码就要用ICP方式下载。
用ISP编写过加密位时,再点config确实会出现芯片锁定的提示,这个时候你点Disconnect,断开连接,再点connect,是可以连上ISP的,但是只要芯片复位,你再点连接就再也没办法连上啦,断开P3.2对地,连APROM的代码也不能运行了。
这就是问题点所在:只要加了密,ISP功能就会失效。加密后若还是选LDROM启动(LDROM已烧ISP代码),M051就没办法运行APROM里的代码了。按理说烧了ISP代码应该会自动跳转,但是却没有。 回复【78楼】leifeng
回复【43楼】machao
另外就是内部的rc调整:是否出厂时已经调整到1%了?那么每块芯片的这个调整值是不同的吧,放在哪里?用户能读吗?用户能否调整?
--------------------------------------------------------------------
出厂已经校准调整,具体是放在一个rcadj的寄存器中,客户可以读写。
-----------------------------------------------------------------------
谢谢。实际我是已经看到了RCADJ,但对手册上的解释不理解,所以提问的:
手册上给出的RESET后的Reset Value 为 0x0000_0000
而在对这个位的描述中讲到:NuMicro M051™ series build in 22.1184 MHz RC oscillator, in order to provide +/- 1% frequency precision, these bits are used to store trimmed value after CP/FT test. The default for central frequency 22.1184 MHz is “100000b”
如果出厂已经调整,那么应该 Reset Value 为 0x0000_00xx, 或后面的default“100000b”(0x0000_0020),同时应该说明这个初始值来自何处。
另外减小或增加这个default“100000b”,频率的值是增加还是减少?大约的调整范围是多少?手册上没有找到相关的东西。
RCADJ是个寄存器,断电后的数据清零的,出厂调整的原始数据不可能放在这里! 回复【80楼】plc_avr 不要迷恋哥只是传说
请收到m051板子的网友按这个贴子的方法试一下isp功能:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4346774&bbs_page_no=1&bbs_id=9999加密后就不能通过isp下载了,再想升级aprom区代码就要用icp方式下载。
用isp编写过加密位时,再点config确实会出现芯片锁定的提示,这个时候你点disconnect,断开连接,再点connect,是可以连上isp的,但是只要芯片复位,你再点连接就再也没办法连上啦,断开p3.2对地,连aprom的代码也不能运行了。
这就是问题点所在:只要加了密,isp功能就会失效。加密后若还是选ldrom启动(ldrom已烧isp代码),m051就没办法运行aprom里的代码了。按理说烧了isp代码应该会自动跳转,但是却没有。
-----------------------------------------------------------------------
注意:
1。不管使用ISP还是ICP,必须是代码和加密位“同时”一次下去,如果先下去代码,然后再单独加密,那么单独加密(更改配置)的过程前会把ROM中的数据清掉的,这个在软件操作中有提示的!
2。ICP更改配置(加密)会把LDROM和APROM全部擦掉;ISP更改配置(加密)会把APROM全部擦掉。
这个操作与AVR不同,AVR的加密可以与代码分开操作,而M051的加密,包括其它的config设置,必须同代码一起,一次操作完成。 马老师:我是加密位和配置一次写进去的。就是您昨天晚上试到的那一步,加密过后,再使芯片复位一次,就可以看到我说的结果了。ISP再次连会连不上的。连APROM里的代码也不会运行。 【82楼】 machao
pwm的输出到线圈,总需要通过低通平滑,变成模拟量吧。你的线圈有什么特殊要求?直接给它PWM的数字波吗?
----------------------------------------------
对!
仪表线圈直接由mcu的管脚驱动,电流一般<20mA。
线圈如果工作在较高频率,就存在回差问题。 从STM32转M051 占位 听课! 占位听课 我这块小板上读出的RCADJ值为40,改成50,复位后读出还是40..... 拿到板子还没有开始学习
先标记一下,晚上回去再学习 LS有空试一下我说的这个问题。 回复【83楼】plc_avr 不要迷恋哥只是传说
马老师:我是加密位和配置一次写进去的。就是您昨天晚上试到的那一步,加密过后,再使芯片复位一次,就可以看到我说的结果了。isp再次连会连不上的。连aprom里的代码也不会运行。
-----------------------------------------------------------------------
加密位本身是配置中的一个。你试一下,是在ISP的时候把所要下的“代码”和“配置”一次写入。具体如下:
1。选择好要下载的APROM程序
2。点击配置,在配置窗口中设置从LDROM执行(应该已经是了),选择加密。返回ISP主界面
3。在ISP的主界面下部,将APROM、CONFIG选中打勾(表示一次操作先把APROMX下载,并加密)
4。最后按开始。 回复【88楼】CoolBird007
我这块小板上读出的rcadj值为40,改成50,复位后读出还是40.....
-----------------------------------------------------------------------
这个寄存器的描述RCADJ只有6位,怎么会出现40?
另外这个寄存器是带保护的,写入前,需要对另外的一个寄存器连写3个字节的数据,去掉保护,才能写入。
你只能写入0x40以下的数据,写入后马上读出,看是否写入正确。然后在复位,再读,看是多少。 马老师,我的操作方法就是和您说的一样的。都是一次APROM和config。要是单写config,是会删除APROM的,操作上面软件会有提示的。有拿到板子的网友,可以按我说的方法试一下,证实我的说法。 刚才又测试2次了,没有问题。而且是掉电,然后上电。能执行APROM,也能再次ISP。 回复【92楼】machao
回复【88楼】coolbird007
我这块小板上读出的rcadj值为40,改成50,复位后读出还是40.....
-----------------------------------------------------------------------
这个寄存器的描述rcadj只有6位,怎么会出现40?
另外这个寄存器是带保护的,写入前,需要对另外的一个寄存器连写3个字节的数据,去掉保护,才能写入。
你只能写入0x40以下的数据,写入后马上读出,看是否写入正确。然后在复位,再读,看是多少。
-----------------------------------------------------------------------
确实是按你讲的操作的,是十进制的40,不是十六进制。
写入寄存器为50(十进制)后,读出来也是50,但是复位后再读,还是40。。
测试代码
Un_Lock_Reg(); //解除寄存器锁定
itoa(RCADJ);
LCD_write_english_string(0,1,regvalue); //复位值LCD第一行显示为十进制=40
RCADJ=50; //改成50
itoa(RCADJ);
LCD_write_english_string(0,2,regvalue); //再读出结果第二行 = 50 ,是对的。
然后复位一下。还是第一行还是显示40 楼上的,我误解了。你是十进制的40、50。这个是在范围内的。
1。点个LED闪烁,分别写入47和0,看闪烁的频率有否变化。有示波器最好。
2。手上有几块板?读一下另外的,看是否相同?主要是考虑可以用这个值做点代码加密用。 回复【79楼】CoolBird007
折腾了一天,原来,要在读出复位状态值后要写相应位为1清零,否则复位后的值还是原来的。。巨汗啊!!!
rstsrc = rstsrc;
加了这句,可以正常读出,但不知这样写1清零的做法正确不???编译时没被“优化”掉。
-----------------------------------------------------------------------
有许多的状态位是写“1”清零的。AVR中也有这样的位。根据手册的定义。
本讨论组中有对这个的讨论。 回复【79楼】CoolBird007
帮 “plc_avr 不要迷恋哥只是传说”测试一下ISP和加密的情况。我测试可以,他总说不行。 谢谢马老师帮忙,我明天再仔细查一下这个的问题.片子已经被我擦写几百次了. 回复【96楼】machao
楼上的,我误解了。你是十进制的40、50。这个是在范围内的。
1。点个led闪烁,分别写入47和0,看闪烁的频率有否变化。有示波器最好。
2。手上有几块板?读一下另外的,看是否相同?主要是考虑可以用这个值做点代码加密用。
-----------------------------------------------------------------------
回马老师,第一个问题:
1。点个led闪烁,分别写入47和0,看闪烁的频率有否变化。有示波器最好。
写入0明显比写入47快很得多。
证明这个寄存器是对的,但是复位后该值无法保存。
2。手上有几块板?读一下另外的,看是否相同?主要是考虑可以用这个值做点代码加密用。
我只有一块板,无法测试。
3.帮 “plc_avr 不要迷恋哥只是传说”测试一下ISP和加密的情况。我测试可以,他总说不行。
这个没试。。。
页:
[1]
2