STM32F4 systick

systick延时不对可能为晶振设置问题:如下

解决问题的方法步骤:

第一:查看自己板子上面的晶振是8M还是25M的

第二:查看stm32f4xx.h

//如果你板子上的晶振是8M的话,改为

#if !defined  (HSE_VALUE) 
  #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

或者:

在main.h里面加如下:
/*8M*/
#if defined  (HSE_VALUE) //冲定义HSE_VALUE
#undef HSE_VALUE
#define HSE_VALUE    ((uint32_t)8000000) 
#endif /* HSE_VALUE */

第三,system_stm32f4xx.c文件

/************************* PLL Parameters *************************************/
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M      8
#define PLL_N      288

/* SYSCLK = PLL_VCO / PLL_P */
#define PLL_P      2

/* USB OTG FS, SDIO and RNG Clock =  PLL_VCO / PLLQ */
#define PLL_Q      6

/******************************************************************************/

这样配置之后,时钟HCLK、变成168M

下面是STM32F407的时钟框图



由于systick->VAL 是 24位的 ,所以在HCLK = 168M的时候 ,如果systick设置使用时钟为128M/8(systick->CTRL设置) ,最多能延时 (1/21M)*0xffffff 秒

可编写如下函数

void delay_ms(__IO uint32_t nTime)

u32 i ,temp;  
u32 load_time = (nTime*21000) >> 24;
SysTick->LOAD=(nTime*21000)&0xffffff - 1;    
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->LOAD = 0xffffff ;
for(i = 0 ; i <load_time ; i++)
{
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));
SysTick->CTRL  =
                   SysTick_CTRL_ENABLE_Msk;
}  
SysTick->CTRL=0x00;      
SysTick->VAL =0X00;      
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值