串口調(diào)試在項(xiàng)目中被使用越來越多,串口資源的緊缺也變的尤為突出。很多本本人群,更是深有體會,不準(zhǔn)備一個USB轉(zhuǎn)串口工具就沒辦法進(jìn)行開發(fā)。
了解USB虛擬串口,為了在項(xiàng)目中用一下這個USB,調(diào)試方便一些,供電可直供。公司以后的產(chǎn)品開發(fā)就基于STM32這個平臺,從contex_M3到contex-M4。不管速度、功耗、價格、采購的方便性都有競爭力,不想再修改了(除非它無法滿足要求)。
STM32基本上都帶有USB串口。如果不把它用上而另外加一個USB轉(zhuǎn)串口單元,未免顯得太落后了而且也是一種資源的浪費(fèi)。順便說一下,根據(jù)公司的狀況,合適的才是好的。以前一直用TI的,從430到ARM到28XX。這個ST的包含了以前的所有,TI的ARM速度比較慢,而它的普通的DSP的速度與M4相當(dāng),有些還比不過M4,耗電卻驚人,何況M4帶了浮點(diǎn)后比定點(diǎn)在某些地方要快很多。難怪TI在推M4時故意將頻率放慢,DSP功能減少,我想各個公司都有自已的考慮吧。而ST就把CMOS傳感器接口也放進(jìn)去。趕明兒啥時有空了再做塊PCB試試。ST最讓人不爽的是它的開發(fā)例程做的太淺,例如超速USB2。0,CMOS接口資料幾乎沒有,TCP/IP也淺嘗即止,網(wǎng)頁也設(shè)計(jì)得世界上最爛,讓人找個芯片,找個資料很累。在應(yīng)用上比NXP差遠(yuǎn)了,畢竟有個ZLG幫忙,F(xiàn)REESCALE在網(wǎng)絡(luò)通訊方面的應(yīng)用做得最好,看他們的TCP/IP源代碼是一種享受??磥碜鲂酒荢T的強(qiáng)項(xiàng),做應(yīng)用還非常有待加強(qiáng)。
說明:
1.跳過驅(qū)動。使用低速傳輸。最大可以設(shè)為921000即100KB/S。應(yīng)該也差不多了。只傳一些簡單的東西。因?yàn)槲覀児ぷ鞯闹攸c(diǎn)是工業(yè)控制,無需高速,而我們是以完成任務(wù)為主要目的。而不是非要學(xué)什么東西,完成任務(wù)才是第一重要的。
2.由于例程中沒有操作系統(tǒng)支持,也許以后可以用keil的操作系統(tǒng)。比較簡單,最重要的是ucOS不支持M4的浮點(diǎn)運(yùn)算。當(dāng)然對于M3我們可以將USB部分移到ucOS上。而對于M4,我們直接用KeilOS,不想花很大力氣去做OS移植了。
總是先從main開始
Set_System();///設(shè)置系統(tǒng)
Set_USBClock();///設(shè)置USB時鐘
USB_Interrupts_Config();///配置USB中斷
USB_Init();///USB初始化
while(1)
{
if((count_out!=0)&&(bDeviceState==CONFIGURED))
{
USB_To_USART_Send_Data(&buffer_out[0],count_out);//如果有數(shù)據(jù)將它發(fā)送到串口中去
count_out=0;/////發(fā)送完后這個清零
}
}
初看一下,還算比較好理解,但是由于這個例子好象只有發(fā),沒有收。我想它的收大約在中斷中進(jìn)行的(也就是串口向USB發(fā)的過程,估計(jì)在串口中斷中進(jìn)行,后面我們可以再分析,不行可能需要自行加上這部分代碼,希望不要這樣)
我們還是一條一條的來看,首先看Set_System()這個函數(shù),如果沒猜錯的話,應(yīng)該是設(shè)置時鐘吧。
果然如此,我們下面一條一條看一下,它先是允許外部晶振---這里哆嗦一下,外部晶振我公司采用12M。而一般開發(fā)版采用8M。所以配置stm32f10x_conf.h文件中,要將外部晶振頻率從8000000改為12000000。
然后,等外部晶振起來,如果晶振沒焊接好,此時就會死在這里。如果你一運(yùn)行就死,可找一下這個地方。
然后它做下列工作:
允許FLASH取指緩沖
FLASH時鐘分頻2倍-------這是否意味著FLASH的時鐘是36M呢,記得好象有ST的文章中說FLASH可工作在50M的時鐘下。
系統(tǒng)頻率HCLK配置成SYSCLK
APB2的時鐘配置成SYSCLK不分頻
APB1的時鐘配置成2分頻。但要注意它下面的定時器2,3,4。。頻率仍是72M因有倍頻
ADC的時鐘配置成6分頻,即它是12MHz。注意AD需13.5個時鐘完成意味著差不多1us可完成一次AD轉(zhuǎn)換。
PLL配置成9倍頻。8X9=72MHz。注意到對于12MHz就只能是6了。此處一定要注意。
允許PLL然后等PLL都OK了再做別的。--此后由PLL進(jìn)行工作而不是HSI。
然后,我們要允許GPIOA,GPIOB和串口的時鐘。因?yàn)槲覀冎挥玫搅诉@幾個資源。當(dāng)然USB是另外的,我想總會在某個地方允許的。下面這個就不好理解了:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_DISCONNECT,ENABLE);這個叫允許USB斷開線。從原理圖上看好象是PE7來控制的。因?yàn)镻E7連接到一個DP+的一個上拉電阻控制的三極管上面。請參考原理圖。但是比較奇怪的是在platform_config.h中有下列定義:
#defineRCC_APB2Periph_GPIO_DISCONNECTRCC_APB2Periph_GPIOD
它將這個設(shè)為端口D。所以這個USB斷開引腳到底是由誰來控制的還未確定。這里留下一個問號,等以后再解決。
接下來,將USB的斷開腳配置成上拉的。這也就意味著在開始時,這個上拉電阻使得三極管導(dǎo)通,從而使這個DP腳被加了一個1.5K的電阻,可以開始枚舉的。再看這個斷開腳指的是哪一個腳,它不是PD9就是PB14。怎么也沒有PE7的說法(原理圖)。所以這里就有點(diǎn)不知所以然了。難道這個原理圖與程序有沖突?
接下來配置PA10為輸入浮空,配置PA9為PP輸出。這兩個腳是串口。這個是正確的。我們幾孚所有的板子都用UART0,它就是這兩個腳的。至此這個部分結(jié)束了。
評論