stm32使用delay_xms函数延时不准问题

详细内容可以看STM32F4开发指南-寄存器版本_V1.2.pdf的第五章与STM32F3与F4系列Coretex-M4内核编程手册.pdf

首先介绍一下SysTick定时器

  CM4内核的处理和CM3一样,内部都包含一个SysTick定时器,SysTick是一个24位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。

其次看下SysTick定时器寄存器

SysTick->CTRL的各位定义如图所示
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

SysTick-> LOAD 的定义如图所示
在这里插入图片描述
在这里插入图片描述

SysTick-> VAL 的定义如图所示
在这里插入图片描述
在这里插入图片描述
这的STK_CTRL 寄存器就是SysTick->CTRL

void delay_xms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;			//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           			//清空计数器
	SysTick->CTRL=0x01 ;          			//开始倒数  
	do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达   
	SysTick->CTRL=0x00;       				//关闭计数器
	SysTick->VAL =0X00;     		  		//清空计数器	  	    
}

从delay_xms()函数的代码中,可以看出,延时不准确有可能出于SysTick->LODA存的值大于了16,777,215(2^24-1)导致,因为SysTick->LODA只取bit[23:0]。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ULN2003A5线4相步进电机中,可以使用`Delay_xms(speed)`函数来控制步进电机的转速。这个函数可以通过调整延时时间来控制步进电机的转速。延时时间越短,步进电机转速越快,延时时间越长,步进电机转速越慢。 以下是一个使用`Delay_xms(speed)`函数控制步进电机转速的示例代码: ``` #define IN1 2 #define IN2 3 #define IN3 4 #define IN4 5 void setup() { // 初始化引脚 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); } void loop() { // 步进电机的4个相位 int phase[4][4] = { {HIGH, LOW, LOW, LOW}, {LOW, HIGH, LOW, LOW}, {LOW, LOW, HIGH, LOW}, {LOW, LOW, LOW, HIGH} }; // 调整转速 int speed = 100; // 设置初始的延时时间 if (analogRead(A0) > 0) { // 判断A0(模拟输入)是否有输入 speed = map(analogRead(A0), 0, 1023, 50, 500); // 将输入映射为延时时间 } // 顺时针旋转 for (int i = 0; i < 4; i++) { digitalWrite(IN1, phase[i][0]); digitalWrite(IN2, phase[i][1]); digitalWrite(IN3, phase[i][2]); digitalWrite(IN4, phase[i][3]); Delay_xms(speed); } // 反时针旋转 for (int i = 3; i >= 0; i--) { digitalWrite(IN1, phase[i][0]); digitalWrite(IN2, phase[i][1]); digitalWrite(IN3, phase[i][2]); digitalWrite(IN4, phase[i][3]); Delay_xms(speed); } } void Delay_xms(int x) { // 自定义延时函数 unsigned int i, j; for (i = x; i > 0; i--) { for (j = 0; j < 114; j++); } } ``` 在这段代码中,我们通过`Delay_xms(speed)`函数来控制步进电机的转速。函数中的`x`参数为延时时间,通过循环等待来实现延时。在示例代码中,我们将输入映射为50~500ms的延时时间,可以根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值