1. 程式人生 > >STM8S 與 STM32F IO口輸出速率測試

STM8S 與 STM32F IO口輸出速率測試

今天檢視STM32資料時,對輸出速度2M  10M  50M不是很瞭解,再加上移植ARF2496K程式到STM32時出現意外情況。

一、STM8S端作為接收端和傳送端時接收到的資料都正常。

二、傳送端(STM8S),接收端(STM32)這時也正常。

三、傳送端(STM32),接收端(STM8)時,接收到的就是錯誤資料,資料每次都相同,但是是錯的。

於是,便考慮是不是STM32 I/O輸出速度太快導致的,今天便拿示波器測試,果然,豁然開朗。

網上很多全他媽瞎說,STM32的I/O輸出配置成2MHz  10MHz  50MHz根本就不是所謂的輸出速度,僅僅是翻轉速度。

測試示波器為  RIGOL DS1062CA,探頭為10X,通道二進行捕獲。

硬體: STM32F107主控,採用神舟IV開發板。 另外STM8S主控,採用STM8S核心板

軟體: 分為使用庫函式和非庫函式兩種。

一、 使用庫函式做輸出:

int main()
{
	SystemInit(); //初始化系統時鐘源選擇,PLL等  這是個庫函式,使用外部晶振  系統工作與72MHz
#if 1	 // 測試I/O翻轉速度,庫函式2M左右,直接操作暫存器8M
	Init_PD11(); //
	while(1)
	{
               GPIO_SetBits(GPIOD,GPIO_PD11);
               GPIO_ResetBits(GPIOD,GPIO_PD11);
        }
#endif
}

void Init_PD11()
{
    GPIO_InitTypeDef gpio;

    //將LED對應的PD口外設時鐘開啟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); 

    gpio.GPIO_Pin = GPIO_Pin_11;
    gpio.GPIO_Speed = GPIO_Speed_2MHz;
    gpio.GPIO_Mode = GPIO_Mode_Out_PP; //推輓輸出
    GPIO_Init(GPIOD,&gpio);
}
示波器波形圖如下:

實測,無論 GPIO_Speed初始成多少,都是這個波形。也就是說輸出速度就這麼點了(2.25MHz),跟所謂的2M,10M,50M沒什麼關係。

上升沿時間與下降沿時間相比要長。

二、直接操作暫存器

只是改動while(1)迴圈中的程式碼,如下:

	while(1)
	{
               GPIOD->BSRR=GPIO_Pin_11;
               GPIOD->BRR=GPIO_Pin_11;
}
示波器波形如下:

實測,2M 10M 50M輸出都是這個波形,但速度明顯提升3.5倍,由此可見庫函式效率低下。 按手冊所講應該的翻轉速度最大為18MHz,不知道什麼原因,我這裡只能測試出8MHz速度。

同樣,上升的時間比下降的時間長。

STM8S測試部分

這裡測試時,增加了一部分內容,STM8S  4分頻後測試和 STM8S 不分頻測試。 使用內部16MHz RC 振盪器。

第一種情況,4MHz主頻進行測試

一、 使用庫函式,程式碼如下:

main()
{
	CLK_CKDIVR=CLK_CKDIVR_HSIDIV_4; //fHSI=16/4=4MHz      將主時鐘分頻

	GPIO_Init(GPIOB,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_FAST);
	while(1)
	{
		GPIO_WriteHigh(GPIOB,GPIO_PIN_1);
		GPIO_WriteLow(GPIOB,GPIO_PIN_1);
	}
}	
示波器波形如下:

這裡上升時間與下降時間差距並不怎麼明顯。

二、操作暫存器控制輸出

程式碼改動如下:

	while(1)
	{
		GPIOB->ODR |= GPIO_PIN_1; //其實這就是庫函式的程式碼,只是免去了呼叫函式的過程
		GPIOB->ODR &= ~GPIO_PIN_1;
       }
示波器波形如下:


這裡能清晰看出上升與下降的時間差別,而且速度也快了8倍,其實這些時間只是耗費在了函式呼叫與返回上。

第二種情況,16MHz主頻進行測試。

這裡就不再測庫函式的IO速度了,除去函式呼叫,內部程式碼就是一致的。

直接操作暫存器控制輸出,示波器波形如下:

挺給力,竟然能達到3.2MHz。

總結:

STM32 裡面的輸出速度不是I/O翻轉速度,本人測試速度僅為8MHz

STM32的庫函式效率比較猥瑣。

之前接收端與傳送端都採用STM8S的情況下,將頻率分頻為4MHz下,通訊是正常的,嘗試過將傳送端頻率不分頻,使用其16MHz,現象和我在STM32裡面的一致。

能進行正常通訊的情況下,I/O口速率為95.8KHz,當時並沒有採用直接操作暫存器的方式。現在發現,原來STM8S 16MHz主頻下I/O速度竟然達到了3.2MHz,STM32作為傳送端,自然I/O口速度最小都有2.2MHz, 很有可能是因為這個速度太快,而ARF2496K的速度跟不上導致的,至於為什麼,暫時還沒有能力進行探究。