使用 printf 的 atmel 传感器

Posted

技术标签:

【中文标题】使用 printf 的 atmel 传感器【英文标题】:atmel sensor using printf 【发布时间】:2013-04-05 09:13:10 【问题描述】:

我有一个 atmel UC3-L0 和指南针传感器。现在我安装 AtmelStudio 并将一些演示代码下载到板上。但我不知道演示代码中的函数printf 会在哪里出现数据。如何获取数据?

【问题讨论】:

【参考方案1】:

printf 函数输出到标准输出。

通常在没有操作系统的“裸”处理器上,您需要定义如何从物理接口(通常是 USART、控制台端口、USB 端口、4 端口 LCD 接口等)发送或接收字符。因此,通常您可能希望使用处理器板的 USART 端口使用串行电缆连接到运行 Hyperterm、PuTTY 或类似设备的 PC。

本质上你需要

使用fdev_setup_stream() 宏创建FILE 流和 提供指向函数get()put() 的指针,它们告诉printf() 函数如何准确地从/向该流读取和写入(例如读取/写入USART、LCD 显示器等)。 您可能有库 - 取决于您的硬件 - 已经包含此类函数(加上正确的端口初始化函数),例如uart.c/.h、lcd.c/.h等

在 stdio.h 的文档(例如 here)中查找以下内容: printf(), fdev_setup_stream()

如果您已下载 Atmel Studio,您可以查看 stdiodemo.c 代码以获得进一步的了解。

【讨论】:

+1,不错的答案,也许只是让文件名和函数名称看起来像代码? 不挑剔,但裸机通常用于指代“裸”处理器。【参考方案2】:

为了在 ATMEL studio 中使用 printf,您应该检查以下事项:

    从 Project->ASF 向导添加和应用标准串行 I/O 模块。 还可以从 ASF 向导添加 USART 模块。 在 main 函数之前包含以下代码 sn -p。
 static struct usart_module usart_instance; 
      static void configure_console(void)
    
      struct usart_config usart_conf;
      usart_get_config_defaults(&usart_conf);
      usart_conf.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
      usart_conf.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
      usart_conf.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
      usart_conf.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
      usart_conf.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
      usart_conf.baudrate    = 115200;

      stdio_serial_init(&usart_instance, EDBG_CDC_MODULE, &usart_conf);
      usart_enable(&usart_instance);
    

    确保在 main 函数的 system_init() 之后调用 configure_console。

    现在转到工具->扩展管理器。添加终端窗口扩展。

    构建并运行您的程序并从视图-> 终端窗口打开终端窗口。放置您的设备正在运行的正确 com 端口,并将波特率设置为 115200,然后在终端窗口上点击连接。 您现在应该可以看到 printf 语句了。 (浮点数不会在 Atmel 工作室中打印出来)

【讨论】:

【参考方案3】:

我最近自己也对此感到困惑。我已经安装了 Atmel Studio 7.0,并通过一个调用 printf 的示例项目使用了 SAMD21 开发板。

在示例代码中我看到有一个配置部分:

/*!
 * \brief Initialize USART to communicate with on board EDBG - SERCOM 
 * with the following settings.
 * - 8-bit asynchronous USART
 * - No parity
 * - One stop bit
 * - 115200 baud
 */ 
static void configure_usart(void)

    struct usart_config config_usart;
    // Get the default USART configuration
    usart_get_config_defaults(&config_usart);
    // Configure the baudrate
    config_usart.baudrate = 115200;
    // Configure the pin multiplexing for USART
    config_usart.mux_setting = EDBG_CDC_SERCOM_MUX_SETTING;
    config_usart.pinmux_pad0 = EDBG_CDC_SERCOM_PINMUX_PAD0;
    config_usart.pinmux_pad1 = EDBG_CDC_SERCOM_PINMUX_PAD1;
    config_usart.pinmux_pad2 = EDBG_CDC_SERCOM_PINMUX_PAD2;
    config_usart.pinmux_pad3 = EDBG_CDC_SERCOM_PINMUX_PAD3;
    // route the printf output to the USART
    stdio_serial_init(&usart_instance, EDBG_CDC_MODULE, &config_usart);
    // enable USART
    usart_enable(&usart_instance);
 

在 Windows 设备管理器中,我看到“端口”下列出了一个“Atmel Corp. EDBG USB 端口 (COM3)”。但是,该端口的“属性”之一被列为每秒 9600 位。我将其从 9600 更改为 115200 以与上面的配置部分保持一致。

最后,我运行 PuTTY.exe 并将 Connection-->Serial 设置为 COM3 和 115200 波特。然后我去会话,然后单击串行连接类型,然后单击打开按钮。而且,BAM,还有我通过 PuTTY 输出的 printf。

【讨论】:

以上是关于使用 printf 的 atmel 传感器的主要内容,如果未能解决你的问题,请参考以下文章

在 Atmel SAM L21 Xplained Pro 上通过 UART 发送请求和接收响应的代码问题

如何将 ISR 设置为每秒运行 - C Atmega328p

SPI(串行端口通信)问题,卡在 ioctl()

基于ARM核AT75C220在指纹识别系统中应用

使用STM32 Nucleo将数据打印到文件中

Android传感器的使用