本帖最后由 Ryanhsiung 于 2011-11-25 17:10 编辑
本想东西多了,再整理一下,再发出来。
刚PLC_AVR说我光上裸照 没写的实质的东西,关键是最近时间不多,比较忙,我就先写两点:
1、我先上传的SYSTIC代码中有条小虫子,我的SYSSTICK初始化代码也是从另人那COPY来的,这个BUG使用12M晶振不易发现,所以各位网友可以查看一下自己的代码,看一下是不是有同样的错误。
UNLOCKREG();
DrvSYS_SelectSysTickSource(0); // 为SYSTICK选用外部晶振
LOCKREG();
先前的代码没有解锁,导致最终选用了22.1184的内部RC 2分频(实际为11.0592M)。与12M相近,所以使用12M晶振不易发现这个问题。
我用的晶振是20M的,一跑起来时间慢了将近一倍,才找到这个BUG的。
2、一个问题,还没有找到原因,不过将其贴出,给大家看看,也帮忙分析一下。
以下代码是SYSTICK中断中写的代码。static uint32_t count = 0;
count++;
SysTic_ClearIF();
// 向SYST_CSR.COUNTFLAG中写1 以清除标志
if(count>100)
{
count =0;
printf("1S了!\n");
}
注:__inline void SysTic_ClearIF(void)
{
SysTick->CTRL |= (1 << 16);//向SYST_CSR.COUNTFLAG中写1 以清除标志
}
//初始化void SysTick_Configuration(void)
{
UNLOCKREG(); // 对写保护位操作时 需要一次向0x50000 0100写入 0x59,0x16,0x88,
DrvSYS_SelectSysTickSource(0); // 为SYSTICK选用外部12M晶振
LOCKREG();
SysTick->CTRL = 0X03; //[SYST_CSR]向下计数到0将引起SysTick 异常而挂起(进入中断) 计数器运行
SysTick->VAL = 0x00; //[SYST_CVR]该向SYST_CVR寄存器写入0样确保定时器以SYST_RVR中的值计数,而非任意值
SysTick->LOAD = 200000; //[SYST_RVR]200000/20000000 = 0.01s =10ms
Flag_OneSecondForADC = 0 ; //初始
}
看起来没问题,确实也可以运行(在大叔的助学板可以运行,一块100系列板也可以运行)
但是在我新做的100板子上有一块不能运行!代码是正常,也可调试,COUNT有自++,但是就是没有执行PRINTF(。。)。
这后将SysTic_ClearIF();写在了count++;前面就可以了!
|