打印
[uCOS/RTOS]

UART0串口编程系列(二)-串口编程(UART0)之中断方式(下)

[复制链接]
2079|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
无限幻想|  楼主 | 2013-8-20 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xlhtracy 于 2013-8-21 13:53 编辑

四.用中断编写发送函数

1.中断初始化

同上和用中断接收函数时的中断初始化是一样的

2.串口初始化

1>串口初始化流程:

l  设置I/O引脚连接到UART0

l   置位除数锁存位,配置UART0帧格式

l  根据波特率计算分频值

l  设置波特率

l  清除除数锁存位,并设置工作模式

l  使能FIFO,并使TxFIFO复位

l  使能THRE中断

2>串口初始化函数:

    /**********************************************************

* 名称:                    UART0_Init

* 功能:                    UART0初始化 通讯波特率115200,8位数据位,1位停止位,无奇偶校验

*                                  使能TxFIFO,和THRE中断

* 入口参数:            bps        串口波特率

* 出口参数:            无

**********************************************************/

void      UART0_Init(uint32 bps)

{

    uint16  Fdiv;

    PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;  //设置UART0的引脚

    U0LCR = 0x83;         //置位除数锁存位,配置UART0帧格式

    Fdiv = (Fpclk>>4)/bps;  //根据波特率计算分频值

    U0DLM = Fdiv>>8;     //设置波特率

    U0DLL = Fdiv%256;

    U0LCR = 0x03;        // 清除除数锁存位,并设置工作模式

    U0FCR = 0x05;       // 使能TxFIFO,并使TxFIFO复位

    U0IER = 0x02;       // 使能THRE中断

  

}

3中断服务函数:

  1>中断服务函数流程:

l  清除串口中断标识寄存器

l  清除中断控制标识寄存器

  2>中断发送服务函数程序:

/**********************************************************

* 名    称:            UART0_Exception

* 功    能:            串口发送中断

* 入口参数:            无

* 出口参数:            data              发送的数据

**********************************************************/

void   __irq IRQ_UART0(void)

{  

  

uint32 data;

data = U0IIR;                                                 //清除中断表示寄存器标志

VICVectAddr = 0;                                              //清除中断

}

