0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于單片機的串口調(diào)試打印

CHANBAEK ? 來源:凌云物聯(lián)網(wǎng)實驗室 ? 作者:郭工 ? 2022-12-19 09:23 ? 次閱讀

3.1 原理圖分析

查看EK-RA6M4的原理圖,如下圖所示,串口 UART0 掛在了Pmod2接口的 P411,P410 這兩個引腳上,而這兩個引腳又可以復(fù)用為 SPI1 功能的兩個引腳。此時,我們將希望修改FSP配置,讓這兩個引腳作為程序的 printf() 標(biāo)準(zhǔn)輸出調(diào)試打印。

圖片

3.2 Pins引腳配置

接下來我們打開項目中的FSP配置文件,配置使能相應(yīng)串口的Pin功能,并重新生成代碼。

圖片

3.3 Stack配置

接下來我們選擇 Stacks , 點擊 "New Stack" -> "Connectivity" -> "UART(r_sci_uart)" 添加串口通信功能協(xié)議棧。

圖片

如下圖所示,我們可以配置串口的相應(yīng)屬性,如波特率等。配置好之后,點擊 “Generate Project Content” 按鈕,將會自動生成串口的相關(guān)代碼。

圖片

  • 通過 Name 字段可以修改串口的設(shè)備名為 g_uart0,它將在IDE自動生成的文件 ra_gen/hal_data.c/h 中定義串口操作相關(guān)的變量;
  • 通過 Channel 字段可以修改串口通道,這里設(shè)置為0,下面的 Pins 將自動選擇 TXD0、RXD0 的相關(guān)引腳;
  • 串口的波特率、奇偶校驗位、數(shù)據(jù)位、停止位、誤碼率等都在這里設(shè)置,具體將定義在 ra_gen/hal_data.c 文件里的 g_uart0_cfg 變量中;

3.4 測試串口通信

接下來,我們可以修改 src/hal_entry.c 源文件,在里面添加串口的初始化 和 發(fā)送測試函數(shù)如下:

