历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | STM8S IO最快翻转速度

2020-02-03 来源:eefocus

需求:IO产生最快的翻转脉冲。

结论:最快速度5MHz.

第一次尝试:

IRC使能16M,不分频。

IO设置为推挽高速输出。

While(1)死循环翻转。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    while(1)

    {

        GPIO_WriteReverse(GPIOD, GPIO_PIN_3);

    }

}


实际波形如下:

在这里插入图片描述

结果是只有463KHz,达不到要求。

反思是有一层函数调用的原因,没有及时翻转。


第二次尝试:

把函数去掉直接操作。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    while(1)

    {

        GPIOD->ODR ^= (uint8_t)GPIO_PIN_3;

    }

}


实际波形如下:

在这里插入图片描述

结果已经有好转,翻转有1.311MHz。离目标还是有点远。

反思通过结构体访问寄存器,使用的是间接寻址,消耗了时间。


第三次尝试:

直接对硬件地址操作。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    while(1)

    {

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

    }

}


实际波形如下:

在这里插入图片描述

结果已经又有了进步,翻转速度是3.143Mhz.还是没有达到理想效果。

反思为什么是高电平比低电平多,是置高然后循环跳转回去指令耗时了。跳转指令有没有办法精简。


第四次尝试:

改循环语句。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    /*

    while(1)

    {

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

    }

    */

    /*

    for(;;)

    {

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

    }

    */

_LoopWrite:

    *((uint8_t *)GPIOD_BaseAddress) = 0;

    *((uint8_t *)GPIOD_BaseAddress) = 0x08;

    goto _LoopWrite;


}


实际汇编翻译效果:

在这里插入图片描述

这三种循环汇编跳转都是JRA,所以没有达到提速的效果。尝试失败。

反思是跳转耽误了时间,那尽可能的翻转,少跳转。


第五次尝试:

用空间换速度,多重复几次翻转,然后才循环。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    

    while(1)

    {

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

        *((uint8_t *)GPIOD_BaseAddress) = 0;

        *((uint8_t *)GPIOD_BaseAddress) = 0x08;

    }

}


实际波形图如下:

在这里插入图片描述

结果已经又有了进步,翻转速度是5.266Mhz.但是可以看到中间因为循环跳转指令带来的延时非常明显。

反思那足够多的重复指令,然后才接一次循环,就可以无限接近于没有跳转的效果。

尝试的结果是不会。当重复到一定次数,ROM存储空间存在跨页,跳转的时候会编译变长跳转,长跳转的指令周期比当前跳转机器周期长。

如果只是使用IO翻转,最大的速度只能到这么多了。

反思如果是有程序参与导致翻转速度受指令限制,那么硬件自己反应,应该比这个快。


第六次尝试:

使用PWM翻转。


代码如下:

void main(void)

{

    CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);  //16M

    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_HIGH_SLOW);

    

    TIM2_DeInit();

    TIM2_TimeBaseInit(TIM2_PRESCALER_1, 0x0001);

    TIM2_OC2Init(TIM2_OCMODE_TOGGLE, TIM2_OUTPUTSTATE_ENABLE,

    0x0000, TIM2_OCPOLARITY_HIGH);

    TIM2_Cmd(ENABLE);

    while(1)

    {

    }

}


实际波形图如下:

在这里插入图片描述

结果是3.943MHz,没有比IO直接翻转来得快。

反思是比较器比较的时候消耗了时间。


结论,IO最大的翻转速度是访问硬件地址直接操作IO。

推荐阅读

史海拾趣

Davico Industrial Ltd公司的发展小趣事

Davico Industrial Ltd公司发展故事一:技术突破与创新

Davico Industrial Ltd公司自创立以来,始终将技术创新作为企业发展的核心动力。在公司成立初期,面对电子行业竞争激烈的局面,Davico凭借对市场的敏锐洞察和对技术的不断追求,成功研发出了一款具有划时代意义的电子元器件。这款产品以其高性能、低能耗的特点,迅速在市场中占据了一席之地。此后,Davico不断加大对研发的投入,通过引进高端人才、建立先进的研发实验室等举措,持续推出了一系列具有竞争力的新产品,为公司的发展奠定了坚实的基础。

Davico Industrial Ltd公司发展故事二:市场拓展与品牌建设

