[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。