請(qǐng)教CH582如何用IO模擬4M高速采集端口數(shù)據(jù)?

#define PK GPIO_Pin_14

int main()

{

? SetSysClock( CLK_SOURCE_PLL_80MHz );

? GPIOB_ModeCfg( PK, GPIO_ModeIN_Floating );? ? //PK=1M

? while( 1 )

? {

? ? if(? GPIOB_ReadPortPin(? PK? )? ?)? GPIOB_SetBits(LED);

? ? else? GPIOB_ResetBits(LED);

? }

image.png

請(qǐng)問如上圖顯示,PK輸入800K,有丟步現(xiàn)象,1.5M的話,丟步更厲害,不知如何用IO模擬4M高速采集端口數(shù)據(jù)?


將主循環(huán)的代碼放到RAM跑,把主程序封成一個(gè)函數(shù),之后用__HIGH_CODE修飾。

emobile_2022-03-30_14-57-31.png


按你的方法,代碼如下,測(cè)試一下,效果有所改進(jìn),但1.5M就出現(xiàn)丟步現(xiàn)象。按理說80M的系統(tǒng)時(shí)鐘處理1.5M的脈沖綽綽有余,因?yàn)镸PU大部分指令應(yīng)該是一個(gè)系統(tǒng)時(shí)鐘吧?上次中斷也是測(cè)試過,也是類似現(xiàn)象。有沒有關(guān)于CH582的一些參數(shù)指標(biāo)的文檔,看一下。

#define?PK GPIO_Pin_14

_HIGH_CODE

void acq( void )

{


? while( 1 )

? {

? ? if(? GPIOB_ReadPortPin(? PK? )? ?)? GPIOB_SetBits(LED);

? ? else? GPIOB_ResetBits(LED);

? }

}

int main()

{

? SetSysClock(?CLK_SOURCE_PLL_80MHz?);

? GPIOB_ModeCfg(?PK?,?GPIO_ModeIN_Floating?);? ? //PK=1M

??acq( );

}


我又測(cè)試了一下,循環(huán)執(zhí)行一條指令,如下:

_HIGH_CODE

void acq( void )

?while( 1 )

? {

? ? GPIOB_InverseBits(PLED);

? }

輸出頻率為5M,80M的主頻,怎么會(huì)只輸出5M??


這邊雖然是一句函數(shù),但是匯編指令是五條,那么一個(gè)周期就是十條,如果一條指令需要一個(gè)機(jī)器周期,那么理論上輸出頻率是8M,如果想提高的話,需要在主循環(huán)中多加幾條翻io的函數(shù),那么一個(gè)周期需要的平均指令就會(huì)減少,輸出10M以上。

這樣寫也會(huì)提高不少

?R32_PA_OUT |= GPIO_Pin_4;

?R32_PB_CLR = GPIO_Pin_4;


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频