打印

ARM7的串口调试程序错误?

[复制链接]
2474|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjucsd|  楼主 | 2011-4-21 08:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "config.h"
#include "math.h"
#include "mydef.h"      // 自定义的常数
#include "myfun.h"      // 自定义的函数
#include "myvrb.h"      // 自定义的各种变量

// 主程序
int main(void)
{
    meter_init();   // 开机时的上电初始化操作
   
    while(1)
    {
  if(DATASEND==1)
  { // 把数据发给上位机
   DATASEND=0;
            datatoe8();
  }
  
  if(DATAREV==1)
  { // 处理来自上位机的数据
   DATAREV=0;
            e8todata();
  }
  
  if(UART0INIT==1)
  {
   UART0INIT=0;
   UART0_Init();  // 串行通讯口初始化。
  }
}

return(0);
}

// 开机时的上电初始化操作
void meter_init(void)
{
    uint8 i;
// 开机时各IO口设置
PINSEL0=0x00000005;  // 引脚功能设定 P0.0为TxD P0.1为RxD 其余P0口为GPIO
PINSEL1=0x00000000;  // 引脚功能设定 P1口为GPIO

// 空IO口全部为输出低电平
IO0DIR=0x3BF3FFCC;  // 0为输入,1为输出
IO1DIR=0x03FE0000;  //
IO2DIR=0xE3DF0000;  //
IO3DIR=0x30000000;

IO0SET=0x0080030C;      //相应位置高电平
IO1SET=0x00880000;
IO2SET=0x00000000;
IO3SET=0x30000000;

Delay(20);

IO0CLR=0x3F73FCF0;     //相应位清零
IO1CLR=0x03760000;
IO2CLR=0xE3DF0000;
IO3CLR=0x00000000;

Delay(600);
IO3CLR |= BEEP;    //P3.28清零      停止蜂鸣器    高电平有效
Delay(10);

for(i=0;i<14;i++)
{
    databuff[i]=0;
}
UART0_Init();   // 串行通讯口初始化。

VICIntSelect=0x00000000;     //0:对应的中断请求分配为IRQ  1:对应的中断请求分配为FIQ。
}
// 串行通讯口0初始化操作,使用半双工方式
void UART0_Init(void)
{
uint16 Fdiv;

U0LCR=0x80;                 //8位为高电平的时候,可以设置波特率
Fdiv=(Fpclk/16)/57600;  // 波特率为57600
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;        // 8个数据位,1个起始位,1个结束位。
U0FCR=0xC1;        // 使能FIFO,14字节触发。
U0IER=0x01;        // 允许接收中断

DATAREV=0;                              //有数据从上位机收到标志
DATASEND=0;                             //有数据要向上位机发送标志
UART0INIT=0;                            //数据发送完毕标志和还有后续数据标志

VICVectCntl7=0x26;
VICVectAddr7=(uint32)IRQ_UART0;
COMENABLE;                              // 使能串行通讯中断
}
// 串行通讯中断响应程序
void __irq  IRQ_UART0(void)
{
uint8 i;

if((U0IER&0x02)==0x02)
{ // 串行通讯中断之发送中断
  if(U0LSR&0x40)
  { // 检测到发送器为空
   U0FCR|=0x04;
   U0IER=0x00;  // 改为允许接收中断
   UART0INIT=1;
  }
}

if((U0IER&0x01)==0x01)
{ // 串行通讯中断之接收中断
  if(0x04==(U0IIR&0x0f))
  {
     U0IER=0x02;      // 改为允许发送中断。
     DATAREV=1;      // 收到一帧数据
  }
  
  for(i=0;i<14;i++)
   databuff[i]=U0RBR;  // 只要读走数据就可以清除中断标志
  U0FCR|=0x02;
}

VICVectAddr = 0x00;              // 中断处理结束
}
// 向上位机发送数据
void datatoe8(void)
{
uint8 i;

for(i=0;i<14;i++)
  U0THR=databuff[i];
}
// 处理来自上位机的数据
void e8todata(void)
{
// 首先检测收到的数据是否是正确格式的一帧数据
if(databuff[0] == 0xa3)
{ // 是正确的一帧数据
     switch(databuff[1])
     {
        case 0x01:     //参数发送指令
           databuff[0] = 0xa3;
           databuff[1] = 0x81;
           databuff[2] = 0x00;
           databuff[3] = 0x24;
           databuff[4] = 0x16;
           databuff[5] = 0x00;
           databuff[6] = 0x00;
           databuff[7] = 0x00;
           databuff[8] = 0x00;
           databuff[9] = 0x00;
           databuff[10]= 0x00;
           databuff[11]= 0x00;
           databuff[12]= 0x00;
           databuff[13]= 0x00;
           
           DATASEND=1;
        break;
        
        case 0x02:     //测试数据指令
           databuff[0] = 0xa3;
           databuff[1] = 0x82;
           databuff[2] = 0x01;
           databuff[3] = 0x02;
           databuff[4] = 0x03;
           databuff[5] = 0x04;
           databuff[6] = 0x05;
           databuff[7] = 0x06;
           databuff[8] = 0x15;
           databuff[9] = 0x16;
           databuff[10]= 0x00;
           databuff[11]= 0x00;
           databuff[12]= 0x00;
           databuff[13]= 0x00;
           
           DATASEND=1;
        break;
        
        case 0x03:     //去皮指令
           databuff[0] = 0xa3;
           databuff[1] = 0x83;
           databuff[2] = 0x00;
           databuff[3] = 0x26;
           databuff[4] = 0x16;
           databuff[5] = 0x00;
           databuff[6] = 0x00;
           databuff[7] = 0x00;
           databuff[8] = 0x00;
           databuff[9] = 0x00;
           databuff[10]= 0x00;
           databuff[11]= 0x00;
           databuff[12]= 0x00;
           databuff[13]= 0x00;
           
           DATASEND=1;
        break;
        
        default:      //错误指令
           UART0_Init();  // 串行通讯口初始化
        break;
     }
}
else
{
  UART0_Init();  // 串行通讯口初始化
}
}
void Delay(uint16 dly)
{
uint16 i;

while(dly)
{
  for(i=0;i<100;i++);
  dly--;
}
}

各位牛人,帮忙看看我这通讯程序,哪里出错了?

相关帖子

沙发
zjucsd|  楼主 | 2011-4-21 14:05 | 只看该作者
发现程序跳不进中断,请问是什么原因呀!

使用特权

评论回复
板凳
xinzha| | 2011-4-21 14:33 | 只看该作者
在哪儿使能了内核级的中断?

使用特权

评论回复
地板
zjucsd|  楼主 | 2011-4-21 16:08 | 只看该作者
内核级的中断,那个是呀?

使用特权

评论回复
5
xinzha| | 2011-4-21 16:15 | 只看该作者
__asm
    {
        MRS tmp, CPSR
        BIC tmp, tmp, #0x80
        MSR CPSR_c, tmp
    }

使用特权

评论回复
6
xinzha| | 2011-4-21 16:16 | 只看该作者
如果你有debug工具的话,可以看一下当前cpsr的状态

使用特权

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

本版积分规则

100

主题

351

帖子

3

粉丝