本帖最后由 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;
- }
|