打印
[ZLG-ARM]

请教串口中断的问题

[复制链接]
1845|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwen01|  楼主 | 2007-8-31 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
 刚在学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

相关帖子

沙发
zlgARM| | 2007-9-2 09:49 | 只看该作者

zwen01

您好:
  建议您直接拿一个前后台的串口例程来做实验,目的是通过最简单的例子来理解UART的结构和使用方法。

使用特权

评论回复
板凳
zwen01|  楼主 | 2007-9-4 07:45 | 只看该作者

回复

    我就是直接用贵司光盘下面的/开发板出厂编程程序/FLASHDOWN修改了一下,这个实验就是前后台工作的。

使用特权

评论回复
地板
zlgARM| | 2007-9-4 10:18 | 只看该作者

zwen01

您好:
    请直接使用单独针对UART而设计的Demo例程。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

0

粉丝