随着技术实力的不断增强,Davico开始积极拓展国内外市场。公司通过与国内外知名企业的合作,不断提升产品的知名度和美誉度。同时,Davico还积极参与各类行业展会和论坛,展示公司的最新成果和技术实力,赢得了广大客户的认可和信赖。在品牌建设方面,Davico注重塑造企业形象和文化内涵,通过广告宣传、公益活动等方式,提高了品牌的社会影响力和知名度。

Davico Industrial Ltd公司发展故事三:质量管理与持续改进

Davico深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了完善的质量管理体系和检测手段。通过对生产过程的严格控制和对产品质量的不断追求,Davico的产品在市场中赢得了良好的口碑。同时,公司还积极开展持续改进活动,通过引进先进的生产设备和工艺、优化生产流程等措施,不断提高生产效率和产品质量。

Davico Industrial Ltd公司发展故事四:人才战略与团队建设

Davico高度重视人才队伍建设,通过制定合理的人才战略和激励机制,吸引了一批批优秀的人才加入公司。公司注重员工的培训和发展,通过定期的技能培训、知识更新等活动,不断提升员工的综合素质和专业技能。同时,Davico还建立了完善的团队协作机制,鼓励员工之间的沟通和合作,形成了一支高效、团结、富有战斗力的团队。

Davico Industrial Ltd公司发展故事五:绿色发展与社会责任

随着全球环保意识的不断提高,Davico积极响应国家绿色发展的号召,将环保理念融入到企业的生产经营中。公司通过引进环保设备、改进生产工艺等措施,降低了生产过程中的能耗和污染排放。同时,Davico还积极参与社会公益事业,通过捐款捐物、扶贫济困等方式,回馈社会、造福人民。这些举措不仅提升了企业的社会形象,也为公司的长远发展注入了新的动力。

ANADIGICS公司的发展小趣事

ANADIGICS是一家曾经存在的半导体公司,总部位于美国新泽西州的华兹堡市。以下是ANADIGICS公司发展的相关故事:

  1. 创立与初期发展:ANADIGICS公司成立于1985年,最初专注于开发射频(RF)集成电路和功率放大器。公司在其创始人的领导下迅速崛起,以其创新的技术和产品在无线通信领域赢得了声誉。

  2. 产品创新与市场占有率提升:ANADIGICS公司在其创立初期就致力于开发高性能的射频和功率放大器产品。随着移动通信技术的迅速发展,ANADIGICS的产品得到了广泛应用,其在市场上的份额逐渐增加。

  3. 全球扩张与市场渗透:ANADIGICS公司通过建立全球性的销售渠道和生产基地,扩大了其产品的市场覆盖范围。公司在美国、欧洲和亚洲等地设立了销售办事处和生产工厂,加强了与客户的联系,并提高了产品的交付效率。

  4. 技术领先地位与合作伙伴关系:ANADIGICS公司不断投入研发,保持技术领先地位。公司与各大手机制造商和无线通信设备供应商建立了合作伙伴关系,共同推动技术创新和产品发展。

  5. 挑战与破产:然而,随着市场竞争的加剧和技术变革的不断推进,ANADIGICS公司在市场上的地位逐渐受到挑战。公司陷入了财务困境,于2016年申请破产保护,并逐步停止了业务。最终,ANADIGICS公司在同年被日本半导体公司II-VI收购,结束了其独立运营的历史。

以上是ANADIGICS公司发展的一些主要故事,展示了该公司从创立到破产的发展历程。

DIALIGHT公司的发展小趣事

随着业务的不断发展和市场的不断扩大,DIALIGHT公司逐渐实现了全球化布局。他们在美国、英国、丹麦、德国、马来西亚、新加坡、澳大利亚、墨西哥和巴西等地设立了分支机构或办事处,为全球客户提供及时、高效的服务。此外,DIALIGHT还积极寻求与其他企业的合作与共赢,通过战略合作协议的签署,为双方带来新的业务机遇和合作空间。这些举措不仅增强了DIALIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。

请注意,由于篇幅限制,以上三个故事仅为DIALIGHT公司发展历程的简要概述。如需更详细的信息和更多故事,建议查阅相关资料或访问公司官网。

AEL [AEL Crystals Ltd]公司的发展小趣事

