回答

收藏

[原创] GD32F150 之 IO口翻转速度测试

GD32 GD32 6044 人阅读 | 0 人回复 | 2015-07-22

今天来测试下GD32F150的IO速度,和STM32F103C8T6做个简单的对比。
GD32的测试程序如下:
  1. #include "gd32f1x0.h"


  2. //初始化HSI时钟
  3. void RCC_Config(void)
  4. {
  5.         RCC_HSI_Enable(ENABLE);
  6.         while(RCC_GetBitState(RCC_FLAG_HSISTB) != SET);
  7.         RCC_PLLConfig(RCC_PLLSOURCE_HSI_DIV2,RCC_PLLMUL_18);//改为24,可以超频至96Mhz
  8.         RCC_PLL_Enable(ENABLE);
  9.         while(RCC_GetBitState(RCC_FLAG_PLLSTB) != SET);
  10.         RCC_CK_SYSConfig(RCC_SYSCLKSOURCE_PLLCLK);
  11.         RCC_AHBConfig(RCC_CKOUTDIV_1);
  12.         RCC_APB1Config(RCC_APB1AHB_DIV1);
  13.         RCC_APB2Config(RCC_APB2AHB_DIV1);
  14.        
  15.         SystemCoreClockUpdate();
  16. }

  17. //配置GPIO
  18. void gpio_Config(void)
  19. {
  20.         GPIO_InitPara GPIO_InitStructure;

  21.         RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB,ENABLE);
  22.        
  23.         GPIO_DeInit(GPIOB);
  24.        
  25.         /* Configure pins as AF pushpull */
  26.         GPIO_InitStructure.GPIO_Pin     = GPIO_PIN_8;
  27.         GPIO_InitStructure.GPIO_Mode    = GPIO_MODE_OUT;
  28.         GPIO_InitStructure.GPIO_Speed   = GPIO_SPEED_50MHZ;
  29.         GPIO_InitStructure.GPIO_OType   = GPIO_OTYPE_PP;
  30.         GPIO_InitStructure.GPIO_PuPd    = GPIO_PUPD_NOPULL;
  31.         GPIO_Init( GPIOB , &GPIO_InitStructure);


  32. }

  33. int main(void)
  34. {
  35.         RCC_Config();
  36.         gpio_Config();
  37.        
  38.         while(1)
  39.         {
  40.                 GPIOB->BOR = GPIO_PIN_8;
  41.                 GPIOB->BCR = GPIO_PIN_8;
  42.                 GPIOB->BOR = GPIO_PIN_8;
  43.                 GPIOB->BCR = GPIO_PIN_8;
  44.                 GPIOB->BOR = GPIO_PIN_8;
  45.                 GPIOB->BCR = GPIO_PIN_8;
  46.                 GPIOB->BOR = GPIO_PIN_8;
  47.                 GPIOB->BCR = GPIO_PIN_8;
  48.                 GPIOB->BOR = GPIO_PIN_8;
  49.                 GPIOB->BCR = GPIO_PIN_8;
  50.                 GPIOB->BOR = GPIO_PIN_8;
  51.                 GPIOB->BCR = GPIO_PIN_8;
  52.                 GPIOB->BOR = GPIO_PIN_8;
  53.                 GPIOB->BCR = GPIO_PIN_8;
  54.                 GPIOB->BOR = GPIO_PIN_8;
  55.                 GPIOB->BCR = GPIO_PIN_8;
  56.                 GPIOB->BOR = GPIO_PIN_8;
  57.                 GPIOB->BCR = GPIO_PIN_8;
  58.                 GPIOB->BOR = GPIO_PIN_8;
  59.                 GPIOB->BCR = GPIO_PIN_8;
  60.                 GPIOB->BOR = GPIO_PIN_8;
  61.                 GPIOB->BCR = GPIO_PIN_8;
  62.                 GPIOB->BOR = GPIO_PIN_8;
  63.                 GPIOB->BCR = GPIO_PIN_8;
  64.                 GPIOB->BOR = GPIO_PIN_8;
  65.                 GPIOB->BCR = GPIO_PIN_8;
  66.                 GPIOB->BOR = GPIO_PIN_8;
  67.                 GPIOB->BCR = GPIO_PIN_8;
  68.                 GPIOB->BOR = GPIO_PIN_8;
  69.                 GPIOB->BCR = GPIO_PIN_8;
  70.                 GPIOB->BOR = GPIO_PIN_8;
  71.                 GPIOB->BCR = GPIO_PIN_8;
  72.                 GPIOB->BOR = GPIO_PIN_8;
  73.                 GPIOB->BCR = GPIO_PIN_8;
  74.                 GPIOB->BOR = GPIO_PIN_8;
  75.                 GPIOB->BCR = GPIO_PIN_8;
  76.                 GPIOB->BOR = GPIO_PIN_8;
  77.                 GPIOB->BCR = GPIO_PIN_8;
  78.                 GPIOB->BOR = GPIO_PIN_8;
  79.                 GPIOB->BCR = GPIO_PIN_8;
  80.         }
  81. }
