色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

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

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

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

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

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

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

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

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

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

1 輸出log信息到SRAM

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

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

首先定義一個(gè)結(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就可以無(wú)限打印log,缺點(diǎn)也很明顯,如果log沒有及時(shí)輸出就會(huì)被新的覆蓋。Buffer大小根據(jù)SRAM大小分配,這里使用1kB。

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

單片機(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í)候可能來(lái)不及查看就被覆蓋了。為了解決這個(gè)問題,可以使用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延遲輸出會(huì)影響log的實(shí)時(shí)性,而直接輸出會(huì)影響到對(duì)時(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í)無(wú)法使用,或者只是臨時(shí)用一下的方法,而適合長(zhǎng)期使用的還是需要通過串口輸出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ū)動(dòng)函數(shù):

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

添加串口輸出log與通過SWO過程類似,不再多敘述。而下面要討論的問題是,串口的速率較低,輸出數(shù)據(jù)需要較長(zhǎng)時(shí)間,嚴(yán)重影響系統(tǒng)運(yùn)行。雖然可以通過先打印到SRAM再延時(shí)輸出的辦法來(lái)減輕影響,但是如果系統(tǒng)中斷頻繁,或者需要做耗時(shí)運(yùn)算,則可能會(huì)丟失log。要解決這個(gè)問題,就是要解決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對(duì)應(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;//字長(zhǎng)為8位數(shù)據(jù)格式    USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位    USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(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可以處理其他事情,這種方式對(duì)系統(tǒng)影響最小,并且輸出log及時(shí),是實(shí)際使用中用的最多的方式。并且不僅可以用串口,其他可以用DMA操作的接口(如SPI、USB)都可以使用這種方法來(lái)打印log。

使用IO模擬串口輸出log

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

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

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

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

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

初始化函數(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ì)算每個(gè)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)閉中斷,一個(gè)byte輸出完再打開,否則會(huì)出現(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)目中,沒有串口線你會(huì)怎么調(diào)試呢?請(qǐng)?jiān)谠u(píng)論區(qū)說出你的想法。

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

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

審核編輯:湯梓紅


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

    關(guān)注

    6035

    文章

    44554

    瀏覽量

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

    關(guān)注

    7

    文章

    578

    瀏覽量

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

    關(guān)注

    14

    文章

    1551

    瀏覽量

    76431

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

    單片機(jī)和GSM模塊通信使用的串口,還能同時(shí)使用在電腦上打印調(diào)試信息不?搞了半天沒現(xiàn)象,是這個(gè)原因不?一個(gè)
    發(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)試助手程序下載,喜歡的朋友可以下載來(lái)學(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次下載

    如何進(jìn)行單片機(jī)串口調(diào)試詳細(xì)實(shí)例說明

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

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

    串口,作為單片機(jī)程序開發(fā)中最常用、最方便,也是應(yīng)用最廣泛的程序調(diào)試方法;無(wú)論是作為調(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語(yǔ)言的dos窗口,沒有java的運(yùn)行窗口,沒有python的控制臺(tái),有時(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次下載

    《電子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來(lái)打印信息

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

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

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

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

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

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

    串口,作為單片機(jī)程序開發(fā)中最常用、最方便,也是應(yīng)用最廣泛的程序調(diào)試方法;無(wú)論是作為調(diào)試工具,打印出調(diào)試
    的頭像 發(fā)表于 04-14 14:58 ?5093次閱讀
    51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>串口</b>配置方法
    主站蜘蛛池模板: 啦啦啦影院视频在线看高清...| 国产精品亚欧美一区二区三区| 网红刘婷hd国产高清| 国产最新进精品视频| 最近更新2019中文字幕国语| 欧美老少欢杂交另类| 国产成人精品免费视频大| 亚洲一区二区三区免费看| 美女诱惑性感揉胸| 国产爱豆果冻传媒在线观看| 亚洲无线观看国产| 欧美老妇与zozoz0交| 国产亚洲精品久久久久久一区二区 | 在线播放午夜理论片| 漂亮的保姆5电影免费观看完整版中文| 国产传媒18精品A片在线观看| 亚洲无碼网站观看| 热久久国产欧美一区二区精品| 国产在线精品视频资源| 91黄色大片| 吻嘴胸全身好爽床大全| 久久免费看少妇高潮A片JA| 成人在线精品视频| 亚洲性无码av在线| 日韩精品卡1卡2三卡四卡乱码| 精品国产乱码久久久久久乱码| www.一级毛片| 亚洲欧美日韩国产手机在线| 欧美日韩视频一区二区三区| 国产亚洲精品久久久久久无码网站| 99久久热视频只有精品| 亚洲成av人影院| 欧美大香线蕉线伊人久久| 国产又粗又黄又爽的大片| 99久久国产综合精品网成人影院| 小黄文污到你湿| 女人高潮被爽到呻吟在线观看| 韩国污动漫无遮掩无删减电脑版| seyeye免费高清观看| 亚洲色图另类小说| 日韩做A爰片久久毛片A片毛茸茸|