4.   用串口中断发送函数的总程序:

  • /**********************************************************************************
  • ** Modified by:         TIGER0-JOHN
  • ** Modified date:       2011-1-21
  • ** Version:             2.0   
  • ** Descriptions:        测试成功
  •                         在用中断的时候在Startup.S文件中的InitStack子程序中,修改设置
  •                         系统模式堆栈处的代码为"MSR CPSR_c,#0x5f"
  •                         测试成功 ,在上面上发送16进制数时,每个之间用空格隔开
  •                         不加前缀
  • ********************************************************************************/  
  • #include "config.h"  
  • uint8 recver_buffer[8];      
  • uint8 rcv_new;      
  • /****************************************************************************
  • * 名称:           UART0_Init
  • * 功能:           UART0初始化 通讯波特率115200,8位数据位,1位停止位,无奇偶校验
  • *                   使能TxFIFO,和THRE中断
  • * 入口参数:     bps     串口波特率
  • * 出口参数:     无
  • ****************************************************************************/  
  • void    UART0_Init(uint32 bps)  
  • {  
  •    
  •     uint16  Fdiv;  
  •     PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;        //设置UART0的引脚  
  •     U0LCR = 0x83;                                //置位除数锁存位,配置UART0帧格式  
  •     Fdiv = (Fpclk>>4)/bps;                       //根据波特率计算分频值  
  •     U0DLM = Fdiv>>8;                            //设置波特率  
  •     U0DLL = Fdiv%256;  
  •     U0LCR = 0x03;                               //  清除除数锁存位,并设置工作模式  
  •     U0FCR = 0x05;                               // 使能TxFIFO,并使TxFIFO复位  
  •     U0IER = 0x02;                               // 使能THRE中断  
  •      
  • }  
  • /****************************************************************************
  • * 名    称:       UART0_Exception
  • * 功    能:       串口发送中断
  • * 入口参数:     无
  • * 出口参数:     data        发送的数据
  • ****************************************************************************/  
  • void   __irq IRQ_UART0(void)  
  • {     
  •      
  •     uint32 data;  
  •     data = U0IIR;                                   //清除中断表示寄存器标志  
  •     VICVectAddr = 0;                                //清除中断  
  •       
  •    
  • }   
  • /**********************************************************
  • * 名称:          Interrupt_Init
  • * 功能:          初始化串口中断,给串口中断选择为向量中断,
  • *                 分配向量通道号1给串口                        
  • * 入口参数:      无
  • * 出口参数:      无
  • **********************************************************/  
  • void Interrupt_Init (void)  
  • {  
  •     VICIntSelect = 0x00000000;              // 设置所有通道为IRQ中断  
  •     VICVectCntl0 = 0x26;                    // UART0中断通道分配到IRQ slot 0,即优先级最高  
  •     VICVectAddr0 = (int)IRQ_UART0;          // 设置UART0向量地址  
  •     VICIntEnable = 0x00000040;              // 使能UART0中断  
  •                  
  • }  
  • /**********************************************************
  • * 名    称:            UART0_RcvByte
  • * 功    能:            用查询方式接收一字节的数据
  • * 入口参数:            无
  • * 出口参数:            data              要接收的数据
  • **********************************************************/  
  • uint8   UART0_RcvByte(void)  
  • {  
  •     uint8 rcv_data ;  
  •     while((U0LSR&0X01)==0);         //等待数据到达  
  •     rcv_data = U0RBR;               //从U0RBR中读出接收到的数据  
  •     return  rcv_data;               //返回接收到的数据  
  •   
  • }  
  • /**********************************************************
  • * 名称:       UART0_RecBuf()
  • * 功能:       接收串口发送过来的帧数据,            
  • * 入口参数: *buffer  存放一帧数据
  • * 出口参数: 无
  • **********************************************************/  
  • void UART0_RecBuf (uint8 *buffer)  
  • {  
  •     uint8 *pbuffer;  
  •     uint8  i;  
  •     for(pbuffer = buffer, i = 0;i < 8; i++)  
  •      {  
  •         *(pbuffer++) = UART0_RcvByte();  
  •      }  
  • }  
  • /**********************************************************
  • * 名称:       main()函数
  • * 功能:       上位机接收的数据开头两个字符为0x10,0x11,
  • *               则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
  • * 入口参数: *buffer  存放一帧数据
  • * 出口参数: 无
  • **********************************************************/  
  •   
  • int main (void)  
  • {   
  •     uint8 i;                                 
  •     uint8 send_buffer[8] ={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};  //定义发送帧缓冲区  
  •     UART0_Init(115200);  
  •     Interrupt_Init();  
  •     while(1)  
  •         {  
  •             UART0_RecBuf(recver_buffer);                //接收8字节数据  
  •             if(0x10 ==recver_buffer[0] && 0x11 == recver_buffer[1])  
  •                 {   
  •                     for(i = 0;i < 8 ;i++)  
  •                     {  
  •                         U0THR = send_buffer;         //用中断发送每次8字节  
  •                     }     
  •                 }  
  •             else  
  •                 {  
  •                     for(i = 0;i < 8;i++)                //用中断发送每次8字节  
  •                     {  
  •                         U0THR = recver_buffer;  
  •                     }  
  •                 }   
  •         }         
  •      return 0;  
  • }  

相关帖子

沙发
漂流的船儿| | 2013-8-22 11:12 | 只看该作者
受教了!谢谢分享

使用特权

评论回复
板凳
gxbllm| | 2013-8-23 19:41 | 只看该作者
分析得挺详细,不错

使用特权

评论回复
地板
zdhlixiang2006| | 2013-9-6 22:31 | 只看该作者
嗯,用来教学挺不错的,实际中用呢。呵呵

使用特权

评论回复
5
lhl51311| | 2013-9-8 22:27 | 只看该作者
还以为是基于UCOSII的

使用特权

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

本版积分规则

14

主题

27

帖子

0

粉丝