simuuart.c
来自「ARM(LPC2214)模拟串口程序」· C语言 代码 · 共 189 行
C
189 行
/****************************************Copyright (c)************************************************
**
** 深圳托普林科技有限公司
** http://www.sztopping.com
**
**----------------------------------------------------------------------------------------------------
名称:SimuUart.c
功能:模拟串口
作者:Albert
日期:2005-04-28
说明:
*****************************************************************************************************/
#include "config.h"
/***************************************************************
功能: 模拟串口收发口定义
***************************************************************/
#define SimuTXD 1<<28 //模拟串口发送口
#define SimuRXD 1<<29 //模拟串口接收口
#define SimuRxBuffSize 1024 //模拟串口接收缓冲区大小
uint8 SimuUartRxBuff[SimuRxBuffSize]; //模拟串口接收缓冲区
uint8 SimuRxIndex=0; //软件串口接收位置指针
uint8 SimuFlag;
/****************************************************************************
* 名 称: IRQ_SimuUart()
* 功 能: 模拟串口接收中断服务函数
* 入口参数:
* 出口参数:
****************************************************************************/
void __irq IRQ_SimuUart(void)
{
static uint8 count,temp;
SimuFlag = 1;
if((T0IR&0x80)!=0) //捕获到起始位
{
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
T0IR =0x80; //复位捕获中断
T0CCR=0x00; //禁止捕获
T0MCR=0x18; //允许MAT1匹配,中断方式
T0EMR=0;
IO0DIR &=~(SimuRXD);
PINSEL1 &= 0xf0ffffff;
}
else if ((T0IR&0x02)!=0) //起始位定时检测
{
T0IR =0x02; //复位匹配中断
if ((IO0PIN&(SimuRXD))==0) //判断起始位是否有效
{
T0MCR=0xc0; //允许MAT2匹配,中断方式
T0EMR=0;
count=0;
temp=0;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0x02;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000; //设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
}
}
else if ((T0IR&0x04)!=0) //数据位定时检测
{
T0IR |=0x04; //复位捕获中断
if (count<8)
{
temp >>=1;
if ((IO0PIN&(SimuRXD))!=0)
{
temp |=0x80;
}
count++;
}
else
{
T0MCR=0x00; //禁止匹配
T0CCR=0xc00; //重新捕捉起始位
T0TCR=0;
T0TC=0; //停止定时器
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000; //设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
SimuUartRxBuff[SimuRxIndex] = temp; // 读取FIFO的数据,并清除中断标志
SimuRxIndex++;
if (SimuRxIndex>=SimuRxBuffSize)
SimuRxIndex=0;
}
}
VICVectAddr = 0x00; // 中断处理结束
}
/****************************************************************************
* 名 称: InitSimuUart()
* 功 能: 初始化模拟串口
* 入口参数:
* 出口参数:
****************************************************************************/
void InitSimuUart(uint16 Baud)
{
PINSEL1 &= 0xf0ffffff;
PINSEL1 |= 0x08000000; //设定TXD引脚工作CPIO,RXD引脚工作在捕捉(3)模式
IO0DIR |= SimuTXD;
IO0SET |= SimuTXD; //初始化TXD引脚
T0TC=0;
T0TCR=0x03;
T0TCR=0;
T0PR=0;
T0PC=0; //不分频
T0CCR=0xc00; //设定捕捉CAP3下降沿并中断
T0MR1=11059200/(Baud*2);
T0MR2=11059200/Baud;
T0IR=0xff;
VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
VICVectCntl5 = 0x24; // 软串口中断通道分配到IRQ slot 1,
VICVectAddr5 = (uint32)IRQ_SimuUart; // 设置软串口向量地址
VICIntEnable |= 0x00000010; // 使能中断
T0EMR=0;
}
/****************************************************************************
* 名 称: SimuSendByte
* 功 能: 模拟串口发送字符
* 入口参数:
* 出口参数:
****************************************************************************/
void SimuSendByte(uint8 SChar)
{
unsigned char temp,count;
T0CCR=0; //禁止接收捕获
T0TC=0;
T0TCR=0x03; //启动定时器
T0TCR=0x01; //启动定时器
IO0CLR |= SimuTXD; //发送起始位
T0EMR=0x0300; //发生匹配后输出翻转
T0MCR=0x80; //设定MR2发生匹配时TC复位;
temp=T0EMR&0x004;
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
for (count=0;count<9;count++)
{
if (count<8)
{
if ((SChar&0x01)!=0)
IO0SET |=SimuTXD;
else
IO0CLR |=SimuTXD;
SChar >>=1;
}
else
IO0SET |=SimuTXD; //发送停止位
while (temp==(T0EMR&0x004));
temp=T0EMR&0x004;
}
T0TCR=0x00; //停止定时器
T0CCR=0xc00; //允许接收捕获
T0TC=0;
}
/****************************************************************************
* 名 称: SimuSendStr
* 功 能: 模拟串口发送字符串
* 入口参数:
* 出口参数:
****************************************************************************/
void SimuSendStr(uint8 *buf,uint16 lenght)
{
uint16 i;
for (i=0;i<lenght;i++)
{
SimuSendByte(*(buf+i));
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?