(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
三、实验结果