本节将讲一下如何使用MCF52233的demo学习板上的串口资源发送和接收数据,需要进行的硬件连接除了使用USB供电和连接BDM外,还需要使用一条直联串口RS-232电缆把demo板和电脑连接起来。
仿照前几节介绍的方法,新建一个工程,在RAM方式下点debug按钮下载目标代码到RAM执行,可以使用串口调试助手看到运行效果,如下图,注意串口调试助手的设置应该是:
·串口号--根据具体情况设置;
·波特率--115200;
·校验位--none;
·数据位--8位;
·停止位--1位。
即便是一个空工程,也有运行结果,可以知道,虽然没有写任何代码,但是系统或者IDE环境,已经为我们写好了串口初始化代码,并把串口初始化在以上状态,现在我们就找找代码所在的位置。
在工程的虚拟目录“Support Files”下有虚拟目录“Board Specific Code”,打开它,可以找到一个文件“m52233demo_sysinit.c”,打开它,找到函数“SYSTEM_SysInit”,由名字可以知道,这个函数是系统初始化函数,完成一些系统初始化工作。在函数内部可以找到3行代码,它们是:
#if UART_SUPPORT==1
uart_init(0,SYSTEM_CLOCK, TERMINAL_BAUD, 0);
#endif
这句就是uart的初始化函数,并在进入main函数前就已经被调用了。
这个函数位于mcf52233_support.h中,四个参数分别表示串口号、系统时钟、波特率、系统设置,在这里,通过阅读此函数的代码可以知道,虽然函数调用时特指初始化串口0,实际上3个串口都已经被初始化了,当然只要略加小小修改,就可以改成标准的串口初始化函数。
UART模块框图如下:
那么我们来分析一下该函数内部初始化串口0部分的代码。
1、GPIO设置
要使用串口,必须关闭复用的GPIO功能,必须设置寄存器PUAPAR,此寄存器具体说明在datasheet的211页。资源复用顺序,见27页表2-1。
由该表我们知道,如果需要PORTUA工作在UART模式下,则是使用它的1号功能,所以设置PUAPAR为0b00000101,十六进制为0x05,代码如下:
MCF_GPIO_PUAPAR = 0
| MCF_GPIO_PUAPAR_URXD0_URXD0
| MCF_GPIO_PUAPAR_UTXD0_UTXD0;
MCF_GPIO_PUAPAR_URXD0_URXD0和MCF_GPIO_PUAPAR_UTXD0_UTXD0都是已经定义好的常量,运算完与我们预期的结果相同。
GPIO的设置是必不可少的,如果GPIO没有设置,就算UART的寄存器设置完全正确,系统依然没有办法运行。
2、UART命令寄存器初始化设置:
MCF_UART0_UCR = MCF_UART_UCR_RESET_TX;
MCF_UART0_UCR = MCF_UART_UCR_RESET_RX;
MCF_UART0_UCR = MCF_UART_UCR_RESET_MR;
这三句分别设置禁止发送和接收,完成对收发器的复位,设置模式寄存器指针以便进行初始化。
3、UART模式寄存器设置:
MCF_UART0_UMR1 = (0
| MCF_UART_UMR_PM_NONE
| MCF_UART_UMR_BC_8 );
MCF_UART0_UMR1 = (0
| MCF_UART_UMR_CM_NORMAL
| MCF_UART_UMR_SB_STOP_BITS_1);
模式寄存器有两个,分别是UMR1和UMR2,这里设置UMR为无校验位、8位数据格式、正常工作模式,1个停止位。必须和电脑设置相同。
4、UART时钟寄存器设置:
MCF_UART0_UCSR = (0
| MCF_UART_UCSR_RCS_SYS_CLK
| MCF_UART_UCSR_TCS_SYS_CLK);
这里是选择UART波特率使用什么时钟生成,由字面意思可以知道是使用60M系统时钟。
5、UIMR中断屏蔽寄存器设置:
MCF_UART0_UIMR = 0;
这里屏蔽所有中断,默认是不打开任何中断的。
6、波特率设置
ubgs = (uint16)((sysclk*1000)/(baud * 32));
MCF_UART0_UBG1 = (uint8)((ubgs & 0xFF00) >> 8);
MCF_UART0_UBG2 = (uint8)(ubgs & 0x00FF);
UBG1和UBG2分别存储了波特率系数的高低8位,通过计算即可得出。
这样,UART0的初始化就完成了。可以调用一系列函数来实现UART0功能。系统提供给我们的函数有:
·uart_getchar:使用UART接收字符;
·uart_putchar:使用UART发送字符;
现在使用这两个函数完成一个串口调试助手自发自收的功能,代码如下:
#include "support_common.h" /* include peripheral declarations and more */
#include <stdio.h>
int main(void)
{
unsigned char ch;
unsigned long i;
i=100000;
ch='0';
printf("Hello World in C\n\r");
fflush(stdout);
while(1)
{
ch=uart_getchar(0);
while(i--)
{
asm
{
nop
}
}
i=100000;
uart_putchar(0,ch);
}
}
程序运行效果:在发送区写入一个字符,点发送,则在接收区会得到单片机反馈回来的字符。
以下是完整工程下载,注意,本人代码全部调试通过,但是不保证有效性,本人不对代码疑问进行解答。谢谢。
文章评论(0条评论)
登录后参与讨论