STM32F407 systick延迟

M / 1000 = msM / 1000 / 1000 = us

1 s = 1000 ms = 1000000 μs

168MHz 是 STM32 内核时钟的频率

Hz(赫兹) = 「次 / 秒」(每秒完成的周期数)

MHz(兆赫兹) = 10^6 Hz(1 兆 = 100 万)

所以 168MHz = 168 × 1000000 次 / 秒 = 168000000 次 / 秒

SystemCoreClock:STM32F4 的核心时钟(默认 / 常用为 168MHz,即 168,000,000 Hz)

168,000,000/1000/1000=168次/us,1us有168次,要多少us乘多少

Systick延迟拆分了,是因为32的systick 是24位 如果不分开100ms就超出了范围

cpp 复制代码
#include "stm32f4xx.h"

// LED1: PE9
// LED2: PB1
// LED3: PB0

#define LED1_PORT   GPIOE
#define LED1_PIN    GPIO_Pin_9
#define LED2_PORT   GPIOB
#define LED2_PIN    GPIO_Pin_1
#define LED3_PORT   GPIOB
#define LED3_PIN    GPIO_Pin_0

static void cpu_delay(uint32_t us)
{
	//上面处理ms
	while(us>1000)
	{
			//每次循环等待1ms
			SysTick->LOAD=SystemCoreClock/1000;
			SysTick->VAL=0; //当前计数器清0
			SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
			while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);//等待延迟结束
			SysTick->CTRL = ~SysTick_CTRL_ENABLE_Msk;//关闭
			us-=1000;
	}
	//下面处理us
	if(us>0)
	{
			SysTick->LOAD=(SystemCoreClock/1000/1000)*us-1;//自动转载值 系统主频
			SysTick->VAL=0; //当前计数器清0
			SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
			while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0);//等待延迟结束
			SysTick->CTRL = ~SysTick_CTRL_ENABLE_Msk;//关闭
	}

}

int main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    
    GPIO_InitStructure.GPIO_Pin = LED1_PIN;
    GPIO_Init(LED1_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = LED2_PIN;
    GPIO_Init(LED2_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = LED3_PIN;
    GPIO_Init(LED3_PORT, &GPIO_InitStructure);

    while (1)
    {
        GPIO_SetBits(LED1_PORT, LED1_PIN);
        GPIO_SetBits(LED2_PORT, LED2_PIN);
        GPIO_SetBits(LED3_PORT, LED3_PIN);
        cpu_delay(1000*1000); //us*1000=1ms 1ms*1000=1s  所以us*1000*1000=1s
        GPIO_ResetBits(LED1_PORT, LED1_PIN);
        GPIO_ResetBits(LED2_PORT, LED2_PIN);
        GPIO_ResetBits(LED3_PORT, LED3_PIN);
        cpu_delay(1000*1000); //us*1000=1ms 1ms*1000=1s  所以us*1000*1000=1s
    }
}
相关推荐
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11013 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元3 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133973 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315203 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书3 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang3 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟3 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126913 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315203 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机