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

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

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

【國(guó)民技術(shù)N32項(xiàng)目移植】N32L43XRL-STB串口調(diào)試 使用printf打印日志

flying ? 來(lái)源:下下限 ? 作者:下下限 ? 2023-01-05 09:08 ? 次閱讀

通過(guò)串口輸出打印信息

  • 添加log.c
    #include "log.h"
    
    #if LOG_ENABLE
    
    #include "n32l43x.h"
    #include "n32l43x_gpio.h"
    #include "n32l43x_usart.h"
    #include "n32l43x_rcc.h"
    
    #define LOG_USARTx      USART1
    #define LOG_PERIPH      RCC_APB2_PERIPH_USART1
    #define LOG_GPIO        GPIOA
    #define LOG_PERIPH_GPIO RCC_APB2_PERIPH_GPIOA
    #define LOG_TX_PIN      GPIO_PIN_9
    #define LOG_RX_PIN      GPIO_PIN_10
    
    void log_init(void)
    {
        GPIO_InitType GPIO_InitStructure;
        USART_InitType USART_InitStructure;
    
        GPIO_InitStruct(&GPIO_InitStructure);
    
        RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO | LOG_PERIPH_GPIO, ENABLE);
    
        RCC_EnableAPB2PeriphClk(LOG_PERIPH, ENABLE);
    
    
        GPIO_InitStructure.Pin        = LOG_TX_PIN;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
    		GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
        GPIO_InitPeripheral(LOG_GPIO, &GPIO_InitStructure);
    
        GPIO_InitStructure.Pin       = LOG_RX_PIN;
        GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
    	  GPIO_InitStructure.GPIO_Alternate = GPIO_AF4_USART1;
        GPIO_InitPeripheral(LOG_GPIO, &GPIO_InitStructure);
    
        USART_InitStructure.BaudRate            = 115200;
        USART_InitStructure.WordLength          = USART_WL_8B;
        USART_InitStructure.StopBits            = USART_STPB_1;
        USART_InitStructure.Parity              = USART_PE_NO;
        USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
        USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;
    
        // init uart
        USART_Init(LOG_USARTx, &USART_InitStructure);
    
        // enable uart
        USART_Enable(LOG_USARTx, ENABLE);
    }
    
    
    int fputc(int ch, FILE* f)
    {
        USART_SendData(LOG_USARTx, (uint8_t)ch);
        while (USART_GetFlagStatus(LOG_USARTx, USART_FLAG_TXDE) == RESET)
            ;
    
        return (ch);
    }
    
    #ifdef USE_FULL_ASSERT
    
    __WEAK void assert_failed(const uint8_t* expr, const uint8_t* file, uint32_t line)
    {
        log_error("assertion failed: `%s` at %s:%d", expr, file, line);
        while (1)
        {
        }
    }
    #endif // USE_FULL_ASSERT
    
    #endif // LOG_ENABLE
    #endif // LOG_ENABLE
    
    #endif // LOG_ENABLE
  • 添加log.h
    #ifndef __LOG_H__
    #define __LOG_H__
    
    #ifndef LOG_ENABLE
    #define LOG_ENABLE 1
    #endif
    
    #if LOG_ENABLE
    
    #include 
    
    #define LOG_NONE    0
    #define LOG_ERROR   10
    #define LOG_WARNING 20
    #define LOG_INFO    30
    #define LOG_DEBUG   40
    
    #ifndef LOG_LEVEL
    #define LOG_LEVEL LOG_DEBUG
    #endif
    
    #if LOG_LEVEL >= LOG_INFO
    #define log_info(...) printf(__VA_ARGS__)
    #else
    #define log_info(...)
    #endif
    
    #if LOG_LEVEL >= LOG_ERROR
    #define log_error(...) printf(__VA_ARGS__)
    #else
    #define log_error(...)
    #endif
    
    #if LOG_LEVEL >= LOG_WARNING
    #define log_warning(...) printf(__VA_ARGS__)
    #else
    #define log_warning(...)
    #endif
    
    #if LOG_LEVEL >= LOG_DEBUG
    #define log_debug(...) printf(__VA_ARGS__)
    #else
    #define log_debug(...)
    #endif
    
    void log_init(void);
    
    #else /* !LOG_ENABLE */
    
    #define log_info(...)
    #define log_warning(...)
    #define log_error(...)
    #define log_debug(...)
    #define log_init()
    
    #endif
    
    #define log_func() log_debug("call %s [%d]\\r\\n", __FUNCTION__,__LINE__)
    
    #endif /* __LOG_H__ */
    #endif /* __LOG_H__ */
    
    #endif /* __LOG_H__ */
  • man調(diào)用
    int main(void)
    {
        log_init();
    
        log_func();
    	//assert_param(0);
        while (1)
        {
    
        }
    }
    }
    
    }

