刚在学arm,向各位大侠请教了。
一. 我用samrtarm2200的开发平台,将周立功公司的FLASHDOWN工程修改一下,主要用于启动开发板及下载程序用。 我加了个定时中断,即启动开发板后显示启动界面,并显示倒数9S,时间到或按回车键进入用户程序,按其它键则选择其它功能。 1. 经常有时超级终端里能显示有时不能显示,并且也不能输入。 主程序test.c **--------------当前版本修订------------------------------------------------------------------------------ ** 修改人: ** 日 期: ** 描 述: ** **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ #include "config.h" /**************************************************************************** * 名 称:IRQ_Time0() * 功 能:定时器0中断服务程序。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void __irq IRQ_Time0(void) { T0IR = 0x01; // 清除中断标志 VICVectAddr = 0x00; // 通知VIC中断处理结束 }
/**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器0,定时时间为1S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time0Init(void) { /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz */ T0PR = 99; // 设置定时器0分频为100分频,得110592Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 110592; // 比较值(1S定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; /* 设置定时器0中断IRQ */ VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断 VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0) VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量 VICIntEnable = 0x00100010; // 使能定时器0中断 }
/********************************************************************************************************* ** 函数名称: main ** 功能描述: download 主程序 ** ** 输 入: 无 ** ** 输 出: 无 ** ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2003年6月5日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void Run(void); char s[1024];
int main(void) { uint32 temp; char i,c,Ch,*p; int j; CommInit(); Time0Init(); BCFG0 = 0x1000ffef; while(1) { PrintString("\n\n\nFlash loader Program V1.0 for EasyARM2200 Board\n"); PrintString("1: Chip Erase\n"); PrintString("2: Sector Erase\n"); PrintString("3: Program Chip\n"); PrintString("4: Check\n"); PrintString("5: Run user program \n"); PrintString("6: Run\n");
PrintString("\n\nNotice:Flash must be in BANK0 and Ram must be in BANK1!\n\n"); PrintString(" default choise is 5 \n"); PrintString(" Please choise.... default choise delay "); j = 9; do { p=&Ch; if (GetCh(p)==TRUE) { PrintString("\b \n"); SendChar(Ch); break; } if (T0IR&0x01==0x01) { SendChar('\b'); SendChar(j+'0'); j--; } } while (j > 0);
if (j <= 0 || Ch ==0x0d) { Ch = '5'; }
switch(Ch) { case '1': PrintString("\n Are you sure erased SST39F160 ? y/n? \n"); while(GetCh(p)==FALSE); if (Ch=='y') { if (ChipErase() == TRUE) { PrintString("\nSuccessfully erased SST39F160 !\n"); } else { PrintString("\nChip erase error !!\n"); } } break; case '2': PrintString("\n Please input Sector number(0~511)...\n"); GetString(s); if (sscanf(s, "%d", &temp) != 1) { PrintString("\nInput err!\n"); break; } if (temp >= 512) { PrintString("\nInput err!\n"); break; } if (SectorErase(temp) == TRUE) { PrintString("\nSuccessfully erased SST39F160's sector!\n"); } else { PrintString("\nChip erase error !!\n"); } break; case '3': PrintString("\n Please choise inter 32 hex to down...\n"); while (1) { GetString(s); switch(DownloadLine(s)) { case DOWNLOAD_FINISH : PrintString("\nready and ok\n"); break; case DOWNLOAD_LINE : continue; break; case FILE_FOEMAT_ERR: PrintString("\nThis file is not inter 32 bit hex file!!\n"); break; case CHECK_ERR : PrintString("\nBad record type\n"); break; case PROGRAM_ERR : PrintString("\nFlash program Error\n"); break; case BAD_RECORD_TYPE : PrintString("\nBad record type\n"); break; default: PrintString("\nUnknown Error\n"); break; } break; } break; case '4': PrintString("\n Please choise inter 32 hex to down...\n"); while (1) { GetString(s); switch(Check(s, &temp)) { case DOWNLOAD_FINISH : PrintString("\nCheck ok\n"); break; case DOWNLOAD_LINE : continue; break; case FILE_FOEMAT_ERR: PrintString("\nThis file is not inter 32 bit hex file!!\n"); break; case CHECK_ERR : PrintString("\nBad record type\n"); break; case PROGRAM_ERR : PrintString("\nCheck err at addr:0x"); for (i = 0; i < 8; i++) { c = ((temp >> 28) & 0x0f); if (c < 0x0a) { c = c + '0'; } else { c = c + 'A' - 0x0a; } SendChar(c); temp = temp << 4; } PrintString("\n"); break; case BAD_RECORD_TYPE : PrintString("\nBad record type\n"); break; default: PrintString("\nUnknown Error\n"); break; } break; } break; case '5': PrintString(" 你选择了5....\n"); break; case '6': PrintString(" 你选择了6....\n"); break; default: PrintString("\nDon't Find this Command !\n"); break; } PrintString("Hit '.' to continue !!\n"); while(1) { GetCh(p); if ((*p) == '.') { break; } } } return 0; }
/********************************************************************************************************* ** End Of File ********************************************************************************************************/
串口通信程序 comm.c
-------------------------------------------------------------------------------- **文 件 名: target.c **创 建 人: 陈明计 **最后修改日期: 2004年2月2日 **描 述: lpc22xx(飞利浦的ARM)目标板特殊的代码,包括异常处理程序和目标板初始化程序 ** 每个工程应当具有这个文件的拷贝,用户根据程序的需要修改本文件。 **--------------历史版本信息---------------------------------------------------------------------------- ** 创建人: 陈明计 ** 版 本: v1.0 ** 日 期: 2004年2月2日 ** 描 述: 原始版本 ** **------------------------------------------------------------------------------------------------------ ** 修改人: ** 版 本: ** 日 期: ** 描 述: ** **--------------当前版本修订------------------------------------------------------------------------------ ** 修改人: ** 日 期: ** 描 述: ** **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/
#define IN_COMM #include "config.h"
#ifndef bps #define bps 19200 #endif
#define BUF_SIZE 2048 static char Buf[BUF_SIZE]; static uint32 Hard; static volatile uint32 End;
/********************************************************************************************************* ** 函数名称: SendChar ** 功能描述: 发送一个字符 ** 输 入: 字符 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void SendChar(char data) { while((U0LSR & 0x00000020) == 0); U0THR = data; }
/********************************************************************************************************* ** 函数名称: GetCh ** 功能描述: 接收发送一个字符 ** 输 入: 无 ** 输 出: 收到的字符 ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ uint8 GetCh(char *Ch) { char temp; if (Hard == End) { return FALSE; } temp = Buf[Hard++]; *Ch = temp; if (Hard >= BUF_SIZE) { Hard = 0; } SendChar(temp); return TRUE; }
/********************************************************************************************************* ** 函数名称: PrintString ** 功能描述: 发送一个字符串 ** 输 入: 字符串指针 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void PrintString(char *s) { char temp; temp = *s++; while(temp != 0) { if (temp == '\n') { SendChar('\r'); } SendChar(temp); temp = *s++; } }
/********************************************************************************************************* ** 函数名称: GetString ** 功能描述: 接收一个以'\r'结束的字符串 ** 输 入: 存储字符串指针 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void GetString(char *s) { char temp1,Ch; while (1) { while(GetCh(&Ch)==FALSE); temp1 = Ch; if (temp1 == '\r') { SendChar('\n'); *s = 0; return; } *s++ = temp1; } }
/********************************************************************************************************* ** 函数名称: UART0_Exception ** 功能描述: UART0中断服务程序 ** 输 入: 无 ** ** 输 出: 无 ** ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void __irq UART0_Exception(void) { uint8 temp; temp = U0IIR;
while ((U0LSR & 0x00000001) != 0) { Buf[End++] = U0RBR; if (End >= BUF_SIZE) { End = 0; } } VICVectAddr = 0; // 通知中断控制器中断结束 }
/********************************************************************************************************* ** 函数名称: CommInit ** 功能描述: 初始化通讯模块 ** 输 入: 无 ** 输 出: 无 ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2004年2月26日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void CommInit(void) { uint16 Fdiv; PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 选择管脚为UART0 */
U0LCR = 0x80; /* 允许访问分频因子寄存器 */ Fdiv = (Fpclk / 16) / bps; /* 设置波特率 */ U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; /* 禁止访问分频因子寄存器 */ /* 且设置为8,1,n */ U0IER = 0x00; /* 禁止中断 */ U0FCR = 0x87; /* 初始化FIFO */ Hard = 0; End = 0;
VICIntEnClr = 0xffffffff;
VICVectAddr14 = (uint32)UART0_Exception; VICVectCntl14 = (0x20 | 0x06); VICIntEnable = 1 << 6; U0IER = 0x01; /* 开放中断 */ }
/********************************************************************************************************* ** End Of File ********************************************************************************************************/
2. 后面我把程序改了一下,却又编译不通过,Delay1s我用的是全局变量,怎么会不行了
主程序test.c ------------------------------------------------------------------ ********************************************************************************************************/ #include "config.h" /**************************************************************************** * 名 称:IRQ_Time0() * 功 能:定时器0中断服务程序。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void __irq IRQ_Time0(void) { Delay1s = 1; T0IR = 0x01; // 清除中断标志 VICVectAddr = 0x00; // 通知VIC中断处理结束 }
/**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器0,定时时间为1S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time0Init(void) { /* Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz */ T0PR = 99; // 设置定时器0分频为100分频,得110592Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 110592; // 比较值(1S定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; /* 设置定时器0中断IRQ */ VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断 VICVectCntl11 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0) VICVectAddr11= (uint32)IRQ_Time0; // 设置中断服务程序地址向量 VICIntEnable = 0x00000050; // 使能定时器0中断(中断号4),USRT0中断(中断号6) }
/********************************************************************************************************* ** 函数名称: main ** 功能描述: download 主程序 ** ** 输 入: 无 ** ** 输 出: 无 ** ** 全局变量: 无 ** 调用模块: 无 ** ** 作 者: 陈明计 ** 日 期: 2003年6月5日 **------------------------------------------------------------------------------------------------------- ** 修改人: ** 日 期: **------------------------------------------------------------------------------------------------------ ********************************************************************************************************/ void Run(void); char s[1024]; int Delay1s;
int main(void) { uint32 temp; char i,c,Ch,*p; int j; CommInit(); Time0Init(); BCFG0 = 0x1000ffef; Delay1s=0; while(1) { PrintString("\n\n\nFlash loader Program V1.0 for EasyARM2200 Board\n"); PrintString("1: Chip Erase\n"); PrintString("2: Sector Erase\n"); PrintString("3: Program Chip\n"); PrintString("4: Check\n"); PrintString("5: Run User Program\n"); PrintString("6: Run\n");
PrintString("\n\nNotice:Flash must be in BANK0 and Ram must be in BANK1!\n\n"); PrintString(" default choise is 5 \n"); PrintString(" Please choise.... default choise delay "); j = 9; do { p=&Ch; if (GetCh(p)==TRUE) { PrintString("\b \n"); SendChar(Ch); break; } if ( Delay1s == 1) { Delay1s = 0 ; // 清除1s标志 SendChar('\b'); SendChar(j+'0'); j--; } } while (j > 0); VICIntEnable = 0x00000040; // 定时器0中断(中断号4) 关闭
if (j <= 0 || Ch ==0x0d) { Ch = '5'; }
switch(Ch) { case '1': PrintString("\n Are you sure erased SST39F160 ? y/n? \n"); while(GetCh(p)==FALSE); if (Ch=='y') { if (ChipErase() == TRUE) { PrintString("\nSuccessfully erased SST39F160 !\n"); } else { PrintString("\nChip erase error !!\n"); } } break; case '2': PrintString("\n Please input Sector number(0~511)...\n"); GetString(s); if (sscanf(s, "%d", &temp) != 1) { PrintString("\nInput err!\n"); break; } if (temp >= 512) { PrintString("\nInput err!\n"); break; } if (SectorErase(temp) == TRUE) { PrintString("\nSuccessfully erased SST39F160's sector!\n"); } else { PrintString("\nChip erase error !!\n"); } break; case '3': PrintString("\n Please choise inter 32 hex to down...\n"); while (1) { GetString(s); switch(DownloadLine(s)) { case DOWNLOAD_FINISH : PrintString("\nready and ok\n"); break; case DOWNLOAD_LINE : continue; break; case FILE_FOEMAT_ERR: PrintString("\nThis file is not inter 32 bit hex file!!\n"); break; &nb |