时钟树
寄存器
SysTick->LOAD
: 计时器装载值
SysTick->VAL
: 当前值
SysTick->CTRL
: 控制寄存器
延时初始化函数
- 计算AHB时钟
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//AHB的8分频选择作为systick
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
//在system_stm32f10x.c中定义SystemCoreClock为72MHz
//所以fac_us = 9
}
微秒延时函数
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us;
//装载值(以500us为例子),将会装在500*9=4500
SysTick->VAL=0x00;
//清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;
//开启定时器
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
//关闭计时器
SysTick->VAL =0X00;
//清空计数器
}
宏定义
在system_stm32f10x.c
中:
#define SYSCLK_FREQ_72MHz 72000000
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< SYSCLK(Core Clock) */
可以看出
S
Y
S
C
L
K
=
72
M
H
z
SYSCLK=72MHz
SYSCLK=72MHz
在延时初始化函数中有
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
//AHB的8分频选择作为systick
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
//在system_stm32f10x.c中定义SystemCoreClock为72MHz
//所以fac_us = 9
}
设置
S
Y
S
T
I
C
K
=
A
H
B
8
SYSTICK=\frac{AHB}{8}
SYSTICK=8AHB那AHB是多少呢,继续看SystemInit
函数
void SystemInit (void)
{ //代码经过改动,删除了条件编译的部分
//重置RCC时钟配置到缺省配置
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
RCC->CFGR &= (uint32_t)0xF8FF0000;
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
RCC->CIR = 0x009F0000;
/* Configure the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers */
/* Configure the Flash Latency cycles and enable prefetch buffer */
SetSysClock();
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
}