[STM32系列]二、实现STM32 GPIO端口状态实现最大速度翻转

[STM32系列]二、实现STM32 GPIO最快速度翻转

文章目录

  • [STM32系列]二、实现STM32 GPIO最快速度翻转
  • 前言
  • 一、实验准备
  • 二、测试
    • 1.C语言翻转测试
    • 2.汇编翻转测试
  • 总结


前言

在STM32F103系列应用过程中可能会遇到需要以最大速度翻转GPIO口的情况,查询网上资料得知IO口最大翻转速度位18MHZ,下面给出实现最大翻转速度的测试方法。


一、实验准备

本次实验对象是HK32F103RBT6,采用的测试GPIO端口位GPIOA,GPIO引脚为GPIO_PIN_15,由于该引脚比较特殊为JTAG引脚,所以在实验前需要失能JTAG功能,开启GPIOA端口和重映射时钟设置端口,配置IO端口的相关参数。

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIOA的基地址为0x40010800,BRR相对于GPIOA偏移为0x10,写“1”实现“置1”操作,BSRR相对于GPIOA偏移为0x14,写“1”实现“置0”操作。

二、测试

1.C语言翻转测试

首先使用C语言进行测试,代码如下

while (1)
 {
	GPIOA->BRR = 0x8000;	//高
	GPIOA->BSRR = 0x8000;	//低
 }

简单的两行代码实现 ,那么实际IO口输出速度是多少呢?示波器(衰减10倍)显示如下:
[STM32系列]二、实现STM32 GPIO端口状态实现最大速度翻转_第1张图片
可见IO口速度在0级优化为6.5M,远没有达到18M,查看其汇编可见这两条语句被汇编成多条语句,限制了其速度。那么直接调用汇编速度会达到多少呢。

2.汇编翻转测试

主程序调用汇编定义函数如下,B指令实现无条件跳转至toggle标签

speed_test PROC
	EXPORT  speed_test
	LDR     R0,=0x40010800
	LDR     R1,=0x8000
toggle
	STR     R1,[R0,#0x10]
	STR     R1,[R0,#0x14]  
	B		toggle
	BX      LR
	ENDP	

这次IO翻转速度又是多少,示波器(衰减10倍)测量如下:

[STM32系列]二、实现STM32 GPIO端口状态实现最大速度翻转_第2张图片
示波器显示18M,达到了目标的IO口翻转速度

总结

STM32在72MHZ运行下其IO口最大的翻转速度可达18M。

你可能感兴趣的:(STM32系列,stm32,gpio,反汇编,c语言)