搜索
bottom↓
回复: 3

LPC2132 串口中断通信

[复制链接]

出0入0汤圆

发表于 2011-8-23 18:25:12 | 显示全部楼层 |阅读模式
#include <stdio.h>
#include "LPC213X.h"                        /* LPC21xx definitions */


/*----------------------------------------------------------*\
| TYPE DEFINE                                              |
\*----------------------------------------------------------*/
typedef char               S8;
typedef unsigned char      U8;
typedef short              S16;
typedef unsigned short     U16;
typedef int                S32;
typedef unsigned int       U32;
typedef long long          S64;
typedef unsigned long long U64;
typedef unsigned char      BIT;
typedef unsigned int       BOOL;

#define Fosc (12000000)    //晶振频率,10MHz~25MHz,应当与实际一至
#define Fcclk (Fosc * 5)   //60M 系统频率,必须为Fosc的整数倍(1~32),且<=70MHZ
#define Fcco (Fcclk * 4)   //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz
#define Fpclk (Fcclk / 4) * 1 //016.5888,VPB时钟频率,只能为(Fcclk / 4)的1 ~ 4倍



U8 recver_buffer[14];
U8 rcv_new;
U32 GetNum;

/*----------------------------------------------------------*\
| Delay ns                                                 |
\*----------------------------------------------------------*/
void DelayNS (U32 dly) {
        U32 i;
       
        for ( ; dly>0; dly--)
                for (i=0; i<500; i++);

        }
/*----------------------------------------------------------*\
| UART0 Initial                                            |
\*----------------------------------------------------------*/
void  UART0_init(void)        {
//        unsigned short int fdiv;

        PINSEL0 |= 0x00000005;               // 设置I/O连接到UART0

        U0LCR = 0x83;                        // DLAB = 1,可设置波特率
        U0DLM = 0x00;
        U0DLL = 0x47;
        U0FDR = 0x83;
        U0LCR = 0x03;
        }

/*----------------------------------------------------------*\
| PLL init                                           |
\*----------------------------------------------------------*/
void PLL_Init(void)
{
  

    while (!(PLLSTAT & 0x00000400)) ;   // test Lock bit  判断PLOCK 为锁定?1锁定到制定的频lv
        PLLCFG = 0x00000024;            // Set multiplier and divider of PLL to give ;CCLK=60MHz; P=2,M=5
    PLLCON = 0x00000003;    // Connect the PLL PLL连接和PLL使能 PLL控制寄存器
    PLLFEED = 0x000000AA;    //Update PLL registers
    PLLFEED = 0x00000055;    //PL馈送寄存器
    VPBDIV = 0x00000000;     //设置VPB总线时钟为处理器时钟(cclk)的1/4 = 15M

}


/*----------------------------------------------------------*\
| UART0 Send Char                                          |
\*----------------------------------------------------------*/
void  UART0_PutCh(unsigned char Ch)        {
        U0THR = Ch;                            // 发送数据
        while( (U0LSR&0x40)==0 );          // 等待数据发送完毕
        DelayNS(5);
        }

/*----------------------------------------------------------*\
| UART0 Send String                                        |
\*----------------------------------------------------------*/
void  UART0_PutStr(unsigned char const *str,unsigned int SendNum) {
        unsigned int i;
        for(i=0;i<SendNum;i++)
                        UART0_PutCh(*str++);
}


/*----------------------------------------------------------*\
| UART1 Get Byte                                           |
\*----------------------------------------------------------*/
U8 UART0_GetByte (void) {
        U8 rcv_dat;       
        while ((U0LSR & 0x01) == 0);
        rcv_dat = U0RBR;       
        return (rcv_dat);       
        }
/*----------------------------------------------------------*\
| UART1 Get String                                         |
\*----------------------------------------------------------*/
void UART0_GetStr(U8 *s) {
        while( (*s = UART0_GetByte()) != '\n' ) s++;
        }

/***********UART0中断接收程序***********/
void IRQ_UART0(void)   __irq
{   
    GetNum = 0;
      
    while ((U0IIR & 0x01) == 0){                                        /*  判断是否有中断挂起          */
        switch (U0IIR & 0x0E){
                                    
                        case 0x06:                   //发生RLS中断,读U0LSR中断复位        
                    break;
                                                                                 
                case 0x04:                                                  /*  接收数据可用中断*/
                    rcv_new = 1;                                            /*  置接收新数据标志 */
                    for (GetNum = 0; GetNum < 14; GetNum++)                                /*  连续接收14个字节  */
                                {                 
                        recver_buffer[GetNum] = U0RBR;
                           }
                    break;
            
            case 0x0C:                                               /*  字符超时中断                */
                rcv_new = 1;
                while ((U0LSR & 0x01) == 0x01)                                /*  判断数据是否接收完毕 */
                                {                     
                    recver_buffer[GetNum] = U0RBR;
                    GetNum++;
                }
                break;
                               
                case 0x02:          //发生THRE中断,读U0IIR或写U0THR中断复位
                    break;
                                                
            default:
                break;
        }
    }
                    
        VICVectAddr = 0x00;        //清除中断

}   
void IRQEnable(void)

{
    int temp;
    __asm
        {
              MRS temp,CPSR
              BIC temp,temp,#0x80
              MSR CPSR_c,temp
         }
}


void Interrupt_Init (void)

{
          VICIntSelect = 0x00000000;            // 设置所有通道为IRQ中断 ,置1为FIQ中断,置0为IRQ中断   
           VICVectCntl0 = (0x20 | 6);            // UART0中断通道分配到IRQ slot0 即获得最高中断优先级
           VICVectAddr0 = (int)IRQ_UART0;        // 设置UART0向量地址         
           VICIntEnable = 1 << 6;                // 使能串口UART0中断
}


/*----------------------------------------------------------*\
| MAIN ENTRY                                               |
\*----------------------------------------------------------*/
int main(void) {
        U0FCR = 0xC7;                        // 使能FIFO,并设置触发点为14
    U0IER = 0x07;                        // 允许RBR中断,即接收中断
        rcv_new = 1;
        PLL_Init();
    UART0_init();        //串口初始化

        Interrupt_Init();   //中断向量初始化
        while(1)
        {

                if(rcv_new == 1)
                {
                        rcv_new = 0;
                        UART0_PutStr(recver_buffer,3);
                }

        }
}
/*----------------------------------------------------------*\
| END OF FILE                                              |
\*----------------------------------------------------------*/

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-2-13 13:12:04 | 显示全部楼层
回复【楼主位】BSMGood  
-----------------------------------------------------------------------

请问您此代码调试通过了吗,是否正常工作呢?谢谢,我也在用LPC2132做一个东西。

出0入0汤圆

发表于 2012-2-14 10:28:28 | 显示全部楼层
代码挺好,挺规范的,在我看来--我还差的很远啊!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表