欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

GReq_mcu168 ? 來源:STM32嵌入式開發(fā) ? 作者:STM32嵌入式開發(fā) ? 2022-03-10 17:19 ? 次閱讀

輸出調(diào)試信息是嵌入式開發(fā)中必不可少的調(diào)試?yán)鳎?/span>嵌入式開發(fā)的一個特點(diǎn)是很多時(shí)候沒有操作系統(tǒng),或者沒有文件系統(tǒng),常規(guī)的打印log到文件的方法基本不適用。

最常用的是通過串口輸出uart log,例如51單片機(jī),只要實(shí)現(xiàn)串口驅(qū)動,通過串口輸出就可以了。

串口這種方法實(shí)現(xiàn)簡單,大部分嵌入式芯片都有串口功能。但是這樣簡單的功能有時(shí)候卻不是那么好用,比如:

  • 一款新拿到的芯片,沒有串口驅(qū)動時(shí)如何打印log?

  • 某些應(yīng)用下對時(shí)序要求比較高,串口輸出log占用時(shí)間太長怎么辦?比如usb枚舉。

  • 某些bug正常運(yùn)行時(shí)會出現(xiàn),當(dāng)打開串口log時(shí)又不再復(fù)現(xiàn)怎么辦?

  • 一些封裝中沒有串口,或者串口已經(jīng)被用作其他用途,要如何輸出log?

本文介紹單片機(jī)沒有串口時(shí),如何打印調(diào)試信息。

1 輸出log信息到SRAM

準(zhǔn)確來說這里并不是輸出log,而是以一種方式不使用串口就可以看到log。在芯片開發(fā)階段都可以連接仿真器調(diào)試,可以使用打斷點(diǎn)的方法調(diào)試,但是有些操作如果不能被打斷就沒法使用斷點(diǎn)調(diào)試了。這時(shí)候可以考慮將log打印到SRAM中,整個操作結(jié)束后再通過仿真器查看SRAM中的log buffer,這樣就實(shí)現(xiàn)了間接的log輸出。

本文使用的測試平臺是stm32f407 discovery,基于usb host實(shí)驗(yàn)代碼,對于其他嵌入式平臺原理也是通用的。

首先定義一個結(jié)構(gòu)體用于打印log,如下:

typedef struct {   volatile u8     type;   u8*             buffer;             /* log buffer指針*/   volatile u32    write_idx;          /* log寫入位置*/   volatile u32    read_idx;           /* log 讀取位置*/}log_dev;

定義一段SRAM空間作為log buffer

static u8 log_buffer[LOG_MAX_LEN];

log buffer是環(huán)形緩沖區(qū),在小的buffer就可以無限打印log,缺點(diǎn)也很明顯,如果log沒有及時(shí)輸出就會被新的覆蓋。Buffer大小根據(jù)SRAM大小分配,這里使用1kB。

為了方便輸出參數(shù),使用printf函數(shù)來格式化輸出,需要做如下配置。

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

并包含頭文件#include , 在代碼中實(shí)現(xiàn)函數(shù)fputc()。

//redirect fputcint fputc(int ch, FILE *f){    print_ch((u8)ch);    return ch;}

寫入數(shù)據(jù)到Sram:

/*write log to bufffer or I/O*/void print_ch(u8 ch){    log_dev_ptr->buffer[log_dev_ptr->write_idx++] = ch;    if(log_dev_ptr->write_idx >= LOG_MAX_LEN){        log_dev_ptr->write_idx = 0;    }}

為了方便控制log打印格式,在頭文件中再添加自定義的打印函數(shù):

#ifdef DEBUG_LOG_EN#define DEBUG(...)      printf("usb_printer:"__VA_ARGS__)#else#define DEBUG(...)#endif

在需要打印log的地方直接調(diào)用DEBUG()即可,最終效果如下,從Memory窗口可以看到打印的log:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

通過SWO輸出log

通過打印log到SRAM的方式可以看到log,但是數(shù)據(jù)量多的時(shí)候可能來不及查看就被覆蓋了。為了解決這個問題,可以使用St-link的SWO輸出log,這樣就不用擔(dān)心log被覆蓋。

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

在log結(jié)構(gòu)體中添加SWO的操作函數(shù)集:

typedef struct{    u8 (*init)(void* arg);    u8 (*print)(u8 ch);    u8 (*print_dma)(u8* buffer, u32 len);}log_func;
typedef struct {    volatile u8     type;    u8*             buffer;    volatile u32    write_idx;    volatile u32    read_idx;    //SWO    log_func*       swo_log_func;}log_dev;

SWO只需要print操作函數(shù),實(shí)現(xiàn)如下:

u8 swo_print_ch(u8 ch){    ITM_SendChar(ch);    return 0;}

使用SWO輸出log同樣先輸出到log buffer,然后在系統(tǒng)空閑時(shí)再輸出,當(dāng)然也可以直接輸出。log延遲輸出會影響log的實(shí)時(shí)性,而直接輸出會影響到對時(shí)間敏感的代碼運(yùn)行,所以如何取舍取決于需要輸出log的情形。在while循環(huán)中調(diào)用output_ch()函數(shù),就可以實(shí)現(xiàn)在系統(tǒng)空閑時(shí)輸出log。

/*output log buffer to I/O*/void output_ch(void){       u8 ch;    volatile u32 tmp_write,tmp_read;    tmp_write = log_dev_ptr->write_idx;    tmp_read = log_dev_ptr->read_idx;
    if(tmp_write != tmp_read){            ch = log_dev_ptr->buffer[tmp_read++];            //swo            if(log_dev_ptr->swo_log_func)                    log_dev_ptr->swo_log_func->print(ch);            if(tmp_read >= LOG_MAX_LEN){                    log_dev_ptr->read_idx = 0;            }else{                    log_dev_ptr->read_idx = tmp_read;            }    }}

1 通過IDE輸出

使用IDE中SWO輸出功能需要做如下配置(Keil):

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

在窗口可以看到輸出的log:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

2 通過STM32 ST-LINK Utility輸出

使用STM32 ST-LINK Utility不需要做特別的設(shè)置,直接打開ST-LINK菜單下的Printf via SWO viewer,然后按start:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

通過串口輸出log

以上都是在串口log暫時(shí)無法使用,或者只是臨時(shí)用一下的方法,而適合長期使用的還是需要通過串口輸出log,畢竟大部分時(shí)候沒法連接仿真器。

添加串口輸出log只需要添加串口的操作函數(shù)集即可:

typedef struct {    volatile u8     type;    u8*             buffer;    volatile u32    write_idx;    volatile u32    read_idx;    volatile u32    dma_read_idx;    //uart    log_func*       uart_log_func;    //SWO    log_func*       swo_log_func;}log_dev;

實(shí)現(xiàn)串口驅(qū)動函數(shù):

log_func uart_log_func = {    uart_log_init,    uart_print_ch,    0,};

添加串口輸出log與通過SWO過程類似,不再多敘述。而下面要討論的問題是,串口的速率較低,輸出數(shù)據(jù)需要較長時(shí)間,嚴(yán)重影響系統(tǒng)運(yùn)行。雖然可以通過先打印到SRAM再延時(shí)輸出的辦法來減輕影響,但是如果系統(tǒng)中斷頻繁,或者需要做耗時(shí)運(yùn)算,則可能會丟失log。要解決這個問題,就是要解決CPU與輸出數(shù)據(jù)到串口同時(shí)進(jìn)行的問題,嵌入式工程師立馬可以想到DMA正是好的解決途徑。

使用DMA搬運(yùn)log數(shù)據(jù)到串口輸出,同時(shí)又不影響CPU運(yùn)行,這樣就可以解決輸出串口log耗時(shí)影響系統(tǒng)的問題:STM32串口收發(fā)數(shù)據(jù)為什么要使用DMA?串口及DMA初始化函數(shù)如下:

u8 uart_log_init(void* arg){    DMA_InitTypeDef DMA_InitStructure;    u32* bound = (u32*)arg;    //GPIO端口設(shè)置    GPIO_InitTypeDef GPIO_InitStructure;    USART_InitTypeDef USART_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時(shí)鐘    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2時(shí)鐘    //串口2對應(yīng)引腳復(fù)用映射    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);    //USART2端口配置    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//復(fù)用功能    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復(fù)用輸出    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉    GPIO_Init(GPIOA,&GPIO_InitStructure); //USART2初始化設(shè)置    USART_InitStructure.USART_BaudRate = *bound;//波特率設(shè)置    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位    USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗(yàn)位    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制    USART_InitStructure.USART_Mode = USART_Mode_Tx; //收發(fā)模式    USART_Init(USART2, &USART_InitStructure); //初始化串口1#ifdef LOG_UART_DMA_EN      USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);#endif      USART_Cmd(USART2, ENABLE);  //使能串口1     USART_ClearFlag(USART2, USART_FLAG_TC);    while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);#ifdef LOG_UART_DMA_EN    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);    //Config DMA channel, uart2 TX usb DMA1 Stream6 Channel    DMA_DeInit(DMA1_Stream6);    DMA_InitStructure.DMA_Channel = DMA_Channel_4;    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART2->DR);    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;    DMA_InitStructure.DMA_Priority = DMA_Priority_High;    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;     DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;    DMA_Init(DMA1_Stream6, &DMA_InitStructure);    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);#endif    return 0;}

DMA輸出到串口的函數(shù)如下:

u8 uart_print_dma(u8* buffer, u32 len){        if((DMA1_Stream6->CR & DMA_SxCR_EN) != RESET){                //dma not ready                return 1;        }        if(DMA_GetFlagStatus(DMA1_Stream6,DMA_IT_TCIF6) != RESET){                DMA_ClearFlag(DMA1_Stream6,DMA_FLAG_TCIF6);                DMA_Cmd(DMA1_Stream6,DISABLE);        }        DMA_SetCurrDataCounter(DMA1_Stream6,len);        DMA_MemoryTargetConfig(DMA1_Stream6, (u32)buffer, DMA_Memory_0);        DMA_Cmd(DMA1_Stream6,ENABLE);        return 0;}

這里為了方便直接使用了查詢DMA狀態(tài)寄存器,有需要可以修改為DMA中斷方式,查Datasheet可以找到串口2使用DMA1 channel4的stream6:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

最后在PC端串口助手可以看到log輸出:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

使用DMA搬運(yùn)log buffer中數(shù)據(jù)到串口,同時(shí)CPU可以處理其他事情,這種方式對系統(tǒng)影響最小,并且輸出log及時(shí),是實(shí)際使用中用的最多的方式。并且不僅可以用串口,其他可以用DMA操作的接口(如SPI、USB)都可以使用這種方法來打印log。

使用IO模擬串口輸出log

最后要討論的是在一些封裝中沒有串口,或者串口已經(jīng)被用作其他用途時(shí)如何輸出log,這時(shí)可以找一個空閑的普通IO,模擬UART協(xié)議輸出log到上位機(jī)的串口工具。

常用的UART協(xié)議如下:

單片機(jī)沒有串口時(shí)如何打印調(diào)試信息

只要在確定的時(shí)間在IO上輸出高低電平就可以模擬出波形,這個確定的時(shí)間就是串口波特率。

為了得到精確延時(shí),這里使用TIM4定時(shí)器產(chǎn)生1us的延時(shí)。注意:定時(shí)器不能重復(fù)用,在測試工程中TIM2、3都被用了,如果重復(fù)用就錯亂了。

初始化函數(shù)如下:

u8 simu_log_init(void* arg){    TIM_TimeBaseInitTypeDef TIM_InitStructure;      u32* bound = (u32*)arg;    //GPIO端口設(shè)置    GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時(shí)鐘    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復(fù)用輸出    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉    GPIO_Init(GPIOA,&GPIO_InitStructure);    GPIO_SetBits(GPIOA, GPIO_Pin_2);    //Config TIM    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //使能TIM4時(shí)鐘    TIM_DeInit(TIM4);    TIM_InitStructure.TIM_Prescaler = 1;        //2分頻    TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;    TIM_InitStructure.TIM_Period = 41;          //1us timer    TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    TIM_TimeBaseInit(TIM4, &TIM_InitStructure);    TIM_ClearFlag(TIM4, TIM_FLAG_Update);    baud_delay = 1000000/(*bound);          //根據(jù)波特率計(jì)算每個bit延時(shí)    return 0;}

使用定時(shí)器的delay函數(shù)為:

void simu_delay(u32 us){    volatile u32 tmp_us = us;    TIM_SetCounter(TIM4, 0);    TIM_Cmd(TIM4, ENABLE);    while(tmp_us--){        while(TIM_GetFlagStatus(TIM4, TIM_FLAG_Update) == RESET);        TIM_ClearFlag(TIM4, TIM_FLAG_Update);    }       TIM_Cmd(TIM4, DISABLE);}

最后是模擬輸出函數(shù),注意:輸出前必須要關(guān)閉中斷,一個byte輸出完再打開,否則會出現(xiàn)亂碼:

u8 simu_print_ch(u8 ch){   volatile u8 i=8;   __asm("cpsid i");   //start bit   GPIO_ResetBits(GPIOA, GPIO_Pin_2);   simu_delay(baud_delay);   while(i--){           if(ch & 0x01)               GPIO_SetBits(GPIOA, GPIO_Pin_2);           else               GPIO_ResetBits(GPIOA, GPIO_Pin_2);           ch >>= 1;           simu_delay(baud_delay);   }   //stop bit   GPIO_SetBits(GPIOA, GPIO_Pin_2);   simu_delay(baud_delay);   simu_delay(baud_delay);   __asm("cpsie i");   return 0;}

介紹了幾種開發(fā)中使用過的打印調(diào)試信息的方法,方法總是死的,關(guān)鍵在于能靈活使用;通過打印有效的調(diào)試信息,可以幫助解決開發(fā)及后期維護(hù)中遇到的問題,少走彎路。

如果是你在項(xiàng)目中,沒有串口線你會怎么調(diào)試呢?請?jiān)谠u論區(qū)說出你的想法。

原文標(biāo)題:沒有串口,如何打印單片機(jī)調(diào)試信息?

文章出處:【微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅


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

    關(guān)注

    6043

    文章

    44623

    瀏覽量

    638833
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    589

    瀏覽量

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

    關(guān)注

    14

    文章

    1559

    瀏覽量

    77124

原文標(biāo)題:沒有串口,如何打印單片機(jī)調(diào)試信息?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

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

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

    請問單片機(jī)和GSM模塊通信使用的串口可以同時(shí)使用在電腦上打印調(diào)試信息嗎?

    單片機(jī)和GSM模塊通信使用的串口,還能同時(shí)使用在電腦上打印調(diào)試信息不?搞了半天沒現(xiàn)象,是這個原因不?一個
    發(fā)表于 03-14 06:35

    如何在STM32單片機(jī)上實(shí)現(xiàn)Printf函數(shù)打印串口信息并進(jìn)行代碼調(diào)試?

    如何在STM32單片機(jī)上實(shí)現(xiàn)Printf函數(shù)打印串口信息并進(jìn)行代碼調(diào)試?
    發(fā)表于 12-02 07:35

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

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

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

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

    STM8S串口打印調(diào)試信息(不使用printf)

    STM8S串口打印調(diào)試信息(不使用printf),感興趣可以看看。
    發(fā)表于 07-25 18:52 ?51次下載

    51單片機(jī)串口通訊詳解

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

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

    格式化輸出串行通信不知道你們寫單片機(jī)程序的時(shí)候有沒有煩惱,它沒有想c語言的dos窗口,沒有java的運(yùn)行窗口,沒有python的控制臺,有時(shí)
    發(fā)表于 11-20 16:36 ?16次下載
    51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>串口</b>通信<b class='flag-5'>調(diào)試</b>printf函數(shù)重定向輸出<b class='flag-5'>打印</b>

    可以實(shí)時(shí)打印串口信息串口調(diào)試軟件

    可以實(shí)時(shí)打印串口信息串口調(diào)試軟件
    發(fā)表于 11-23 18:17 ?15次下載

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

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

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

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

    如何用調(diào)試器JLink來打印信息

    摘要:不知道大家在單片機(jī)開發(fā)中是如何打印調(diào)試信息的,大多數(shù)應(yīng)該是用串口調(diào)試
    的頭像 發(fā)表于 10-14 09:55 ?3752次閱讀

    stm32f103zet6單片機(jī)串口互發(fā)程序

    為什么用51單片機(jī)調(diào)試串口藍(lán)牙模塊或者是串口wifi模塊很困難呢?因?yàn)?b class='flag-5'>串口只有一個,串口一旦用于
    發(fā)表于 01-05 15:44 ?6次下載

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

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

    51單片機(jī)串口配置方法

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