查看: 949|回复: 0

【SAMV71 XPlained】+MDK 5.1+USART

[复制链接]

该用户从未签到

发表于 2015-12-17 09:37:00 | 显示全部楼层 |阅读模式
分享到:
串口是学习每个MCU都逃脱不了的,这就是宿命
试验现象:



我们先来看看官方提供的usart例程,以下的是main函数的起始的几行:



      我惊奇的发现这段程序竟然还没有执行串口的相关的配置就开始用printf输出信息了,这怎么可能呢?
想在程序中直接通过printf的定义跳转是不可能的,应为printf是标准C库里面的函数,只是我我们的程序中对它重新定义了输出接口,把原先的直接在屏上打印出信息改成了通过串口输出这个信息。经过我细心的查,原来是在DBG_PutChar这个输出字符的函数中有做串口的初始化,读者可能会问我都没有看到程序在执行这个函数啊?其实在串口的printf的重新定义的putchar函数中直接调用了DBG_PutChar:


  • extern WEAK signed int putchar( signed int c )
  • {
  •         DBG_PutChar( c );

  •         return c;
  • }
复制代码
DBG_PutCha:

  • extern void DBG_PutChar( uint8_t c )
  • {
  • #if defined CONSOLE_ON_UART
  •         Uart *pUart=CONSOLE_UART;
  •         if ( !_ucIsConsoleInitialized )
  •         {
  •                 DBG_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;
  •         // Wait for the transfer to complete
  •         while ((pUart->UART_SR & UART_SR_TXEMPTY) == 0);
  • #endif

  • #if defined CONSOLE_ON_USART
  •         Usart *pUsart=CONSOLE_Usart;
  •         if ( !_ucIsConsoleInitialized )                             //询问是否初始化了串口,没有的话执行串口的初始化
  •         {
  •                 DBG_Configure(CONSOLE_BAUDRATE, BOARD_MCK);
  •         }
  •         // Wait for the transmitter to be ready
  •         while ((pUsart->US_CSR & US_CSR_TXEMPTY) == 0);

  •         // Send character
  •         pUsart->US_THR = c;

  •         // Wait for the transfer to complete
  •         while ((pUsart->US_CSR & US_CSR_TXEMPTY) == 0);
  • #endif
  • }
到了这一步别的已经不是问题了。
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-19 12:32 , Processed in 0.127112 second(s), 18 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.