Forums

重置行为

开始于 尼克·豪斯 2009年1月26日
----- BEGIN PGP签名消息-----
哈希:SHA1

尼克·豪斯(Nick Howes)写道:
>---在A ...中,“尼克·豪斯”写道:
>>---在A ...中,“ jellybean10025”写道:
>>
>>> while ((pRSTC->RSTC_RSR) & C_RSTC_SRCMP)
>>是的,这很有意义-我需要等待重置过程
>>完整,以便不使用错误的向量。
>
>好吧,这似乎是答案,但这并没有解决我的问题。 :(
>

我从来没有想过你的问题这么琐碎,所以我从来没有问过,但是你 enabling
用户重置之前重置?我知道您的重置工作正常,但是 case...

ag

> - Nick

----- BEGIN PGP签名-----
版本:GnuPG v2.0.9(GNU / Linux)
评论:在SUSE中使用GnuPG- http://enigmail.mozdev.org

iEYEARECAAYFAkl + KkYACgkQ / nL + S5dojegK + ACgp9FEoPyPA3RXZvUWA + OCG7j1
acMAoJgnYy1bG1qcECTNirPkY4CQJJSB
作为
-----结束PGP签名-----

---在A ...中,Yusuf Caglar AKYUZ写道:
>
>我从来没有想过你的问题这么琐碎,所以我从来没有问过,但是你 enabling
>用户重置之前重置?我知道您的重置工作正常,但是 case...

嗨,Caglar,

未启用用户重置。

更多信息:
这部分代码有效:
AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 <<24)| AT91C_RSTC_PERRST |
AT91C_RSTC_EXTRST); //重置外围设备并重新映射
而(((AT91C_BASE_RSTC->RSTC_RSR) &AT91C_RSTC_SRCMP); //等待重置为
完全的
((void(*)(void))0x00100000)(); //传递控制权以重置Flash中的向量 (0x00100000)

但是如果使用以下命令,它将失败:
AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 <<24)| AT91C_RSTC_PERRST |
AT91C_RSTC_EXTRST); //重置外围设备并重新映射
而(((AT91C_BASE_RSTC->RSTC_RSR) &AT91C_RSTC_SRCMP); //等待重置为
完全的
AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 <<24)| AT91C_RSTC_PROCRST);

我想我可以使用有效的代码,但我非常希望了解 what is
发生。

-尼克
----- BEGIN PGP签名消息-----
哈希:SHA1

尼克·豪斯(Nick Howes)写道:
> More info:
>这部分代码有效:
> AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 <<24)| AT91C_RSTC_PERRST |
>AT91C_RSTC_EXTRST); //重置外围设备并重新映射
>而(((AT91C_BASE_RSTC->RSTC_RSR) &AT91C_RSTC_SRCMP); //等待重置为
> complete
>((void(*)(void))0x00100000)(); //传递控制权以重置Flash中的向量 (0x00100000)
>
>但是如果使用以下命令,它将失败:

你可以试试这个吗:

> AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 << 24) | AT91C_RSTC_PERRST |
>AT91C_RSTC_EXTRST); //重置外围设备并重新映射
>而(((AT91C_BASE_RSTC->RSTC_RSR) &AT91C_RSTC_SRCMP); //等待重置为
> complete
> AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 <<24)| AT91C_RSTC_PROCRST);
>

作为:

AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 << 24)
| AT91C_RSTC_PERRST
| AT91C_RSTC_EXTRST
| AT91C_RSTC_PROCRST);
而(((AT91C_BASE_RSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);

>我想我可以使用有效的代码,但是我会 热爱了解什么是
> happening.
>
> - Nick

----- BEGIN PGP签名-----
版本:GnuPG v2.0.9(GNU / Linux)
评论:在SUSE中使用GnuPG- http://enigmail.mozdev.org

iEYEARECAAYFAkl + QaEACgkQ / nL + S5dojeiglwCeJW380eVq4keynYLPbNVbHhTH
epwAnRuReaEbwYTslEG + 0bRVaLab1vTL
=DYC8
-----结束PGP签名-----

---在A ...中,Yusuf Caglar AKYUZ写道:

> can you try:
>
> AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 << 24)
>| AT91C_RSTC_PERRST
>| AT91C_RSTC_EXTRST
>| AT91C_RSTC_PROCRST);
>而(((AT91C_BASE_RSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);

是的,我已经尝试过了,但是没有用。我试过各种类似的 sequences - e.g.
将PERRST与PROCRST分开,在 PROCRST, etc.

-尼克
>从工作和非工作代码看起来像 the
区别仅在于涉及PROCRST的那一行
定义。听起来像PROCRST是处理器重置,
可能会清除程序计数器(我不确定)。
如果确实清除了PC,那么代码执行将
基本上回到程序的开始
无限循环...

---尼克·豪斯(Nick Howes)写道:

>---在A ...中,优素福·卡格拉(Yusuf Caglar)AKYUZ
> wrote:
>
> > can you try:
> >
> > AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 << 24)
> >| AT91C_RSTC_PERRST
> >| AT91C_RSTC_EXTRST
> >| AT91C_RSTC_PROCRST);
> >而(((AT91C_BASE_RSTC->RSTC_RSR) &
> AT91C_RSTC_SRCMP);
>
>是的,我已经尝试过了,但是没有用。我已经
>尝试了各种类似的序列-例如
>将PERRST与PROCRST分开,进入
>PROCRST等之后的无穷循环
>
> - Nick

您能发布您的LowLevelInit序列吗?

埃里克
- - - 原始信息 - - -
From: Nick Howes
To: A...
发送:2009年1月27日,星期二,12:24 AM
主题:[AT91SAM]回复:重置行为
---在A ...中,Yusuf Caglar AKYUZ写道:

> can you try:
>
> AT91C_BASE_RSTC->RSTC_RCR = ((0xA5 << 24)
> | AT91C_RSTC_PERRST
> | AT91C_RSTC_EXTRST
>| AT91C_RSTC_PROCRST);
>而(((AT91C_BASE_RSTC->RSTC_RSR) & AT91C_RSTC_SRCMP);

是的,我已经尝试过了,但是没有用。我试过各种类似的 sequences - e.g.
将PERRST与PROCRST分开,在 PROCRST, etc.

- Nick
---在A ...中,“埃里克·帕斯奎尔”写道:

>您能发布您的LowLevelInit序列吗?

嗨,埃里克,

这是您要的吗?

#define FMCN_PLL_1_0_US 48 // 48个周期为1us
#define FMCN_PLL_1_5_US 72 // 72个周期为1.5us
#define MOR_OSC_CNT 8 //1.52 - 2.9 ms depending on SLCK accuracy
#define PLLR_DIV 5 //18.432MHz 5 = 3.6864MHz
#define PLLR_MUL 25 //3.6864MHz * 26 = 95.8464MHz
#定义PLLR_PLL_CNT28 //此值来自Atmel示例文件
(在LOCK位置1之前的慢时钟数)
#define PLLR_USB1 // 1表示被二除; 95.8464MHz 2 =
47.9232MHz(48MHz-0.16%)

void base_init(){

AT91C_BASE_MC->MC_FMR =(FMCN_PLL_1_5_US<<16)| AT91C_MC_FWS_1FWS;
//设置闪光灯

AT91C_BASE_PMC->PMC_MOR =(MOR_OSC_CNT<<8)| AT91C_CKGR_MOSCEN;
//启用主振荡器
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MOSCS)); //等待osc启动

AT91C_BASE_PMC->PMC_PLLR =(PLLR_USB<< 28) | (PLLR_MUL << 16) |
(PLLR_PLL_CNT<<8)| PLLR_DIV; //设置PLL
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_LOCK)); //等待PLL启动

AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; //将MCK分频器设置为2
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MCKRDY)); //等待时钟
准备好

AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK |
AT91C_PMC_PRES_CLK_2; //将MCK源设置为PLL
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MCKRDY)); //等待时钟
准备好

}

(我尝试在此例程开始时等待AT91C_PMC_MCKRDY,但它 made no
区别。)
尼克

您能否测试一下此配置:
- - - (ok)
pPMC->PMC_PLLR =(---)(确定)

//等待启动时​​间(直到PMC状态寄存器的LOCK位置1)
while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));

//等待主时钟(如果已经初始化)
while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

//切换到慢时钟+预分频器
pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

//切换到快速时钟+预分频器
pPMC->PMC_MCKR | = AT91C_PMC_CSS_PLL_CLK;
while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

// Initialize AIC
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
埃里克
- - - 原始信息 - - -
From: Nick Howes
To: A...
发送:2009年1月27日,星期二,下午2:15
主题:[AT91SAM]回复:重置行为
---在A ...中,“埃里克·帕斯奎尔”写道:

>您能发布您的LowLevelInit序列吗?

Hi Eric,

这是您要的吗?

#define FMCN_PLL_1_0_US 48 // 48个周期为1us
#define FMCN_PLL_1_5_US 72 // 72个周期为1.5us
#define MOR_OSC_CNT 8 //1.52 - 2.9 ms depending on SLCK accuracy
#define PLLR_DIV 5 //18.432MHz 5 = 3.6864MHz
#define PLLR_MUL 25 //3.6864MHz * 26 = 95.8464MHz
#define PLLR_PLL_CNT 28 //此值来自Atmel示例文件
(在LOCK位置1之前的慢时钟数)
#define PLLR_USB 1 // 1表示被二除; 95.8464MHz 2 47.9232MHz(48MHz的 - 0.16%)

void base_init() {

AT91C_BASE_MC->MC_FMR =(FMCN_PLL_1_5_US<<16)| AT91C_MC_FWS_1FWS;
//setup flash

AT91C_BASE_PMC->PMC_MOR =(MOR_OSC_CNT<<8)| AT91C_CKGR_MOSCEN;
//启用主振荡器
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MOSCS)); //等待osc启动

AT91C_BASE_PMC->PMC_PLLR =(PLLR_USB<< 28) | (PLLR_MUL << 16) |
(PLLR_PLL_CNT <<8)| PLLR_DIV; //设置PLL
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_LOCK)); //等待PLL启动

AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; //将MCK分频器设置为2
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MCKRDY)); //等待时钟
ready

AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK |
AT91C_PMC_PRES_CLK_2; //将MCK源设置为PLL
while(!(AT91C_BASE_PMC->PMC_SR &AT91C_PMC_MCKRDY)); //等待时钟
ready

}

(我尝试在此例程开始时等待AT91C_PMC_MCKRDY,但它 made no
difference.)

thx, Nick
---在A ...中,“埃里克·帕斯奎尔”写道:

>您能否测试一下此配置:

嗨,埃里克,

我尝试了您建议的更改(包括AIC初始化中的内容 your separate e-
邮件)-其行为方式相同。

-尼克
然后,我认为您需要按照Eric的建议去其他地方。

我发布的代码绝对有效。在我们成千上万
生产单位,我们会经常进行软件更新。

这里肯定还有其他事情。

PS:我们剥去了“ AT91”以保持键入不变,但否则
不要触摸头文件。

---在A ...中,“尼克·豪斯”写道:
>
>---在A ...中,“尼克·豪斯”写道:
> >
> >-在A ...中,“ jellybean10025”
写道:
> >
> > > while ((pRSTC->RSTC_RSR) & C_RSTC_SRCMP)
> >
> >是的,这很有意义-我需要等待重置
处理到
> >完成,以免使用错误 vectors.
>
>好吧,这似乎是答案,但它并没有解决我的问题
问题。 :(
>
> - Nick
>