4 USB除錯模組

2021-10-11 11:45:23 字數 4159 閱讀 3200

1、usb硬體初始化

底層初始化使用的cubemx,庫函式版本f4_v1.25.具體配置如下

2、usb函式封裝

usb通訊中真正的收發資料都是在usb中斷中進行的,所以為了確認usb不會被其他中斷打斷,將usb的搶占優先順序設定為0。

先說一下實現的大概思路吧。

只是傳送(mcu -> pc)的話,用到了乙個訊息佇列,乙個執行緒。

1、建立乙個訊息佇列tx_mq,乙個傳送執行緒tx_thread

2、使用者想要傳送訊息的時候,將訊息存入tx_mq中。存入的訊息滿足一定條件時將訊息傳送至tx_thread中進行傳送

接受(pc->mcu)的話同理。先將接收到的訊息存入接受的訊息佇列,然後**到處理該訊息的執行緒。

下面的就是使用者將訊息存入訊息佇列實現的**。裡面的訊號量主要作用是 防止重入該函式。

#include

"usbd_consolse.h"

#include

"usbd_thread.h"

static uint8_t usbd_consolse_is_init =0;

rt_sem_t usbd_con_bin_sem = rt_null;

msg_t message_to_print;

void

usbd_console_init()

int32_t usbd_console_put_char

(uint8_t _ch)

elseif(

rt_sem_take

(usbd_con_bin_sem, delay_time)

== rt_eok)

if(_ch ==

'\n'

|| message_to_print.data_len >= msg_max_data_size)

}rt_sem_release

(usbd_con_bin_sem)

;return

(uint8_t)_ch;

}int32_t usbd_console_puts

(char

*_str)

上面說存入的訊息滿足一定條件時將訊息傳送至tx_thread中進行傳送,這個條件就是上述**中的if(_ch == '\n' || message_to_print.data_len >= msg_max_data_size)這句話。

#ifndef _usbd_console__h_

#define _usbd_console__h_

#include

"main.h"

void

usbd_console_init

(void);

int32_t usbd_console_put_char

(uint8_t ch)

;/* 輸入乙個字元到usbd_console緩衝區*/

int32_t usbd_console_puts

(char

*str)

;/* 輸入乙個字串到usbd_console緩衝區*/

#endif

/*_usbd_console__h_*/

下面是具體的usb接受和實現的**

#include

"usbd_thread.h"

#include

"usbd_consolse.h"

#include

#include

static rt_mq_t tx_mq = rt_null;

rt_mq_t rx_mq = rt_null;

static uint8_t usbd_thread_is_init =0;

#define usbd_tx_queue_size 2

#define usbd_rx_queue_size 32

void

usbd_uesr_hal_init

(void

)uint8_t usbd_send_packet

(msg_t *_buf)

uint8_t usbd_recv_data()

char

rt_hw_console_getchar

(void

)void

usbd_rx_thread_entry

(void

*param)

}void

usbd_tx_thread_entry

(void

*param)

;while(1)}}

#ifndef _usblink__h_

#define _usblink__h_

#include

"main.h"

#include

"usbd_consolse.h"

#define msg_max_data_size 128

typedef

struct

msg_t;

void

usbd_uesr_hal_init

(void);

uint8_t usbd_send_packet

(msg_t *);

void

usbd_rx_thread_entry

(void*)

;void

usbd_tx_thread_entry

(void*)

;#endif

/*usbd_thread.h*/

3、usb註冊到rtt控制台
在將usb註冊到rtt控制台的過程中,主要分為兩部分,依次是傳送和接收。 先說一下最簡單的的傳送。

參考rtt官網,要實現void rt_hw_console_output(const char *str)函式,具體的實現如下

void

rt_hw_console_output

(const

char

*str)

usbd_console_put_char

(*str)

; str++;}

rt_exit_critical()

;/* empty console output */

}

主要的傳送實體是函式usbd_console_put_char(*str);這裡使用區域性變數ch是為了補全\r\n,方便換行使用。

下面說一下具體的接收函式實現,依舊參考官網給出的例程,需要實現rt_hw_console_getchar()函式,具體實現如下。

uint8_t usbd_recv_data()

char

rt_hw_console_getchar

(void

)

之後需要在usbd_cdc_if.c檔案中修改cdc_receive_fs函式為如下

static int8_t cdc_receive_fs

(uint8_t* buf, uint32_t *len)

return

(usbd_ok)

;/* user code end 6 */

}

具體思路就是將接受的函式乙個乙個的傳入接受的訊息佇列,然後從訊息佇列中挨個讀出。上述的**實現只滿足了最基本的功能,其實可以將接收訊息的長度傳送到訊息佇列,方便對資料進行處理。因為前期只是用於除錯,所以並沒有實現該功能,且rx_thread執行緒裡面並未進行任何操作。

4 USB的幾種狀態

4 usb狀態 4.1 usb可見狀態 usb裝置可以與usb連線或分離。當usb裝置與usb分離時,它的狀態不是由本規範定義的。此規範僅在裝置被附加後處理所需的操作和屬性 usb裝置上電後處於這個狀態,分為兩種情況,如果來自於外部電源,協議裡叫做self powered,如果來自於hub,叫做bu...

USB除錯助手

20191108 根據大家意見對 usb除錯助手 進行了完善,主要有如下幾個方面 1 接收和傳送可分別設定成ascii格式或hex 十六進製制 格式 2 在原來中斷傳輸和塊傳輸的基礎上增加了控制傳輸 3 可自動順序傳送多條命令,每條命令傳送之間可設定傳送間隔時間 4 在開啟埠的同時自動啟動接收執行緒...

usb除錯與adb除錯

之前沒有太注意二者的區別,這裡簡單記錄一下。usb除錯,android應用開發或許經常會用到,之前我也是用這個方式來除錯程式的,android裝置如果是手機的話就很方便,裝置開啟usb除錯,並用資料線連線電腦與android手機,你的android studio就能看到控制台有手機的日誌輸出了。如果...