異常處理

  • 若無(wú)法正常打印信息,則查看keil5配置,需要 打開(kāi)use microLIB

    image.png
    審核編輯:湯梓紅

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

    關(guān)注

    0

    文章

    18

    瀏覽量

    7184
  • 國(guó)民技術(shù)
    +關(guān)注

    關(guān)注

    2

    文章

    305

    瀏覽量

    20346
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    81

    瀏覽量

    13608
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    國(guó)民技術(shù)N32項(xiàng)目移植】BMS項(xiàng)目移植

    移植bmsN32國(guó)民技術(shù)
    Angel_YY
    發(fā)布于 :2023年02月27日 15:53:27

    N32G43XRL-STB開(kāi)發(fā)板硬件使用指南

    N32G43XRL-STB 開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司32位N32G43XRL系列MCU的開(kāi)發(fā)。本文檔詳細(xì)描述了N32G43XRL-STB
    發(fā)表于 11-01 07:27

    N32L43XRL-STB開(kāi)發(fā)板硬件使用指南

    N32L43XRL-STB開(kāi)發(fā)板硬件使用指南開(kāi)發(fā)板用于國(guó)民技術(shù)股份有限公司32位N32L43XRL系列MCU的開(kāi)發(fā)。本文檔詳細(xì)描述了N32L43XR
    發(fā)表于 11-01 06:48

    國(guó)民技術(shù)N32項(xiàng)目移植N32G345XVL-STB項(xiàng)目移植 ——開(kāi)箱及開(kāi)發(fā)環(huán)境搭建

    感謝Elecfans和國(guó)民技術(shù),能夠參與國(guó)民技術(shù)N32項(xiàng)目
    發(fā)表于 12-03 17:11

    國(guó)民技術(shù)N32項(xiàng)目移植N32L43XRL-STB項(xiàng)目移植之基于IIC接口的OLED

    IIC接口的OLED是平時(shí)實(shí)驗(yàn)中常用的顯示設(shè)備,和開(kāi)發(fā)板只需要四根線連接,VCC、GND、SDA、SCL。而且所使用的IIC經(jīng)常采用軟件模擬的方式實(shí)現(xiàn)。本次移植就是利用N32L436的兩個(gè)IO口模擬
    發(fā)表于 12-23 08:35

    【精品合集】國(guó)民技術(shù)N32開(kāi)源移植挑戰(zhàn)賽作品合集

    N32G45XVL-STB )【國(guó)民技術(shù)N32項(xiàng)目移植】智能溫濕度監(jiān)測(cè)系統(tǒng)
    發(fā)表于 01-10 13:59

    國(guó)民技術(shù)N32項(xiàng)目移植】5. ADC應(yīng)用以及跳坑總結(jié)

    SSD1306軟件包【國(guó)民技術(shù)N32項(xiàng)目移植】4. 硬件定時(shí)器實(shí)現(xiàn)2ms定時(shí)前言本文講解如何使用N
    發(fā)表于 02-02 21:45

    國(guó)民技術(shù)N32項(xiàng)目移植項(xiàng)目提交-物聯(lián)網(wǎng)心率監(jiān)控設(shè)備

    過(guò)往分享【國(guó)民技術(shù)N32項(xiàng)目移植】1. 新建工程+LED與按鍵跳坑總結(jié)【國(guó)民
    發(fā)表于 02-12 16:41

    國(guó)民技術(shù)N32項(xiàng)目移植】 RTT tcpclient測(cè)試

    國(guó)民技術(shù)N32項(xiàng)目移植】RTT AT ESP8266移植
    發(fā)表于 02-16 17:38

    國(guó)民技術(shù)N32項(xiàng)目移植串口支持printf有坑

    的問(wèn)題,說(shuō)說(shuō)串口問(wèn)題。詳細(xì)描述本次使用了USB調(diào)試口自帶的串口1(PA9,PA10),程序編寫(xiě)參照官方例程,沒(méi)什么問(wèn)題,畢竟 N32的庫(kù)還是和經(jīng)典的ST標(biāo)準(zhǔn)庫(kù)非常相似的。正常的
    發(fā)表于 02-18 22:09

    國(guó)民技術(shù)N32項(xiàng)目移植】FOC項(xiàng)目移植之環(huán)境搭建

    FOC項(xiàng)目移植之環(huán)境搭建很高興能夠參加國(guó)民技術(shù)N32開(kāi)源移植挑戰(zhàn)賽,本人這次將在RT-Threa
    發(fā)表于 02-24 13:53

    國(guó)民技術(shù)N32項(xiàng)目移植】easypower 結(jié)論

    經(jīng)過(guò)簡(jiǎn)單的移植調(diào)試,比較順利的完成。本設(shè)計(jì)比較簡(jiǎn)單,國(guó)民技術(shù)的軟件庫(kù)和例程也比較完善。所以還是容易的。只是在原來(lái)設(shè)計(jì)的板子上做移植和驗(yàn)證。
    發(fā)表于 02-28 23:49

    國(guó)民技術(shù)N32G43XRL-STB開(kāi)發(fā)板資料

    國(guó)民技術(shù)N32G43XRL-STB開(kāi)發(fā)板資料
    發(fā)表于 11-07 15:33 ?10次下載

    N32L43XRL-STB (LQFP64) 開(kāi)發(fā)板

    N32L43XRL-STB (LQFP64) 開(kāi)發(fā)板
    發(fā)表于 11-10 19:51 ?0次下載
    <b class='flag-5'>N32L43XRL-STB</b> (LQFP64) 開(kāi)發(fā)板

    國(guó)民技術(shù)N32項(xiàng)目移植N32L43XRL-STB串口調(diào)試 nr_micro_shell移植

    國(guó)民技術(shù)N32項(xiàng)目移植N32L43XRL-STB串口
    的頭像 發(fā)表于 01-05 09:10 ?2017次閱讀
    【<b class='flag-5'>國(guó)民</b><b class='flag-5'>技術(shù)</b><b class='flag-5'>N32</b><b class='flag-5'>項(xiàng)目</b><b class='flag-5'>移植</b>】<b class='flag-5'>N32L43XRL-STB</b><b class='flag-5'>串口</b><b class='flag-5'>調(diào)試</b> nr_micro_shell<b class='flag-5'>移植</b>