PG11属于IO口的高8位,需配置GPIOG-CRH寄存器以达到目的。
PG7属于IO口的低8位,需配置GPIOG-CRL寄存器以达到目的。配置如下,借用你的原文:
GPIOG-CRL=0X0FFFFFFF;GPIOG-CRL|=828; //把PG7定义为输入模式,即
GPIOG-CRL=0X8FFFFFFF;则寄存器位配置CNF1、CNF0、MODE1、MODE0分别是1000.
同理GPIOG-CRH=0X0FFFFFFF;GPIOG-CRH|=328;//是把PG7定义为推挽输出模式,即
GPIOG-CRH=0X3FFFFFFF;则寄存器位配置CNF1、CNF0、MODE1、MODE0分别是0011.
下面再稍微总结一下,GPIOx-CRH和GPIOx-CRL分别控制配置Px8-Px15和Px0-Px7这16个io口的模式,你可以从下面的图来理解:
是我的问题太难了吗?这个单片机IO翻转根本就达不到很高的速度吧 查看原帖
有多种方式可以做到,简单的你可以只用延时函数的方式,也可以使用定时器的方式,也可以使用PWM模块输出,都可以做到!!
主程序调用汇编定义函数如下,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口翻转速度
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Prescaler=1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period=TIM3_NUM;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3,DISABLE);
TIM_ClearFlag(TIM3,TIM_IT_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
其中TIM3_NUM和Prescaler根据你设定的频率和频率来设定。
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
//定时中断
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
//添加翻转IO电平语句
}
}
在这个中断函数里,来反转IO时钟就可以了。
需要一个步进电机驱动器,最简单的驱动就是自己写延时函数,定时翻转IO口的电平;也可以用定时器的PWM模式输出PWM,打开GPIO的复用,配置定时器到PWM模式就可以,每个定时器有4路PWM,每一路对应一个IO口,也可以重映射;复杂的加减速,就需要步进电机驱动算法,可以用SPTA算法,曲线趋近于S型。
本文标签:stm32翻转io函数