• 沒有找到結果。

5.UART构件的多字节接收功能函数:UartReN

uint8 UartReN(uint8 uartNo, uint8 n, uint8 ch[]) {

91 {

return 1;

} m++;

}

return 0;

}

4.4.4 UART构件的测试工程

如第 3 章的“3.4 CW 工程文件组织”一节所述,嵌入式软件中,main.c 和 isr.c 这两 个文件反映了软件系统的整体执行流程。当系统启动并初始化后,程序根据 main.c 中定 义的主循环顺序执行;一旦遇到中断请求,立即转去执行 isr.c 中定义的相应中断处理程 序;当中断处理程序运行结束后,再返回中断处继续顺序执行。

在 main.c 和 isr.c 中,可通过调用上一小节介绍的 5 个功能接口函数实现 UART 模块 收发数据,实现方式有两种:查询方式和中断方式。

光盘中的 UART 构件的测试工程“…\ Chap04_UART+DMA\01-UartSrchRe”采用查 询方式实现:UART0 模块首先向 PC 机发送字符串“Hello! World!”,然后等待接收 PC 机 从串口发送来的数据,若成功接收到 1 个数据,则立即将该数据回发给 PC 机,随后继续 等待接收 1 个数据并回发,如此循环。主函数文件 main.c 如下编写:

//---*

// 工 程 名: UartSrchRe * // 硬件连接: 接PC机串口 * // 程序描述: 使用UART0和PC机通信 * // 初始时发送"Hello! World! "到PC机1次 * // 同时等待接收PC机发送的数据,当接收到了来自PC机的数据后立即回发*

// 目 的: 初步掌握利用查询方式进行串行通信的基本知识 * // 说 明: 波特率为38400,使用UART0口 * //---苏州大学飞思卡尔嵌入式系统实验室2009年---*

#include "includes.h" //头文件 uint8 msg[14]= "Hello! World! ";

int main(void) {

uint8 m,fp;

//1.关总中断

DisableInterrupts();

//2.UART初始化

//使用UART0模块,使用系统时钟作为UART的时钟源 //波特率为38400,初始化时禁止接收中断

UartInit(0,SYSTEM_CLOCK,38400,0);

//3.开总中断 EnableInterrupts();

//4.发送msg

UartSendN(0,14,msg);

//5.主循环

第 4 章 异步串行通信与直接存储器访问 DMA

92 while (1)

{

//等待成功接收串口的数据 m = UartRe1(0, &fp);

if(0 == fp)

{ //成功接收串口数据,则立即回发 UartSend1(0, m);

} }

return 0;

}

在本书的光盘中,有两个用来测试串行通信的高端程序,运行界面如图 4-9 和 4-10 所示,其文件在“... \测试工具”文件夹内。建议读者充分使用这些有效工具。

图4-9 串口调试工具软件界面 图4-10 串行通信收发测试软件界面

4.5 ColdFire第一个带有中断功能的实例

采用中断方式收发数据时,需编写中断处理程序。在 CW 环境下使用 ColdFire 芯片 中断的步骤是:

(1)在 main.c 中,依照“关总中断→开模块中断→开总中断”的顺序打开模块中断;

(2)在 isr.c 文件中,编写中断服务程序;

(3)在 vectors.s 文件中,修改中断向量表;

ColdFire 单片机开始运行后,系统状态寄存器 SR 中 16、17 和 18 这三位的默认值都 是“1”,即关闭所有中断,所以要使用中断,必须更改这三位的值。它就相当于一个总闸,

如果总闸不开,所有中断都不可能发生。操作状态寄存器 SR,需要汇编指令来实现:

move.w #0x2700,sr //关总中断 move.w #0x2000,sr //开总中断

为了方便代码移植,在 isr.h 文件中做了如下定义:

#define DisableInterrupts() asm(move.w #0x2700,sr) //关总中断

#define EnableInterrupts() asm(move.w #0x2000,sr) //开总中断

93

下面以 UART0 接收中断为例,实现以下功能:主程序每隔 1 秒让 UART0 模块向 PC 机发送用于握手的字符串“Hello! World!”;同时,串口等待接收从 PC 机发来的数据,一 旦接到数据,马上将该数据回发给 PC 机。串口接收程序使用中断来实现,中断处理程序 执行完毕后,又回到主程序,继续每隔 1 秒向 PC 机发送一遍“Hello! World!”。