STM32CubeMX 下载和安装 详细教程
【HAL库】STM32CubeMX开发----STM32F103/F207/F407----目录
前言
HAL库有自带的 ms级 延时函数: HAL_Delay();
缺点1:
无法实现 us级延时
缺点2:
此延时函数是由SysTick滴答定时器中断产生的,滴答定时器的中断优先级是所有中断中最低的,无法在其他中断中产生延时。
一、 STM32F407----delay延时实验
本次实验以 STM32F407VET6 芯片为MCU,使用 25MHz 外部时钟源。
系统时钟 SYSCLK = 168MHz,使用 __NOP();
空指令实现延时。
User_delay.c
#include "User_delay.h"
void delay_us(uint16_t us)
{
uint32_t Tdata = us*SYSCLK_MHZ/5;
for(uint32_t i=0;i<Tdata;i++)
{
__NOP();
}
}
void delay_ms(uint16_t ms)
{
while( ms-- != 0)
{
delay_us(1000);
}
}
void delay_s(uint16_t s)
{
while( s-- != 0)
{
delay_ms(1000);
}
}
User_delay.h
#ifndef __User_delay_H__
#define __User_delay_H__
#include "main.h"
#define SYSCLK_MHZ (SystemCoreClock/1000000) //系统时钟频率
void delay_us(uint16_t us);
void delay_ms(uint16_t ms);
void delay_s(uint16_t s);
#endif
实验测试
具体测试内容:让PB6引脚,每隔10us,实现高低电平切换。
具体代码如下:
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
delay_us(10);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
delay_us(10);
通过逻辑分析仪,采集的结果如下:
亲测可用,只适用于 STM32F407 相关的芯片。
其他的芯片,需要修改参数校准时间。