[STM32F1] STM32F103 72M时钟下模拟IO口最高频率是多少?

[复制链接]
11713|17
 楼主| gdam999 发表于 2014-9-6 23:35 | 显示全部楼层 |阅读模式
我测试了一下IO口频率才3M多,是哪里出了问题,看了一下指令LED0=0; 这句有三条汇编指令,按照ARM大多数是单周期指令,每条指令应该在13.8ns左右,频率不应只有3M,是哪里出了问题?
int main(void)
{                 
        Stm32_Clock_Init(9);         //ϵͳʱÖÓÉèÖÃ
        delay_init(72);                     //ÑÓʱ³õʼ»¯
        LED_Init();                                   //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú   
        while(1)
        {
                LED0=0;
                LED0=1;
        }         
}


    15:         while(1)
    16:         {
0x080004C4 E006      B        0x080004D4
    17:                 LED0=0;
0x080004C6 2000      MOVS     r0,#0x00
0x080004C8 4903      LDR      r1,[pc,#12]  ; @0x080004D8
0x080004CA 6008      STR      r0,[r1,#0x00]
    18:                 LED0=1;
0x080004CC 2001      MOVS     r0,#0x01
0x080004CE 4903      LDR      r1,[pc,#12]  ; @0x080004DC
0x080004D0 F8C101A0  STR      r0,[r1,#0x1A0]
    15:         while(1)
 楼主| gdam999 发表于 2014-9-6 23:37 | 显示全部楼层
0x080004C6 2000      MOVS     r0,#0x00
0x080004C8 4903      LDR      r1,[pc,#12]  ; @0x080004D8
0x080004CA 6008      STR      r0,[r1,#0x00]

这3条指令要多少时钟周期?
 楼主| gdam999 发表于 2014-9-6 23:39 | 显示全部楼层
系统时钟已经设为72M了,谁能帮我看看是怎么回事,谢谢
 楼主| gdam999 发表于 2014-9-6 23:42 | 显示全部楼层
IO时钟也设为最大50M了
mmuuss586 发表于 2014-9-7 08:07 来自手机 | 显示全部楼层
while改成for循环
mmuuss586 发表于 2014-9-7 08:10 来自手机 | 显示全部楼层
led=0还有1多写几句,比如5句,10句测试下。单纯这样写速度是慢
mmuuss586 发表于 2014-9-7 08:13 来自手机 | 显示全部楼层
手机回描述不清的地方请谅解,最快理论值是36M
叶伤 发表于 2014-9-7 11:31 来自手机 | 显示全部楼层
while(1)//判断一次,要进行比较

这个估计耗了点时间
airwill 发表于 2014-9-7 12:40 | 显示全部楼层
大家分析得有道理, 不是 IO 口的速度不够, 而是指令太多了.
你可以用编译器优化, 最大优化下应该循环里只有三条指令, 再看看速度是多少吧
 楼主| gdam999 发表于 2014-9-7 16:24 | 显示全部楼层
    15:         while(1)
    16:         {
0x080004C4 E006      B        0x080004D4
    17:                 LED0=0;
0x080004C6 2000      MOVS     r0,#0x00
0x080004C8 4903      LDR      r1,[pc,#12]  ; @0x080004D8
0x080004CA 6008      STR      r0,[r1,#0x00]
    18:                 LED0=1;
0x080004CC 2001      MOVS     r0,#0x01
0x080004CE 4903      LDR      r1,[pc,#12]  ; @0x080004DC
0x080004D0 F8C101A0  STR      r0,[r1,#0x1A0]
    15:         while(1)
0x080004D4 E7F7      B        0x080004C6


while(1) 这个语句并没有判断,直接执行 B  无条件转移
 楼主| gdam999 发表于 2014-9-7 16:26 | 显示全部楼层
现在汇编指令已经够少了,我只是奇怪每条指令要多少时钟周期,
爱炫小王子 发表于 2014-9-7 19:15 来自手机 | 显示全部楼层
楼主你想干什么,例程里有最快IO翻转
 楼主| gdam999 发表于 2014-9-7 20:03 | 显示全部楼层

楼主你想干什么,例程里有最快IO翻转

在什么地方?
icecut 发表于 2014-9-7 20:49 | 显示全部楼层
你怎么不去看我的帖子呢????
https://bbs.21ic.com/icview-733502-1-1.html
mmuuss586 发表于 2014-9-7 21:01 来自手机 | 显示全部楼层
恩,看楼上的帖子,楼上测试过好像30多M
jianjun21st 发表于 2014-9-7 21:37 来自手机 | 显示全部楼层
这里关键瓶颈是从flash中取指太慢,flash访问速度一般在10MHz左右,所以3条指令达到3MHz正好符合预期。
chen_jhhb 发表于 2014-9-8 00:02 | 显示全部楼层
想快速、准确的话,就都用汇编
peakboy0016 发表于 2016-5-15 00:33 来自手机 | 显示全部楼层
用硬件pwm最大IO方波实测值为36MHz
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

87

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部