复制代码
用逻辑分析仪100M采样,得到的结果:

基本上速度在6M左右。
STM32程序如下:
  1. #include <stm32f10x.h>

  2. ErrorStatus HSEStartUpStatus;
  3. //配置gpio
  4. void gpio_config()
  5. {
  6.         GPIO_InitTypeDef gpio_struct;
  7.        
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  9.        
  10.         gpio_struct.GPIO_Mode = GPIO_Mode_Out_PP;
  11.         gpio_struct.GPIO_Pin = GPIO_Pin_0;
  12.         gpio_struct.GPIO_Speed = GPIO_Speed_50MHz;
  13.        
  14.         GPIO_Init(GPIOA,&gpio_struct);
  15. }

  16. /*******************************************************************************
  17. *                           配置RCC
  18. *******************************************************************************/
  19. void RCC_Configuration(void)
  20. {   
  21. //复位RCC外部设备寄存器到默认值
  22.   RCC_DeInit();

  23.   //打开外部高速晶振
  24.   RCC_HSEConfig(RCC_HSE_ON);

  25.    //等待外部高速时钟准备好
  26.   HSEStartUpStatus = RCC_WaitForHSEStartUp();

  27.   if(HSEStartUpStatus == SUCCESS)   //外部高速时钟已经准别好
  28.   {                                                                    
  29.     //开启FLASH的预取功能
  30.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  31.     //FLASH延迟2个周期
  32.     FLASH_SetLatency(FLASH_Latency_2);
  33.        
  34.   //配置AHB(HCLK)时钟=SYSCLK
  35.     RCC_HCLKConfig(RCC_SYSCLK_Div1);  
  36.   
  37.    //配置APB2(PCLK2)钟=AHB时钟
  38.     RCC_PCLK2Config(RCC_HCLK_Div1);

  39.     //配置APB1(PCLK1)钟=AHB 1/2时钟
  40.     RCC_PCLK1Config(RCC_HCLK_Div2);

  41.      //配置PLL时钟 == 外部高速晶体时钟*9  PLLCLK = 8MHz * 9 = 72 MHz
  42.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  43.     //使能PLL时钟
  44.     RCC_PLLCmd(ENABLE);

  45.    //等待PLL时钟就绪
  46.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  47.     {
  48.     }

  49.   //配置系统时钟 = PLL时钟
  50.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  51.    //检查PLL时钟是否作为系统时钟
  52.     while(RCC_GetSYSCLKSource() != 0x08)
  53.     {
  54.     }
  55.   }
  56. }

  57. int main()
  58. {
  59.         gpio_config();
  60.        
  61.         while(1)
  62.         {
  63.                 GPIOA->BSRR = GPIO_Pin_0;
  64.                 GPIOA->BRR = GPIO_Pin_0;
  65.                 GPIOA->BSRR = GPIO_Pin_0;
  66.                 GPIOA->BRR = GPIO_Pin_0;
  67.                 GPIOA->BSRR = GPIO_Pin_0;
  68.                 GPIOA->BRR = GPIO_Pin_0;
  69.                 GPIOA->BSRR = GPIO_Pin_0;
  70.                 GPIOA->BRR = GPIO_Pin_0;
  71.                 GPIOA->BSRR = GPIO_Pin_0;
  72.                 GPIOA->BRR = GPIO_Pin_0;
  73.                 GPIOA->BSRR = GPIO_Pin_0;
  74.                 GPIOA->BRR = GPIO_Pin_0;
  75.                 GPIOA->BSRR = GPIO_Pin_0;
  76.                 GPIOA->BRR = GPIO_Pin_0;
  77.                 GPIOA->BSRR = GPIO_Pin_0;
  78.                 GPIOA->BRR = GPIO_Pin_0;
  79.                 GPIOA->BSRR = GPIO_Pin_0;
  80.                 GPIOA->BRR = GPIO_Pin_0;
  81.                 GPIOA->BSRR = GPIO_Pin_0;
  82.                 GPIOA->BRR = GPIO_Pin_0;
  83.                 GPIOA->BSRR = GPIO_Pin_0;
  84.                 GPIOA->BRR = GPIO_Pin_0;
  85.         }
  86. }

复制代码
用逻辑分析仪100M采样,得到的结果:

基本上在12M左右。
从以上结果来看,ST大概是GD的两位,虽然GD也不错,但GD还需要努力。毕竟150是value line系列,等申请到其它芯片再做测试。测试有疏忽的地方,还忘大家指出。



评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条