
M / 1000 = ms、M / 1000 / 1000 = us1 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
}
}