STM8S IO最快翻转速度

发布者:RainbowPromise最新更新时间:2020-02-03 来源: eefocus关键字:STM8S  翻转速度 手机看文章 扫描二维码
随时随地手机看文章

需求: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。

关键字:STM8S  翻转速度 引用地址:STM8S IO最快翻转速度

上一篇:使用STM8S自带BootLoader_2
下一篇:STM8 入门学习与实验(一)GPIO与UART

推荐阅读最新更新时间:2024-11-17 17:19

STM32的IO外部中断EXTI的使用
一、前言 在之前针对 STM32 的G PI O相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读 信号 引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取 检测 操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EX TI 的结构,接着介绍外部中断的相关概念,对STM32的IO外部中断EXTI有个初步的了解,在此基础上重点围绕IO外部中断EXTI的使用展开分析。 图1 外部中断设计 二、EXTI结构 EXTI(Ex te rnal interrupt/event controller)—外部中断/事件 控制器 ,管理了控制器的
[单片机]
STM32的<font color='red'>IO</font>外部中断EXTI的使用
STC单片机IO管脚毁坏动态自检程序
/*--------------------------------------------------------- STC单片机IO管脚毁坏动态自检程序 HotPower@126.com 2005.6.6 于西安大雁塔村队部 ----------------------------------------------------------*/ #include REGX52.h #include stdio.h #include absacc.h #include intrins.h #include string.h #pragma NOAREGS //STC ISP_V2.0 PCB的晶振为1
[单片机]
ADI推出用于楼宇和自动化控制的可配置IO产品组合
日前,ADI宣布发布行业首个用于楼宇控制和过程自动化的软件可配置输入/输出的产品组合,通过该产品,制造商和工业运营商可以更好地控制系统灵活性,同时降低产品复杂性。 随着系统越来越复杂,制造商不能通过固定的大型系统满足所有大众市场产品所需,因此他们需要更灵活的系统,以能够适应不断变化的需求。新的软件可配置输入/输出使制造商可以通过更灵活的自动化控制来有效地创建新项目,最终减少了设计和安装成本。 据该公司称,通过使用软件可配置的输入/输出,制造商可以开发一个平台,以取代多个老化的固定功能输入/输出模块,或者将其应用到多个客户应用中,其中每个安装的输入/输出均可动态变化。 此外,输入/输出桥接到基于以太网的控制网络,因为它可
[工业控制]
STM32 IO中断(F407)
Title:STM32单片机系列(三) Date: 2020-2-22 Author: Page Categories: -单片机 Tags: -STM32F407 中断 STM32 F4 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 F4 的强大之处。 STM32 F407 的中断控制器支持 22 个外部 中断事件请求。每个中断设有状态位,每个中断事件都有独立的触发和屏蔽设置。 STM32 F407的 22 个外部中断为: EXTI线 0~15 :对应外部 IO 口的输入中断。 EXTI线 16 :连接到 PVD 输出。 EXTI线 17 :连接到 RTC 闹钟事件。 EXTI线 18 :连接到 USB
[单片机]
STM32 <font color='red'>IO</font>中断(F407)
stm8s 开发SPI的两种方法
1: void GPIO_Configuration(void) Add GPIOA configuration void GPIO_Configuration(void) { GPIO_DeInit(GPIOD); /* Configure PD0 (LED1) as output push-pull low (led switched on) */ GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST); /* GPIOD reset */ GPIO_DeInit(GPIOC); /* Configure PD0 (LED
[单片机]
<font color='red'>stm8s</font> 开发SPI的两种方法
STM8S和STM8L调试串口中断的注意点
STM8L串口中断注意点 在调试PM2.5传感器GP2Y1051的时候,发现在仿真的时候开始能够进行数据的接受,但是如果暂停之后就不能接受数据,其实只是接收了一次完整的数据。 解决方法 if(USART_GetITStatus(USART1, USART_IT_RXNE)) { RecevieData = USART_ReceiveData8(USART1); switch(state_machine) 故需要在串口接收中断中做如下处理: STM8S串口中断注意点 征对STM8S003F3或者103系列等单片机,由于其余其他单片机不一样,串口接收中断中有ORE,即过载错误,收中断;如图: if(UAR
[单片机]
__I、 __O 、__IO是什么意思?
这是ST库里面的宏定义,定义如下: #define __I volatile const /*! defines 'read only' permissions */ #define __O volatile /*! defines 'write only' permissions */ #define __IO volatile /*! defines 'read / write' permissions */ 显然,这三个宏定义都是用来替换成volatile 和 const 的,所以我们先要了解 这两个关键字的作用: volatile 简单的说,就是不让编译器进行优化,即
[单片机]
泰克SATA接收机测试方法成为首家SATA-IO 1.2一致性测试规范方法
SATA-IO组织在完成SATA-IO 1.2一致性测试规范论证和相应的测试方法验证后,于近日首次公布了其测试规范标准。SATA RSG(SATA接受端信令测试和余量测试)成为千兆位串行标准里第一个要求强制执行的接收机测试。泰克公司的SATA接收机测试方法成为第一个被批准,在SATA-IO组织网站上公开的规范方法。在业界,完成接收机测试通常是很困难的。例如:   如何在多个不同的仪器中,建立一个实验室等级的、并能可靠产生一系列的可重复“带损伤”的信号   如何满足一致性测试规范中的要求在一系列复杂的“最差”条件下,产生复杂的所需“带损伤”的信号   如何在错误产生时,及时发现 PCI-E, SAS, Fibre-Channel,
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved