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

本文探讨如何在STM32F103系列中实现GPIO口的最大翻转速度,通过实验对比C语言和汇编语言实现GPIO翻转的效率。结果显示,在72MHz主频下,使用汇编语言能够达到理论上的18MHz翻转速度,而C语言由于编译优化限制,速度约为6.5MHz。
摘要由CSDN通过智能技术生成

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


前言

在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倍)显示如下:
在这里插入图片描述
可见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倍)测量如下:

在这里插入图片描述
示波器显示18M,达到了目标的IO口翻转速度

总结

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

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值