ARM中断方式串口编程
- 程序中,修改设置
- 系统模式堆栈处的代码为"MSRCPSR_c,#0x5f"
- 测试成功,在上面上发送16进制数时,每个之间用空格隔开
- 不加前缀
- /
- #include"config.h"
- uint8recver_buffer[8];
- uint8rcv_new;
- /
- *名称:UART0_Init()
- *功能:UART0初始化(通讯波特率115200,8位数据位,
- 1位停止位,无奇偶校验)
- *入口参数:bps串口波特率
- *出口参数:无
- /
- voidUART0_Init(uint32bps)
- {
- uint16Fdiv;
- PINSEL0=0x00000005;//设置串口引脚
- U0LCR=0x83;//置为除数锁存位,进行配置
- Fdiv=(Fpclk>>4)/bps;//设置波特率
- U0DLM=Fp>>8;
- U0DLL=Fdiv&0xff;
- U0LCR=0x03;//清除除数锁存位,并设置工作模式模式
- U0FCR=0x81;//使能FIFO,并设置触发点为8字节
- U0IER=0x01;//允许RBR中断,即接收中断
- }
- /*
- *名称:IRQ_UART0
- *功能:串口UART0中断接收8个字节的数据
- *入口参数:无
- *出口参数:无
- /
- void__irqIRQ_UART0(void)
- {uint8i;
- if(0x04==(U0IIR&0x0F))
- {
- rcv_new=1;//设置接收到新的数据标志,并清除中断标志位
- for(i=0;i<8;i++)
- {
- recver_buffer[i]=U0RBR;//读取FIFO的数据
- }
- VICVectAddr=0;
- }//清除中断
- }
- /
- *名称:Interrupt_Init
- *功能:初始化串口中断,给串口中断选择为向量中断,
- *分配向量通道号1给串口
- *入口参数:无
- *出口参数:无
- /
- voidInterrupt_Init(void)
- {
- VICIntSelect=0x00000000;//设置所有通道为IRQ中断
- VICVectCntl0=0x26;//UART0中断通道分配到IRQslot0,即优先级最高
- VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址
- VICIntEnable=0x00000040;//使能UART0中断
- }
- /
- *名称:UART0_SendByte
- *功能:向串口发送字节数据,并等待发送完毕。
- *入口参数:data要发送的数据
- *出口参数:无
- /
- voidUART0_SendByte(uint8data)
- {
- U0THR=data;
- while(0==(U0LSR&0x40));
- }
- /
- *名称:UART0_SendBuf()
- *功能:通过串口发送一帧数据
- *入口参数:*buffer存放一帧数据
- *出口参数:无
- /
- voidUART0_SendBuf(uint8*buffer)
- {
- uint8*pbuffer;
- uint8i;
- for(pbuffer=buffer,i=0;i<8;i++)
- UART0_SendByte(*(pbuffer++));
- }
- /
- *名称:main()函数
- *功能:上位机接收的数据开头两个字符为0x10,0x11,
- *则原样输出,否次输出0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27
- *入口参数:*buffer存放一帧数据
- *出口参数:无
- /
- intmain(void)
- {
- uint8send_buffer[8]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27};//定义发送帧缓冲区
- UART0_Init(115200);
- Interrupt_Init();
- while(1)
- {
- if(1==rcv_new)//是否已经接收到8Bytes的数据
- {
- rcv_new=0;//清除标志
- if(0x10==recver_buffer[0]&&0x11==recver_buffer[1])
- {
- UART0_SendBuf(send_buffer);
- }
- else
- {
- UART0_SendBuf(recver_buffer);
- }
- }
- }
- return0;
- }
- /*
- EndOfFile
- /
四.用中断编写发送函数
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串口波特率
*出口参数:无
/
voidUART0_Init(uint32 bps)
{
uint16Fdiv;
PINSEL0 = (PINSEL0 & ~(0xf) | 0x05) ;//设置UART0的引脚
U0LCR = 0x83;//置位除数锁存位,配置UART0帧格式
Fdiv = (Fpclk>>4)/bps;//根据波特率计算分频值
U0DLM = Fp>>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.用串口中断发送函数的总程序:
view plaincopy to clipboardprint?
- /Copyright(c)
- 西安邮电学院
- graduateschool
- XNMS实验室
- Author:冀博
- Time:2011年1月20日
- http://blog.csdn.net/tigerjb
- --------------FileInfo-------------------------------------------------------------------------------
- Filename:UART0_while
- LastmodifiedDate:2011-01-20
- LastVersion:1.0
- Descriptions:通过上位机给串口发送8字节数据,ARM2200接收到串口数据后,用中断方式把数据又发送回上位机
- ---------------------------------------------
ARM中断方式串口编 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)