打印
[STM32F1]

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

[复制链接]
11227|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了

使用特权

评论回复
5
mmuuss586| | 2014-9-7 08:07 | 只看该作者
while改成for循环

使用特权

评论回复
6
mmuuss586| | 2014-9-7 08:10 | 只看该作者
led=0还有1多写几句,比如5句,10句测试下。单纯这样写速度是慢

使用特权

评论回复
7
mmuuss586| | 2014-9-7 08:13 | 只看该作者
手机回描述不清的地方请谅解,最快理论值是36M

使用特权

评论回复
8
叶伤| | 2014-9-7 11:31 | 只看该作者
while(1)//判断一次,要进行比较

这个估计耗了点时间

使用特权

评论回复
9
airwill| | 2014-9-7 12:40 | 只看该作者
大家分析得有道理, 不是 IO 口的速度不够, 而是指令太多了.
你可以用编译器优化, 最大优化下应该循环里只有三条指令, 再看看速度是多少吧

使用特权

评论回复
10
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  无条件转移

使用特权

评论回复
11
gdam999|  楼主 | 2014-9-7 16:26 | 只看该作者
现在汇编指令已经够少了,我只是奇怪每条指令要多少时钟周期,

使用特权

评论回复
12
爱炫小王子| | 2014-9-7 19:15 | 只看该作者
楼主你想干什么,例程里有最快IO翻转

使用特权

评论回复
13
gdam999|  楼主 | 2014-9-7 20:03 | 只看该作者

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

在什么地方?

使用特权

评论回复
14
icecut| | 2014-9-7 20:49 | 只看该作者
你怎么不去看我的帖子呢????
https://bbs.21ic.com/icview-733502-1-1.html

使用特权

评论回复
15
mmuuss586| | 2014-9-7 21:01 | 只看该作者
恩,看楼上的帖子,楼上测试过好像30多M

使用特权

评论回复
16
jianjun21st| | 2014-9-7 21:37 | 只看该作者
这里关键瓶颈是从flash中取指太慢,flash访问速度一般在10MHz左右,所以3条指令达到3MHz正好符合预期。

使用特权

评论回复
17
chen_jhhb| | 2014-9-8 00:02 | 只看该作者
想快速、准确的话,就都用汇编

使用特权

评论回复
18
peakboy0016| | 2016-5-15 00:33 | 只看该作者
用硬件pwm最大IO方波实测值为36MHz

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

82

帖子

1

粉丝