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
    }
}
相关推荐
朝发如雪8 小时前
快速掌握单片机基础(3)(PWM)(通信协议基础)(串口通信时序与参数)(电气特性与电平标准)(51单片机UART寄存器配置)(串口应用层协议)
单片机
天空'之城11 小时前
单片机基础核心知识点汇总(四十)
单片机·嵌入式硬件
smartpi_ai11 小时前
离线语音模块误识别问题全面解决方案:命令词设计、防误触与灵敏度调优指南
人工智能·单片机·语音识别
LCG元11 小时前
STM32F103 驱动 HX711 称重实战:DOUT 就绪时序、增益切换陷阱与两点标定精度实测
stm32·单片机·嵌入式硬件
染予11 小时前
代码中相关C语言知识点总结
stm32
优信电子12 小时前
STM32 驱动 DHT30 测量环境温湿度(兼容SHT30):从时序解析到完整代码实战
stm32·嵌入式·传感器·sht30·温湿度·环境测量·dht30
小李不想当小白13 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
朝发如雪14 小时前
快速掌握单片机基础(6)(数据处理与传送指令)(跳转与分支指令)(栈操作与混合编程)(程序状态寄存器操作指令)(内存映射)
单片机·arm
blue_ice .14 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发
深圳市恒锐丰科技杨生14 小时前
EG4318 / EG4319 / EG4320 铅酸电池三段式充电副边管理芯片|屹晶 EGmicro
嵌入式硬件·硬件工程