STM8S 與 STM32F IO口輸出速率測試
今天查看STM32資料時(shí),對輸出速度2M 10M 50M不是很了解,再加上移植ARF2496K程序到STM32時(shí)出現(xiàn)意外情況。
一、STM8S端作為接收端和發(fā)送端時(shí)接收到的數(shù)據(jù)都正常。
二、發(fā)送端(STM8S),接收端(STM32)這時(shí)也正常。
三、發(fā)送端(STM32),接收端(STM8)時(shí),接收到的就是錯(cuò)誤數(shù)據(jù),數(shù)據(jù)每次都相同,但是是錯(cuò)的。
于是,便考慮是不是STM32 I/O輸出速度太快導(dǎo)致的,今天便拿示波器測試,果然,豁然開朗。
網(wǎng)上很多全他媽瞎說,STM32的I/O輸出配置成2MHz 10MHz 50MHz根本就不是所謂的輸出速度,僅僅是翻轉(zhuǎn)速度。
測試示波器為 RIGOL DS1062CA,探頭為10X,通道二進(jìn)行捕獲。
硬件: STM32F107主控,采用神舟IV開發(fā)板。 另外STM8S主控,采用STM8S核心板
軟件: 分為使用庫函數(shù)和非庫函數(shù)兩種。
一、 使用庫函數(shù)做輸出:
intmain()
{
SystemInit();//初始化系統(tǒng)時(shí)鐘源選擇,PLL等這是個(gè)庫函數(shù),使用外部晶振系統(tǒng)工作與72MHz
#if1//測試I/O翻轉(zhuǎn)速度,庫函數(shù)2M左右,直接操作寄存器8M
Init_PD11();//
while(1)
{
GPIO_SetBits(GPIOD,GPIO_PD11);
GPIO_ResetBits(GPIOD,GPIO_PD11);
}
#endif
}
voidInit_PD11()
{
GPIO_InitTypeDefgpio;
//將LED對應(yīng)的PD口外設(shè)時(shí)鐘打開
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);
}
示波器波形圖如下:
實(shí)測,無論 GPIO_Speed初始成多少,都是這個(gè)波形。也就是說輸出速度就這么點(diǎn)了(2.25MHz),跟所謂的2M,10M,50M沒什么關(guān)系。
上升沿時(shí)間與下降沿時(shí)間相比要長。
二、直接操作寄存器
只是改動while(1)循環(huán)中的代碼,如下:
while(1)
{
GPIOD->BSRR=GPIO_Pin_11;
GPIOD->BRR=GPIO_Pin_11;
}
示波器波形如下:
實(shí)測,2M 10M 50M輸出都是這個(gè)波形,但速度明顯提升3.5倍,由此可見庫函數(shù)效率低下。 按手冊所講應(yīng)該的翻轉(zhuǎn)速度最大為18MHz,不知道什么原因,我這里只能測試出8MHz速度。
同樣,上升的時(shí)間比下降的時(shí)間長。
STM8S測試部分
這里測試時(shí),增加了一部分內(nèi)容,STM8S 4分頻后測試和 STM8S 不分頻測試。 使用內(nèi)部16MHz RC 振蕩器。
第一種情況,4MHz主頻進(jìn)行測試
一、 使用庫函數(shù),代碼如下:
main()
{
CLK_CKDIVR=CLK_CKDIVR_HSIDIV_4;//fHSI=16/4=4MHz將主時(shí)鐘分頻
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);
}
}
示波器波形如下:
這里上升時(shí)間與下降時(shí)間差距并不怎么明顯。
二、操作寄存器控制輸出
代碼改動如下:
while(1)
{
GPIOB->ODR|=GPIO_PIN_1;//其實(shí)這就是庫函數(shù)的代碼,只是免去了調(diào)用函數(shù)的過程
GPIOB->ODR&=~GPIO_PIN_1;
}
示波器波形如下:
這里能清晰看出上升與下降的時(shí)間差別,而且速度也快了8倍,其實(shí)這些時(shí)間只是耗費(fèi)在了函數(shù)調(diào)用與返回上。
第二種情況,16MHz主頻進(jìn)行測試。
這里就不再測庫函數(shù)的IO速度了,除去函數(shù)調(diào)用,內(nèi)部代碼就是一致的。
直接操作寄存器控制輸出,示波器波形如下:
挺給力,竟然能達(dá)到3.2MHz。
總結(jié):
STM32 里面的輸出速度不是I/O翻轉(zhuǎn)速度,本人測試速度僅為8MHz
STM32的庫函數(shù)效率比較猥瑣。
之前接收端與發(fā)送端都采用STM8S的情況下,將頻率分頻為4MHz下,通信是正常的,嘗試過將發(fā)送端頻率不分頻,使用其16MHz,現(xiàn)象和我在STM32里面的一致。
能進(jìn)行正常通信的情況下,I/O口速率為95.8KHz,當(dāng)時(shí)并沒有采用直接操作寄存器的方式。現(xiàn)在發(fā)現(xiàn),原來STM8S 16MHz主頻下I/O速度竟然達(dá)到了3.2MHz,STM32作為發(fā)送端,自然I/O口速度最小都有2.2MHz, 很有可能是因?yàn)檫@個(gè)速度太快,而ARF2496K的速度跟不上導(dǎo)致的,至于為什么,暫時(shí)還沒有能力進(jìn)行探究。