本帖最后由 Ryanhsiung 于 2011-11-22 19:11 编辑
ISP具体操作请参见菜农群课笔记之ICP与ISP----20110412(整理版)!
昨天刚始试ISP,一开始用ICP烧录进去固件但是不能用,找了很久的原因,后来是才发现固件版本烧错了。
后面改了版本试了试,感觉不错,蛮顺利的。
但是我个人认为现有的ISP不能用于产品,所以也自己改进一下(就一下)。
现有问题:
先说一下我改进的地方,先前的BOOTLOADER没有超时处理,若进入BOOTLOADER状态,若上位机不动作则下位机一直在下面死等!
改进方法:
增加一个计数器,累加到10S则跳到到APROM。
以下是初始化代码及中断代码
//---------------------------------------------------------------------------------TIMER
static __inline void InitTIMER0(void)
{
/* Step 1. Enable and Select Timer clock source */
SYSCLK->CLKSEL1.TMR0_S = 7; //Select 22.1184Mhz for Timer0 clock source
SYSCLK->APBCLK.TMR0_EN =1; //Enable Timer0 clock source
/* Step 2. Select Operation mode */
TIMER0->TCSR.MODE=1; //Select periodic mode for operation mode
/* Step 3. Select Time out period = (Period of timer clock input) * (8-bit Prescale + 1) * (24-bit TCMP)*/
TIMER0->TCSR.PRESCALE=255; // Set Prescale [0~255]
TIMER0->TCMPR = 1000; // Set TCMPR [0~16777215]
// (1/22118400)*(255+1)*(1000)= 0.0115 =11.5MS中断一次
/* Step 4. Enable interrupt */
TIMER0->TCSR.IE = 1;
TIMER0->TISR.TIF = 1; //Write 1 to clear for safty
NVIC_EnableIRQ(TMR0_IRQn); //Enable Timer0 Interrupt
/* Step 5. Enable Timer module */
TIMER0->TCSR.CRST = 1; //Reset up counter
TIMER0->TCSR.CEN = 1; //Enable Timer0
/* */
g_TimeoutCount = 0 ; //
// TIMER0->TCSR.TDR_EN=1; // Enable TDR function
}
//使用T0 来做超时处理
void TMR0_IRQHandler(void) // Timer0 interrupt subroutine
{
if(g_TimeoutCount++>900) // Timeout超时处理约10S
{ //这里的时间不准,我顺便写的
TIMER0->TCSR.CEN = 0; // Enable Timer0
//超时退出 这里要添加代码
/* Trap the CPU */
while(1);
}
TIMER0->TISR.TIF =1;
}
特别说明:
1、建议使用 22.1184Mhz 作为 Timer0 的时钟源,这样你的延时就于外部晶振无关了.
不然这次是个12M的计10S,下次4M的计30S. (注:内部时钟没有外部时钟准)
2、退出时要将T0关闭
3、为了不锻炼新来的网友,本文中只贴出了T0的初始化与T0中断函数 和说明实现方法,而贴出全部代码
各位网友需要增加的地方:
1、在退出的地方将T0关闭
2、在正常收发码处将g_TimeoutCount清0,
3、T0中断超时加入超时处理代码,(注:这里不能goto _APROM,大家可以写一个子函数)
4、哦,不要忘了初始化哦
4、加入代码后空间不足,那间网友可将一个USB 或者串口部分去除(或都优化一下)
我的新项目选的是100系列所以我就将USB去除了! P.S. 新唐这个开源的ISP做的不错,且代码写的也不错,便于修改与移植!,还有上位机也是开源的,方便自己改上位。 觉得我说的对就支持一下! |