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的速度跟不上導致的,至於為什麼,暫時還沒有能力進行探究。