STM32
直播中

刘凤英

7年用户 158经验值
私信 关注
[问答]

请问3.5库的时钟初始化与SYSTICK实现延时出现的问题该怎么解决?

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);

  }
}

回帖(6)

魏荣梅

2019-7-16 08:47:03
还没用过库,以前操作寄存器的时候,因为一点点操作失误,导致延时是本意的9倍
举报

陶珪扁

2019-7-16 09:05:38
我刚开始学。。一开始也不想用库。。。想先自己造作寄存器。。。觉的这样学得踏实。。。可是。。。刚开始。。。始终初始化就给我难住了。。有个RCCdeinit。。就在造=操作RCC寄存器是要复位默认值那个函数。。。我不知道该怎么写,看了原子哥的程序。。我也不知道为什么要那么写。。查了好久。。也没头绪。。。后来决定。。用库了,用库。。又发现个问题,2.0+的3.0+的。。不一样。。纠结了好久,决定用3.5.。。刚写完点亮LED的程序,本来挺高兴的。打算继续。。可这延时给我郁闷找了。。。哎....谁来帮帮我啊!  T_T
举报

卓侨汉

2019-7-16 09:20:52
默认时钟为8M,如果不PLL,那就只有8M的频率,你的delay_init应该为delay_init(8);才对
举报

李晓欢

2019-7-16 09:40:50
指的是默认外部8M,然后库中给设置为倍频到72M的。。。我也试了你说的。。改成init(8)。。但也不是一秒。。。说明不是8M...麻烦您再帮我想想。。谢谢了。。是不是AHB设置的问题啊。。。新手。。看库有点吃力。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分