|
本帖最后由 cjwmusic 于 2013-5-2 10:26 编辑
分别用库,寄存器对STM32的I/O口的输出翻转速度进行了测试
测试环境:
编译器:IAR 6.4 FOR ARM
特殊设置:代码高速优化
芯片:STM32F103C8T6
时钟:外部8MHz,PLL到72MHz
示波器:Tektronix TDS 2004B
1、用库
(1)代码如下:
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
......(中间重复很多句)
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
}
(2)测试结果:
峰值:408mv 频率:2.7MHz 周期:361ns
( 3 )波形图:
2、用寄存器 GPIOx_ODR
(1)代码如下:
while(1)
{
GPIOB->ODR = 0xffffffff;
GPIOB->ODR = 0;
......(中间重复很多句)
GPIOB->ODR = 0xffffffff;
GPIOB->ODR = 0;
}
(2)测试结果:
峰值:420mv 频率:18MHz 周期:55.55ns
(3)波形图
3、用寄存器 GPIOB->BRR和GPIOB->BSRR
(1)代码如下:
while(1)
{
GPIOB->BRR = GPIO_Pin_5;
GPIOB->BSRR = GPIO_Pin_5;
......(中间重复很多句)
GPIOB->BRR = GPIO_Pin_5;
GPIOB->BSRR = GPIO_Pin_5;
}
(2)测试结果:
峰值:380mv 频率:18Mhz 周期:55.55ns
(3)波形图
4、总结和疑问
(1)总结:A: STM32的i/o翻转速度确实能够达到宣称的18MHz
B: 库函数的效率确实比较低
C: 之前看到有人说GPIOx_ODR要比GPIOx_BSRR慢,因为前者先要读出来,修改了,再写进去,后者直接写入。但实测却没发现有什么快慢差别。
也有可能这个实验中看不到他们两个的速度差异吧。
(2)疑问:为什么峰值只有几百mv呢? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|