1588|2

238

帖子

2

TA的资源

纯净的硅(初级)

楼主
 

【国民技术N32WB031_STB开发板评测】 GPIO翻转性能测试 [复制链接]

N32WB03x的GPIO翻转性能测试

前言

某些情况下,需要使用GPIO来模拟一些外设,虽然这会占用较多的MCU。为了弄清mcu的GPIO翻转速度上限,还是有必要测试一下的。

官方GPIO翻转工程

在这个目录下,有官方的GPIO翻转最高速度的工程

N32WB03x_V1.3.0\5-Software Development Kit\N32WB03x_SDK_V1.3\projects\n32wb03x_EVAL\peripheral\GPIO\IOToggle_MaxFrequency

用keil打开这个工程,可以看到main.c程序

int main(void)
{
    /* -1- Enable GPIOx Clock (to be able to program the configuration registers) */
    RCC_EnableAPB2PeriphClk(GPIOx_CLK, ENABLE);

    /* -2- Configure GPIOx_PIN in output push-pull mode */
    GPIO_InitStruct(&GPIO_InitStructure);
    GPIO_InitStructure.Pin = GPIOx_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH;
    GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);

    /* -3- Toggle GPIOx_PIN in an infinite loop */
    while (1)
    {          
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
    }
}

 

然后编译烧录后,使用示波器测试,翻转速度在8Mhz左右。为了进一步测试上限,尝试将函数放到RAM里执行。


MCU的程序在Flash里和RAM里有什么区别?

由于MCU的资源都比较小,常见产品的Flash也是支持XIP的,也就是MCU可以直接在Flash里取指令并直接执行。所以并不像PC那样,必须将程序加载到RAM里才可以运行。同时因为很多MCU的速度远高于Flash的速度,为了提高执行效率,工程师们一般使用三种办法(如果有其他的办法,麻烦大家帮忙补充一下)。

  1. 增加ICache,在核心与Flash之间增加指令缓冲,加快执行速度。
  2. 使用部分SRAM作为零缓冲区,在mcu启动时自动将Flash的大部分加载到零缓冲区(缓冲区和Flash的数据同步由硬件自行完成,无需用户干预)。
  3. 将一部分函数在mcu启动时从Flash加载到RAM里,在RAM里执行这些函数。

如何在keil中指定部分函数加载到RAM里

  1. 点击 Options for Target..图标,然后在弹出的选项卡里选择Linker选项卡
  2. 取消勾选左上角的Use Memory Layout from Target Dialog,然后点击下边sct文件旁边的edit按钮(见图片), 然后点击OK关闭选项卡
  3. 修改.sct文件,自定义一个section(这里我们使用RAMCODE),放在RW_IRAM1段
  4. 将#pragma arm section code = "RAMCODE"放在main函数前,#pragma arm section放在main函数后。

.sct的最终内容如下

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x01000000 0x00040000  {    ; load region size_region
  ER_IROM1 0x01000000 0x00040000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x0000C000  {  ; RW data
   *.o(RAMCODE)
   .ANY (+RW +ZI)
  }
}

 

main函数修改后最终内容如下

#pragma arm section code = "RAMCODE"
int main(void)
{
    /* -1- Enable GPIOx Clock (to be able to program the configuration registers) */
    RCC_EnableAPB2PeriphClk(GPIOx_CLK, ENABLE);

    /* -2- Configure GPIOx_PIN in output push-pull mode */
    GPIO_InitStruct(&GPIO_InitStructure);
    GPIO_InitStructure.Pin = GPIOx_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_HIGH;
    GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);

    /* -3- Toggle GPIOx_PIN in an infinite loop */
    while (1)
    {          
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
        GPIOA->POD = 1;
        GPIOA->POD = 0;
    }
}
#pragma arm section

 

编译烧录后,可以看到速度增加到9.25MHz,应该就是这个MCU的GPIO极限翻转速度了,详见截图。

 

此帖出自RF/无线论坛

最新回复

放内存,放flash,还不如直接汇编来得实在一些吧。  详情 回复 发表于 2023-5-12 19:14
点赞 关注
 

回复
举报

6960

帖子

11

TA的资源

版主

沙发
 
放内存,放flash,还不如直接汇编来得实在一些吧。
此帖出自RF/无线论坛

点评

大佬可以试试汇编的GPIO速度是多少,菜鸡不会写汇编  详情 回复 发表于 2023-5-12 20:55
 
 

回复

238

帖子

2

TA的资源

纯净的硅(初级)

板凳
 
lugl4313820 发表于 2023-5-12 19:14 放内存,放flash,还不如直接汇编来得实在一些吧。

大佬可以试试汇编的GPIO速度是多少,菜鸡不会写汇编

此帖出自RF/无线论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
ADSL处理故障三部曲

作为宽带接入性价比最高的有效手段,ADSL已经成为网民们耳熟能详的名词,在家庭和企业应用中得到迅速的普及。随着资费的不断下 ...

STN-LCD彩屏模块

摘要:本文介绍了彩色STN-LCD模块的内部结构、主要器件,以及设计选用要求。 关键词:彩色STN-LCD模块 LCM LED 电荷泵 升压 ...

0-30v_4a數控穩壓電源 完整的源程序及SCH & PCB

0-30v_4a數控穩壓電源 完整的源程序及SCH & PCB http://download.ourdev.cn/bbs_upload943894/files_10/ourdev_366975.JPGhtt ...

2007年国赛高频方向题目解析——无识别线装置

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 终于把07年高频题目解析完成了,从上一篇写完就开始写这篇了, 最近两个月项目比 ...

手把手教你做 eZ-FET Lite仿真器

本帖最后由 suyuping99 于 2013-12-27 23:35 编辑 MSP430G2553的launchpad上,是板载仿真器的,或许你并不陌生,一片MSP430F1 ...

PIR感应模块厂商

大家好! 有没推荐做PIR感应模块比较出名的厂商?现要求产品减价,现用的模块工作条件比较稳定,但是价格稍贵。找了另一家 ...

想了解UWB?看完这篇就够了。

     UWB 技术的起源   在 20 世纪 90 年代末和 21 世纪初,全球定位系统 (GPS) 就已经成为主流。最开始是室外导航 ...

通信电平转换指南

在我们电路设计中,常常会遇到通信电平转换的问题,在应用电平转换的措施之前还需要判断进行电平转换的必要性。 如果你是 ...

拥抱大数据时代 解读5G通信时钟同步技术

作者: Wofle Yu 前言 随着大数据、云计算和物联网时代的到来,通信系统从集中式系统向分布式系统发展,在集中式系统中 ...

MOS管同步整流的原理

大家好! 最近在学习电源设计的原理图,遇到同步整流的问题,想请教几个问题: 1、使用MOS管做同步整流时,MOS管在什么时候导 ...

快速回复 返回顶部 返回列表