(8)Proteus 8.9上的STM32仿真系列(HAL/CubeMaxIDE)---delay实现

(8)Proteus 8.9上的STM32仿真系列(HAL/CubeMaxIDE)—delay实现

**实验设计:**实现微秒,毫秒延时,每500ms翻转PB0,PB1电平。由于HAL_Delay()只能实现ms延时,支持微秒延时需要修改systick配置文件,有可能会影响其他进程的正常运行。这里仅用delay.c/delay.h文件就可以实现延时,完全独立,不需要其他文件支持。
一、Proteus原理图(芯片stm32f103r6tx)
在这里插入图片描述
二、CubemaxIDE配置
1.时钟和第一节相同,直接HCLK 8Mhz。
2.设置PB0,PB1输出即可,其他保持默认。
在这里插入图片描述
3.delay.c和delay.h,将delay.c复制至core/src,delay.h复制至core/inc,如果复制到其他地方需要自己做好include设置。
delay.h源码

 /*
  ******************************************************************************
  * @file           : delay.h
  * @brief          : delay head file
  * @author			: Ceres_Li
  ******************************************************************************
  * @attention
  *1.在使用文件中包含delay.h文件
  *2.在main.c中初始化delay_init(HCLK频率),如为72Mhz,则参数为72
  ******************************************************************************
  */

#ifndef	_DELAY_H_
#define	_DELAY_H_

#include "stm32f1xx_hal.h"	//移植stm32f1xx.h
//#include "stm32f4xx_hal.h"	//移植m4时注释掉m1的

void delay_init(uint8_t Sysclk);	//假如systick为72Mhz,Sysclk就为72
void delay_ms(uint16_t _ms);		//毫秒延时
void delay_us(uint32_t _us);		//微秒延时

#endif

delay.c源码

 /*
  ******************************************************************************
  * @file           : delay.c
  * @brief          : delay c file
  * @author			: Ceres_Li
  ******************************************************************************
  * @attention
  *1.在使用文件中包含delay.h文件
  *2.在main.c中初始化delay_init(HCLK频率),如为72Mhz,则参数为72
  ******************************************************************************
  */
#include "delay.h"

static uint32_t fac_us=0;

void delay_init(uint8_t SYSCLK)
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);	//SYSTICK时钟源设置为HCLK
	fac_us=SYSCLK;						//假如fac_us为72,hclk为72mhz,hclk经过72个周期即为1us
}

//延迟_us微秒
void delay_us(uint32_t _us)
{
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;
	ticks=_us*fac_us;	//延时_us个微秒需要的周期
	told=SysTick->VAL;
	//判断经过的周期数是否大于ticks,大于了就跳出循环
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)
		{
			if(tnow<told)	tcnt+=told-tnow;
			else			tcnt+=reload-tnow+told;
			told=tnow;
			if(tcnt>=ticks)break;
		}
	}
}

//延迟_ms微秒
void delay_ms(uint16_t _ms)
{
	uint32_t i;
	for(i=0;i<_ms;i++)	delay_us(1000);	//延迟_ms个1000us
}

4.将两个文件复制至对应文件夹后,项目文件右键点击reflesh,即可看到这两个文件出现。
在这里插入图片描述
5.在main.c中添加如下代码
(1)包含delay.h文件

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "delay.h"
/* USER CODE END Includes */

(2)在main.c中初始化delay,再初始化PB0,PB1电平。

  /* USER CODE BEGIN 2 */
  delay_init(8);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1,GPIO_PIN_SET);
  /* USER CODE END 2 */

(3)while(1)中添加

  while (1)
  {
	  HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1);
	  delay_ms(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

6.buildall
三、实验结果
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值