arm串口收发采用中断方式

arm串口收发采用中断方式,第1张

看一下uart通信

具体过程:

1.设置好uart控制寄存器,自己定义收发缓冲区,以及收发函数,一个两个串口无所谓

2.写好中断向量表,自己查查一下uart0,uart2,uart2的中断号,例如

void __irq IRQ_Handler(void)

{

switch(INTOFFSET)

{

case 28: //INT_UART0

Uart0_Int()

break

case 23: //INT_UART1

Uart1_Int()

break

case 15: //INT_UART2

Uart2_Int()

break

}

}

3.用公母线将arm与pc相连,打开pc的超级中断,将arm与pc的比特率设置为相同的就可以了。

清除接收中断预处理位,和USART_ClearFlag()

函数功能是一样的,至于为什么要设置两个函数

可能是为了兼容其他系列,或者为以后升级预留使用

从字面上来理解,USART_ClearFlag()是清除标志位,标志位置1并不意味着产生中断。

而USART_ClearTPendingBit()则时清除中断预处理位,即产生了中断。

除了一些特殊的中断在进入中断时自动清除中断标志位,一般的中断在退出中断时都要手动清除中断标志位,以免重复进入中断。

一般情况下,如果没有设置DMA传输,是每次接收一个字节后就会产生一次中断。

U0IER=0x02 //使能THRE中断

这句没使能接收中断吧,接收中断正常吗?

首先要知道,串口0只有一个中断入口,中断发生后,需要对中断标识寄存器进行判断以确定中断类型再进行相应处理。

如:

__irq void uart0()

{

if((U0IIR&0x0F)==0x02)

发送数据 //发送中断

if((U0IIR&0x0F)==0x04)

接收数据 //接收中断

.

.

.

VICVectAddr=0//中断结束

}

另外,实时性要求不是特别高的情况下,一般发送用查询方式即可。

/*

*********************************************************************************************************

** 函数名称 :IRQ_UART0()

** 函数功能 :串口0接收中断服务程序

** 入口参数 :无

** 出口参数 :无

*********************************************************************************************************

*/

void __irq IRQ_UART0 (void)

{

uint8 i

if ((U0IIR &0x0F) == 0x04)

rcv_new = 1 // 设置接收到新的数据标志

for (i=0i<8i++)

{

rcv_buf[i] = U0RBR // 读取FIFO的数据,并清除中断

}

VICVectAddr = 0x00 // 中断处理结束

}

/*

*********************************************************************************************************

** 函数名称 :UART0_SendByte()

** 函数功能 :向串口0发送1字节数据

** 入口参数 :dat 要发送的数据

** 出口参数 :无

*********************************************************************************************************

*/

void UART0_SendByte (uint8 dat)

{

U0THR = dat// 要发送的数据

}

/*

*********************************************************************************************************

** 函数名称 :UART0_SendBuf()

** 函数功能 :向串口发送8字节数据

** 入口参数 :dat 要发送的数据

** 出口参数 :无

*********************************************************************************************************

*/

void UART0_SendBuf (void)

{

uint8 i

for (i=0i<8i++)

UART0_SendByte(rcv_buf[i])

while ((U0LSR &0x20) == 0)// 等待数据发送完毕

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11644308.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存