void hal_entry (void)
{
... ...
    #define HELLO_MSG  "Hello EK-RA6M4 Board
"
    R_SCI_UART_Open(&g_uart0_ctrl, &g_uart0_cfg);
    R_SCI_UART_Write(&g_uart0_ctrl, (uint8_t *)HELLO_MSG, strlen(HELLO_MSG));

    while (1)
    {
... ...
}

其中:

  • 串口的操作函數(shù) R_SCI_UART_Open()R_SCI_UART_Write() 定義在 ra/fsp/src/r_sci_uart/r_sci_uart.c 源文件中,它由e2studio動態(tài)生成;
  • 打開串口函數(shù)里的兩個參數(shù) g_uart0_ctrlg_uart0_cfg ,定義在 ra_gen/hal_data.c/h 文件中,該C文件由上一步配置并動態(tài)生成;

使用 USB轉(zhuǎn)串口連接 UART0的相應(yīng)引腳( TxD0:P411, RxD0:P410 ),重新編譯運行程序,串口上將會打印相應(yīng)的字符串。

圖片

3.5 printf函數(shù)實現(xiàn)

首先,我們在項目中創(chuàng)建 src/console.h 頭文件如下。

#ifndef CONSOLE_H_
#define CONSOLE_H_

#include 
#include "r_sci_uart.h"
#include "hal_data.h"

#define g_console(x)    &g_uart0_##x
#define g_console_ctrl  g_console(ctrl)
#define g_console_cfg   g_console(cfg)

extern volatile bool g_console_txComplete;

/* Function declaration */
extern fsp_err_t console_initialize(void);
extern fsp_err_t deinit_console(void);
extern void console_callback(uart_callback_args_t *p_args);
extern int _write(int fd,char *pBuffer,int size);

#endif /* CONSOLE_H_ */

接下來創(chuàng)建 src/console.c 源文件如下:

#include "console.h"

/*  Tx complete flags */
volatile bool g_console_txComplete = false;

int _write(int fd,char *pBuffer,int size)
{
    fsp_err_t              err = FSP_SUCCESS;

    (void)fd;

    g_console_txComplete = false;
    err = R_SCI_UART_Write(g_console_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
    if(FSP_SUCCESS != err)
        __BKPT();

    while(g_console_txComplete == false)
    {
    }
    return size;
}

fsp_err_t console_initialize(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Initialize console UART */
    err = R_SCI_UART_Open (g_console_ctrl, g_console_cfg);
    FSP_ERROR_RETURN(FSP_SUCCESS == err, err);

    return FSP_SUCCESS;
}

fsp_err_t deinit_console(void)
{
    fsp_err_t err = FSP_SUCCESS;

    /* Close module */
    err =  R_SCI_UART_Close (g_console_ctrl);
    FSP_ERROR_RETURN(FSP_SUCCESS == err, err);

    return FSP_SUCCESS;
}

void console_callback(uart_callback_args_t *p_args)
{
    switch (p_args->event)
    {
        case UART_EVENT_TX_COMPLETE:
            g_console_txComplete = true;
            break;

        default:
            break;
    }
}
  • Renesas MCU的printf()重定向函數(shù)為 _write(),在該函數(shù)中我們將通過調(diào)用串口發(fā)送函數(shù)將相關(guān)字符串發(fā)送出去;
  • 在使用串口發(fā)送函數(shù)時,我們應(yīng)該要等待串口發(fā)送完成。所以在_write()函數(shù)里我們將等待 g_console_txComplete 標(biāo)志完成;
  • 該標(biāo)志將會在 console_callback() 函數(shù)里更新,這個是串口中斷發(fā)送的回調(diào)函數(shù)。接下來我們需要在 FSP 配置中設(shè)置它。
  • 在該文件中,我們還添加 了 console 的初始化相關(guān)函數(shù);

在添加上面的源文件后,我們需要把自己定義的 console 串口回調(diào)函數(shù),加入到串口中斷回調(diào)函數(shù)中去,這時需要修改 FSP 的相關(guān)配置。具體方式如下圖所示:

圖片

  • 這里通過Callback字段設(shè)置串口收發(fā)的中斷回調(diào)函數(shù) console_callback(),它將配置在 g_uart0_cfg 變量中,該函數(shù)需要我們自己實現(xiàn);
  • 另外,我們也可以在這里修改串口中斷的優(yōu)先級;

另外,printf() 函數(shù)工作還需要修改堆棧大小,這里我們調(diào)整 Heap 的大小為 1024,然后重新生成代碼即可。

圖片

  • 如果使能了printf()函數(shù),不用J-link調(diào)試的話,開發(fā)板上電重啟后不能正常啟動運行。這是因為printf將會阻塞在 J-link的semihosting輸出 ,這時我們在編譯時要取消semihosting的支持。這時只需要在下面的項目配置中,刪除 --specs=rdimon.specs 鏈接選項即可。
  • 一般單片機的printf()函數(shù)默認并不支持浮點運行和浮點打印,因為它們比較占空間。如果想使能printf()打印浮點類型數(shù)的話,可以在項目配置中做如下設(shè)置。

圖片

接下來再修改 src/hal_entry.c 源文件如下,此時 printf函數(shù)就能夠正常工作了。

... ...
#include "console.h"
... ...

void hal_entry (void)
{
... ...
    console_initialize();
    printf("Hello EK-RA6M4 Board
");
    while (1)
    {    
... ...
}

編譯重新運行后,串口上能夠正常打印相應(yīng)字符串。

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機
    +關(guān)注

    關(guān)注

    6030

    文章

    44489

    瀏覽量

    632004
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1540

    瀏覽量

    76065
  • 串口通信
    +關(guān)注

    關(guān)注

    34

    文章

    1607

    瀏覽量

    55381
  • UART0
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    1688
收藏 人收藏

    評論

    相關(guān)推薦

    單片機串口模塊調(diào)試方法

    筆者在調(diào)試某Cortex-M3內(nèi)核單片機時遇到一個問題,此單片機不具備在線仿真功能,因此調(diào)試代碼時只能使用UART輸出Log的方式調(diào)試。
    發(fā)表于 07-28 15:48 ?1459次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>串口</b>模塊<b class='flag-5'>調(diào)試</b>方法

    怎樣通過串口打印變量的值來調(diào)試單片機的代碼呢

    當(dāng)調(diào)試單片機時,通過串口打印變量的值來調(diào)試代碼是一種很好的調(diào)試方式,本文將講述如何在PIC
    發(fā)表于 11-24 07:26

    串口調(diào)試工具

    串口調(diào)試工具 便于單片機下載 串口調(diào)試工具 串口調(diào)試
    發(fā)表于 11-20 16:35 ?42次下載

    單片機串口調(diào)試助手程序下載

    單片機串口調(diào)試助手程序下載,喜歡的朋友可以下載來學(xué)習(xí)。
    發(fā)表于 01-12 14:56 ?49次下載

    單片機多功能調(diào)試助手

    單片機多功能調(diào)試助手 串口、USB等調(diào)試用。
    發(fā)表于 03-11 10:34 ?8次下載

    如何進行單片機串口調(diào)試詳細實例說明

    串口調(diào)試助手 發(fā)送一字節(jié)的數(shù)據(jù),單片機馬上會回發(fā)同樣的數(shù)據(jù)在串口調(diào)試助手上顯示,如果回發(fā)給串口
    發(fā)表于 07-08 17:14 ?1次下載
    如何進行<b class='flag-5'>單片機</b>的<b class='flag-5'>串口</b><b class='flag-5'>調(diào)試</b>詳細實例說明

    單片機串口實驗 串口介紹 串口原理

    文章目錄1 串口的硬件初步認識2 中間橋梁芯片硬件電路3 電腦如何識別 中間橋梁芯片4 串口調(diào)試助手5 為什么需要CH340模塊6 CH340模塊可以換成別的嗎7 單片機開發(fā)版設(shè)計理念
    發(fā)表于 11-10 20:20 ?16次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>串口</b>實驗 <b class='flag-5'>串口</b>介紹 <b class='flag-5'>串口</b>原理

    51單片機串口通訊詳解

    串口,作為單片機程序開發(fā)中最常用、最方便,也是應(yīng)用最廣泛的程序調(diào)試方法;無論是作為調(diào)試工具,打印出調(diào)試信息,還是對功能模塊進行通信,
    發(fā)表于 11-11 17:06 ?15次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>串口</b>通訊詳解

    單片機串口調(diào)試丟包驗證過程記錄 已解決

    單片機串口調(diào)試丟包驗證過程記錄 已解決
    發(fā)表于 11-16 15:36 ?80次下載
    <b class='flag-5'>單片機</b><b class='flag-5'>串口</b><b class='flag-5'>調(diào)試</b>丟包驗證過程記錄 已解決

    MSP430 F5529 單片機 串口 測試 調(diào)試

    MSP430 F5529 單片機 串口 測試 調(diào)試
    發(fā)表于 11-19 18:21 ?15次下載
    MSP430 F5529 <b class='flag-5'>單片機</b> <b class='flag-5'>串口</b> 測試 <b class='flag-5'>調(diào)試</b>

    51單片機串口通信調(diào)試printf函數(shù)重定向輸出打印

    51單片機串口通信以及printf調(diào)試串行通信1.串口初始化串口工作方式波特率設(shè)置通過軟件直接生成串口
    發(fā)表于 11-20 16:36 ?16次下載
    51<b class='flag-5'>單片機</b><b class='flag-5'>串口</b>通信<b class='flag-5'>調(diào)試</b>printf函數(shù)重定向輸出<b class='flag-5'>打印</b>

    【轉(zhuǎn)】STC89C52RC單片機實現(xiàn)串口打印功能

    【轉(zhuǎn)】STC89C52RC單片機實現(xiàn)串口打印功能
    發(fā)表于 11-25 16:06 ?19次下載
    【轉(zhuǎn)】STC89C52RC<b class='flag-5'>單片機</b>實現(xiàn)<b class='flag-5'>串口</b><b class='flag-5'>打印</b>功能

    《電子DIY》之藍牙的使用,Proteus仿真單片機串口的注意事項和實物調(diào)試注意事項。玩轉(zhuǎn)單片機串口詳細零基礎(chǔ)版

    藍牙的使用,Proteus仿真單片機串口的注意事項和實物調(diào)試注意事項。玩轉(zhuǎn)單片機串口詳細零基礎(chǔ)版學(xué)習(xí)單片
    發(fā)表于 12-29 19:48 ?0次下載
    《電子DIY》之藍牙的使用,Proteus仿真<b class='flag-5'>單片機</b><b class='flag-5'>串口</b>的注意事項和實物<b class='flag-5'>調(diào)試</b>注意事項。玩轉(zhuǎn)<b class='flag-5'>單片機</b><b class='flag-5'>串口</b>詳細零基礎(chǔ)版

    單片機常用的調(diào)試方法

    單片機程序調(diào)試過程中,串口打印調(diào)試方法是非常重要的手段,在使用串口
    的頭像 發(fā)表于 04-04 14:58 ?4725次閱讀

    51單片機串口配置方法

    串口,作為單片機程序開發(fā)中最常用、最方便,也是應(yīng)用最廣泛的程序調(diào)試方法;無論是作為調(diào)試工具,打印出調(diào)試信息,還是對功能模塊進行通信,
    的頭像 發(fā)表于 04-14 14:58 ?4774次閱讀
    51<b class='flag-5'>單片機</b><b class='flag-5'>串口</b>配置方法