hyg2012 发表于 2012-5-14 18:34:34

LGT复位按键按下后,程序没有反应了

本帖最后由 hyg2012 于 2012-5-15 10:07 编辑

刚收到线路板,调了一下,串口可以通信了,移植了一个操作系统,也跑起来了,基本没有做修改。
发现复位按键按下后,程序没有反应了。只有通过断电才能运行,可以用仿真器下载程序,但是不能运行。不知道怎么回事。(线路板是在网站上邮购的)


原来是工程样片的问题,找了半天没有看见,仔细又查了一下,下面的帖子上找到的
http://www.ourdev.cn/thread-5468821-1-4.html

初始化外部时钟
http://www.ourdev.cn/thread-5475400-1-1.html
void init_devices(void)
{
port_init();

PMCR =0x15; // PMCR =0x35;      
      //先不要置位bit5

delay_nms(10);   //延时10ms等待晶振输入稳定

PMCR =0x35;// 置位bit5, 切换系统时钟到外部晶振

PMCR=0x34;         //关闭内部RC
//PMCR &=~BIT(0);
   
//CLKPR =0x81;       //置位MASK_CLKPCE,4个周期内修改分频系数      

CLKPR=0x80;      //1分频,默认是2分频(0x01)
CLKPR =0x00;    //清除 MASK_CLKPCE
}

有关CLKPR的设置,是我们的文档没有描述清楚,稍后会更新文档。

CLKPCE:对CLKPR写入0x80才会置位CLKPCE,写CLKPR4个时钟之后或者CLKPCE为高时再次设置CLKPR都会清零CLKPCE。

LS的本意是保持CLKPS的值不变同时置位CLKPCE,再写入新的CLKPS值,最后清零CLKPCE,

实际的运行结果会是:对CLKPR写入0x81不会置位CLKPCE,同时4个时钟之后CLKPCE会被清零,

再写入0x80时才会置位CLKPCE,但CLKPCE会提前被清零因为前面写入0x81时已经开始4个时钟的计数了,

再写入0x00时CLKPCE已经被硬件清零了,导致CLKPS的值设置不成功。

hyg2012 发表于 2012-5-14 18:41:39

复位按键没有加上拉电阻,但是引脚上有3.3V电压。程序我只是配置为外部晶振,打开串口接受中断,使用定时器0作为系统滴答。PB0口直接高电平驱动一个发光管,没有加限流电阻。

logicgreen 发表于 2012-5-14 18:42:09

是用外部晶振吗?

hyg2012 发表于 2012-5-14 18:44:37

是的,7.3728M

hyg2012 发表于 2012-5-14 18:45:53

本帖最后由 hyg2012 于 2012-5-14 18:47 编辑

用的是DrvSYS那个函数配置的
E_SYS_STATUS DrvSYS_ClockSwitch(STR_SYS_DEV *psSYSParam);

longwu911 发表于 2012-5-14 19:19:18

这个问题人家芯片厂家不是说了嘛!前期的芯片在用外部晶振的时候,外部复位是没有作用的

hyg2012 发表于 2012-5-14 20:32:09

关键是按下复位键后,程序就死了,不再运行了。那如果需要复位怎么办?

hyg2012 发表于 2012-5-14 21:51:30

原来是工程样片的问题,找了半天没有看见,仔细又查了一下,下面的帖子上找到的
http://www.ourdev.cn/thread-5468821-1-4.html

初始化外部时钟
http://www.ourdev.cn/thread-5475400-1-1.html
void init_devices(void)
{
port_init();

PMCR =0x15; // PMCR =0x35;      
      //先不要置位bit5

delay_nms(10);   //延时10ms等待晶振输入稳定

PMCR =0x35;// 置位bit5, 切换系统时钟到外部晶振

PMCR=0x34;         //关闭内部RC
//PMCR &=~BIT(0);
   
//CLKPR =0x81;       //置位MASK_CLKPCE,4个周期内修改分频系数      

CLKPR=0x80;      //1分频,默认是2分频(0x01)
CLKPR =0x00;    //清除 MASK_CLKPCE
}

有关CLKPR的设置,是我们的文档没有描述清楚,稍后会更新文档。

CLKPCE:对CLKPR写入0x80才会置位CLKPCE,写CLKPR4个时钟之后或者CLKPCE为高时再次设置CLKPR都会清零CLKPCE。

LS的本意是保持CLKPS的值不变同时置位CLKPCE,再写入新的CLKPS值,最后清零CLKPCE,

实际的运行结果会是:对CLKPR写入0x81不会置位CLKPCE,同时4个时钟之后CLKPCE会被清零,

再写入0x80时才会置位CLKPCE,但CLKPCE会提前被清零因为前面写入0x81时已经开始4个时钟的计数了,

再写入0x00时CLKPCE已经被硬件清零了,导致CLKPS的值设置不成功。

hyg2012 发表于 2012-5-14 22:01:10

建议把这些解决了的问题加一个酷字,找起来好找一些。或者是整理一下置顶,上面的问题在第4页找到的。

bozai 发表于 2012-5-15 09:44:01

原来如此
页: [1]
查看完整版本: LGT复位按键按下后,程序没有反应了