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