STM32F407 systick延迟

M / 1000 = ms、M / 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
    }
}
相关推荐
不会代码的小猴17 分钟前
中断(NVIC)
单片机·嵌入式硬件
糖糖单片机设计1 小时前
基于STM32的空气污染检测与报警系统设计与实现
stm32·单片机·嵌入式硬件
zhangzhangkeji1 小时前
stm32 15-2 flash 闪存:代码部分二
stm32
盛世宏博北京1 小时前
工业环境稳定采集:配电室 IP 温湿度变送器 TCP/UDP 通信部署指南
单片机·tcp/ip·udp
comyccccc1 小时前
自制多路输出DCDC电源板,3.3V-12V可调 学习笔记
单片机·嵌入式硬件·硬件工程
Zwawa1 小时前
把 AO 接回来:黑线和白底之间到底差了多少
c语言·单片机·嵌入式
Yiran_G2 小时前
BLE终端数据积压如何处理?缓存队列、断连补传与流量调度设计
嵌入式硬件·物联网
硅基手札2 小时前
【串口技术系列文档 07】UART控制器寄存器详解
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
甜甜的大香瓜2 小时前
【MT32F006】MT32F006之TM1621C驱动LCD
单片机
硅基手札2 小时前
【串口技术系列文档 09】FIFO管理与流控
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设