博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的
阅读量:6497 次
发布时间:2019-06-24

本文共 1552 字,大约阅读时间需要 5 分钟。

在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置。直接使用了printf这个东西进行输出。将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来。说明这个虽然没有显式初始化的串口,确实已经被初始化好了。

跟踪可发现,uart的功能函数都在uart_console.c文件中实现。但是这些功能到底是在那里加入到主程序里边的,在什么时候执行的,我却没找到。这个问题困扰了我好久。

知道今天,再次看这个程序的时候才发现点眉目。

首先,要理解一个东西就是:printf的功能,是通过对函数fputc的重定义来实现的。

在这个工程中,fputc函数的实现是在retarget.c文件中实现的。具体代码是这样的:

int fputc(int ch, FILE *f){    if ((f == stdout) || (f == stderr))    {        UART_PutChar( ch ) ;        return ch ;    }    else    {        return EOF ;    }}

即,调用了函数uart_console.c文件中UART_PutChar来发送字符串。

其次,找出来在哪里对串口进行初始化的。

MCU启动后,加载向量表,执行_Reset_Handler进入main函数。在main函数中,直接调用使用了串口功能的printf进行输出。这里看似没有对串口进行初始化。其实,这个例子里边对串口初始化使用了个很独特的放大即:用到的时候再初始化。如果整个工程都没有用到串口功能,这个串口初始化就不去进行。

首先printf调用了fputc完成其功能。而fputc的功能是由UART_PutChar实现的。

我们看看UART_PutChar这个函数,他的实现是这样的:

extern void UART_PutChar( uint8_t c ){Uart *pUart=CONSOLE_USART ;if ( !_ucIsConsoleInitialized ){UART_Configure(CONSOLE_BAUDRATE, BOARD_MCK);}/* Wait for the transmitter to be ready */while ( (pUart->UART_SR & UART_SR_TXEMPTY) == 0 ) ;/* Send character */pUart->UART_THR=c ;}

这里有一个变量ucIsConsoleInitialized,是一个全局变量。表示串口是否已经进行了初始化:ucIsConsoleInitialized为0时,说明串口还未完成初始化,其他值时说明串口已经完成初始化。

第一次使用串口时,串口没有初始化。在这里就会调用UART_Configure函数对串口进行初始化操作。之后就不再进行串口的初始化而是直接使用了。

总结以上步骤,UART的初始化调用过程是这样的:

Printf----fputc--- UART_PutChar--- UART_Configure。初始化完成。

那么,fputc是在什么时候加载到咱们写的程序中来的呢?

我们可以看到,在_Reset_Handler中有个跳转到__main()的语句,而我们写的入口函数是main()。在这里__main()是MDK库中提供的一个函数,在这里完成了库的加载。Fputc属于标准库的内容,因此我判断fputc是在这里加载到咱们写的程序中来的。

也就是说,进入main函数之前,printf功能已经完成了。进入main函数之后直接使用即可。第一次发送数据时,完成串口的初始化

转载地址:http://ldcyo.baihongyu.com/

你可能感兴趣的文章
python xml rpc
查看>>
Java设置以及获取JavaBean私有属性进阶
查看>>
db2表结构导出导入,数据库备份
查看>>
策略模式
查看>>
OrderOnline——项目概述
查看>>
POJ-2739(Water)
查看>>
【转】第三节 UNIX文件系统结构
查看>>
为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录
查看>>
Angular7里面实现 debounce search
查看>>
Linux 内核链表
查看>>
git学习------>Git 分支管理最佳实践
查看>>
括号和出栈所有序列问题
查看>>
第一次操刀数据库分表的教训与经验
查看>>
录音声音小
查看>>
Ubuntu 12.04 安装 Chrome浏览器
查看>>
java 反射
查看>>
ORACLE物化视图(物理视图)
查看>>
android 读取json数据(遍历JSONObject和JSONArray)(转)
查看>>
UIScrollView中的手势
查看>>
递归和迭代的差别
查看>>