随着业务的不断发展,AEL Crystals意识到全球化战略的重要性。公司开始在全球范围内寻找合适的生产基地,并在英国、日本、台湾、韩国等地区建立了生产基地网络。这一战略布局使得AEL Crystals能够更好地满足全球客户的需求,同时也降低了供应中断的风险。

光磊(GL)公司的发展小趣事

AEL Crystals一直注重技术创新和产品升级。公司拥有一支专业的研发团队,致力于开发具有竞争力的新产品。通过不断引进新技术和新材料,AEL Crystals成功推出了一系列具有高性能和稳定性的频率控制产品。这些产品不仅满足了客户的多样化需求,也进一步巩固了公司在行业内的领先地位。

Chino-Excel公司的发展小趣事

随着公司规模的扩大,Chino-Excel公司开始实施全球化战略布局。公司先后在多个国家和地区设立研发中心和生产基地,以充分利用当地资源和市场优势。同时,公司加强与全球合作伙伴的紧密合作,共同开发新产品和技术,进一步巩固了在全球市场的地位。

问答坊 | AI 解惑

借人气问问如何连接两个GPRS模块?

最近我使用IWOW的TR800来做一个无线数传的项目,我在想移动既然分配给模块的ip是内网ip,那是否意味着两个模块连上GPRS网络之后,他们都是获得同一内网里的ip,就像连接到同一路由器里面的两台机器一样? 另外共享一下我觉得不错的技术QQ群 群5 ...…

查看全部问答>

请问现在做一个LED驱动(大小功率)安规费用

1,请问现在做一个LED驱动(大小功率)安规费用 第一次做个安规完,如果没过,对方提建议,也要收相同费用吗? 有没有过了才收费的; 2,过安规应该包含有电磁兼容项目吧…

查看全部问答>

请问:ATM64中PB4端口第二功能如何开启??

请问: ATM64中的PB4脚的第二功能是如何开启的? 是不是把T/C0控制寄存器TCCR0中的CS02、CS01、CS00位置0就可以了???(TCCR0=0X00) 大家一定要指点一下啊!!!!…

查看全部问答>

小弟新学TMS320LF2407,请教一下加载程序的问题

原来用的6416的片子,现在用的2407,想问下怎么能一上电就让dsp芯片运行我的程序?小弟新手希望各位大侠教的详细点,有资料发我邮箱也可以hljlishen0517@gmail.com   多谢各位了…

查看全部问答>

vxworks下U盘的插拔问题

小弟最近遇到个问题: 在vxworks中包含usb mass storage的相关组件,启动目标板后,插入U盘,读写操作都正确,但是拔掉后,再插入,就报告dosFsDevCreate失败,查看错误号,说是设备已存在,使用 hdr = iosDevFind(\"/usb/bd\", 0); iosDevDelet ...…

查看全部问答>

MS  SmartPhone 2003  SDK Sample GetDeviceID 严重错误

{         BOOL fRes;     DWORD dwBytesRetur…

查看全部问答>

74系列芯片功能大全

74系列芯片功能大全 这里是常用74系列芯片功能大全很有收藏价值   7400 TTL 2输入端四与非门7401 TTL 集电极开路2输入端四与非门7402 TTL 2输入端四或非门7403 TTL 集电极开路2输入端四与非门7404 TTL 六反相器7405 TTL 集电极开路六反相 ...…

查看全部问答>

帮忙看看这个 三相三线制缺相保护电路

这个电路在很多网站都有   对它解释也是相同 “这是一种用于三相三线制电源缺相保护电路,A、B、C缺任何一相,光耦器输出电平低于比较器的反相输入端的基准电压,比较器输出低电平,封锁PWM驱动信号,关闭电源。比较器输入极性稍加变动 ...…

查看全部问答>

TPS5430DDAR芯片过回流焊后无法正常工作,重新焊接上正常工作

如题,TPS5430DDAR芯片经过热风回流焊,峰值温度230℃左右,测试电源无法工作,将两片TPS5430DDAR用烙铁取下,交换下重新焊接上去,电源正常工作,请问这是什么原因??????…

查看全部问答>

mega128上SD卡的FAT文件系统

网上查了好多关于FAT文件系统的资料和库文件,尝试下都没成功。关于FAT文件系统一点头绪都没有啊,有没有做过这方面研究的大大教一下~…

查看全部问答>