3.5库的时钟初始化与SYStiCK实现延时的问题
新手求助。。。
使用3.5的库,根据描述。。库中默认为外部8mhz。我也就没设置。。然后进行systick初始化。。和延时函数定义。。但下到板子里。。定时不准。。已开始以为是延时函数的问题,后来把systick的初始化包括延时函数都放到原子哥历程中延时准确。。说明延时这块没问题。。
是不是默认的时钟初始化有问题啊?谁能帮我说说。。库中默认的始终初始化直接用有什么问题吗?请高手帮我讲讲。。时钟的初始化。。都纠结我好多天了。。。
这我的程序,写的应该是延时一秒的,可实际却3秒左右。。。。大家帮忙看看。。到底咋回事啊。。。。。
#include "
STM32f10x.h"
// 声明结构体
GPIO_InitTypeDef GPIO_InitStructure; //此句话定义了一个名字叫GPIO_InitStructure的结构体
/*void SysTick_Configuration(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//设置时钟源为HCLK
} */
//2.0库设置方法。。。
//void us_delay(u32 n)
//{
// u32 flag;
// SysTick_SetReload(72000*n);
// SysTick_CounterCmd(SysTick_Counter_Clear);
// SysTick_CounterCmd(SysTick_Counter_Enable);
// do
// {
// flag=SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
// }while(flag!=1);
// SysTick_CounterCmd(SysTick_Counter_Disable);
// }
u8 us;
u16 ms;
void delay_init()
{
SysTick->CTRL&=0xfffffffb;
us=9;
ms=(u16)us*1000;
}
void delay_us(u32 n)
{
u32 temp;
SysTick->LOAD=n*us;
SysTick->VAL=0x00;
SysTick->CTRL=0x01;
// do
// {temp=(SysTick->CTRL)>>16;
// }while(temp!=1);
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;
SysTick->VAL=0x00;
}
void delay_ms(u16 n)
{
u32 temp;
SysTick->LOAD=(u32)n*ms;
SysTick->VAL=0x00;
SysTick->CTRL=0x01;
// do
// {temp=(SysTick->CTRL)>>16;
// }while(temp!=1);
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL=0x00;
SysTick->VAL=0x00;
}
void GPIO_Configuration(void)
{
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ; //第二个引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
int main(void)
{
//使能线上时钟,
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能IO口A和D
GPIO_Configuration ();//GPIO初始化
delay_init(72);
while (1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //D2口置位即输出高电平
delay_ms(1000);
GPIO_SetBits (GPIOD,GPIO_Pin_2);
delay_ms(1000);
}
}