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)}}
3、usb註冊到rtt控制台#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*/
在將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()
函式,具體實現如下。之後需要在usbd_cdc_if.c檔案中修改uint8_t usbd_recv_data()
char
rt_hw_console_getchar
(void
)
cdc_receive_fs
函式為如下具體思路就是將接受的函式乙個乙個的傳入接受的訊息佇列,然後從訊息佇列中挨個讀出。上述的**實現只滿足了最基本的功能,其實可以將接收訊息的長度傳送到訊息佇列,方便對資料進行處理。因為前期只是用於除錯,所以並沒有實現該功能,且rx_thread執行緒裡面並未進行任何操作。static int8_t cdc_receive_fs
(uint8_t* buf, uint32_t *len)
return
(usbd_ok)
;/* user code end 6 */
}
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就能看到控制台有手機的日誌輸出了。如果...