历史上的今天
返回首页

历史上的今天

今天是:2024年12月05日(星期四)

正在发生

2019年12月05日 | 【AT91SAM3S】英倍特串口示例工程05-UART中,串口初始化

2019-12-05 来源:elecfans

在这个示例工程的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函数之后直接使用即可。第一次发送数据时,完成串口的初始化。

推荐阅读

史海拾趣

帝特(DTECH)公司的发展小趣事

帝特在国内市场取得一定成绩后,开始积极拓展国际市场。公司在中国区开设了广州、深圳分公司,并在泰国和马来西亚等地设立了分公司和专卖店。通过全球化的战略布局,帝特的产品销售网络遍布东南亚、中东、非洲和美洲等国家和地区,公司的知名度和市场份额均得到了显著提升。

Burr-Brown公司的发展小趣事

Burr-Brown在音频领域取得了显著的成就。1957年,公司推出的Model 130成为世界上第一个固态运算放大器(op amp),这一技术在现代高级音频系统中仍占据核心地位。1982年,公司发布的16位单片数模转换器(DAC)更是彻底改变了音乐的播放和发行方式,使得音乐可以以高保真度进行复制,并方便地随身携带。Burr-Brown的技术成为优质音频的代名词,赢得了广泛的行业认可。

Holmes Co Inc公司的发展小趣事

Holmes Electronics Inc. 起初是一家小型电子元件制造商,专注于生产基础电阻器和电容器。然而,随着电子行业的快速发展,公司创始人意识到技术创新的重要性。他们投入大量资源进行研发,成功开发出一种新型的高精度温度传感器,这种传感器能够在极端环境下保持高精度,迅速被智能手机、医疗设备和工业自动化系统采用。这一技术创新不仅为公司赢得了市场份额,还奠定了Holmes Electronics在电子行业的技术领先地位。

C-MAX Time Solutions公司的发展小趣事

随着国内市场的饱和,C-MAX Time Solutions公司开始将目光投向国际市场。公司通过设立海外分支机构、参加国际展会等方式,积极推广自己的产品和服务。同时,公司还加大了对国际标准的研究和遵循力度,以确保其产品在全球范围内都能得到广泛认可和应用。这一国际化布局不仅提升了C-MAX的竞争力,也为其未来的发展奠定了坚实基础。

驰芯微(CHIPWISE)公司的发展小趣事

驰芯微公司与明然科技的合作是公司在技术创新方面的又一重要突破。双方共同研发的MCU控制芯片成功应用于主动悬架项目,并在奇瑞的星途瑶光、瑞虎9等车型上取得了重要进展。这一合作不仅提升了国产芯片在高端配置车型中的应用水平,也进一步推动了驰芯微在汽车电子领域的发展。

Federal Custom Cable公司的发展小趣事

随着电子行业的快速发展,电缆产品的技术要求也越来越高。Federal Custom Cable不断引进先进的生产设备和技术,提升电缆产品的性能和质量。公司注重研发创新,投入大量资金用于新产品开发和工艺改进。这些努力使得Federal Custom Cable的电缆产品逐渐在行业内树立了高品质、高性能的形象。

问答坊 | AI 解惑

BOB Pease居然被裁了

Bob Pease is an analog integrated circuit design expert.[1] He has designed several very successful integrated circuits, many of them in continuous production for multiple decades. These include the LM331 voltage to frequency conv ...…

查看全部问答>

JJG52-1999弹簧管式一般压力表压力真空表及真空表检定规程

JJG52-1999弹簧管式一般压力表压力真空表及真空表检定规程…

查看全部问答>

上海 起薪1万 招聘多名 懂韩语 技术支持工程师

Position prefers a Bachelor of Science Degree in Computer Science, Engineering, or equivalent industry related experience. Familiarity with Customer Service Technical Support and/or customer facing/orientated environments is pre ...…

查看全部问答>

winCE下如何检测sim卡是否存在?(.NET)

如题,做一个gprs程序,需要检测sim卡是否存在,怎么搞呢?…

查看全部问答>

evc如何获取CPU序列号

    evc如何获取CPU序列号?…

查看全部问答>

创瑞讯通讯技术(上海)招聘嵌入式软件工程师

Senior Software Engineer (Network Protocol Software) Atheros Communications is a leading developer of semiconductor system solutions. The Atheros software development team is looking for an individual who will lead Protocol Softw ...…

查看全部问答>

STM32外部中断问题

                                 如果我要PA1,PB1,PC1,PD1....同时开启中断的话,如何实现?…

查看全部问答>

印制电路板设计技术指导pdf

印制电路板设计技术指导。…

查看全部问答>

3DG6C

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 请问有人知道3DG6C的引脚怎么分布吗?哪个是e,c,b脚。。。。  …

查看全部问答>

电脑示波器

LPC1766和一个AD转换器做一个USB传输的示波器,LPC1766和AD通讯用并行可以吗? [ 本帖最后由 zhangjun1960 于 2011-9-6 17:32 编辑 ]…

查看全部问答>