2.SYSTICK及系统时钟移植

  • 系统时钟移植

   由于STM32F429使用的时钟主频为180MHZ,而小华的主频为240MHZ,所以需要进行修改

  1. 在工程中加入库文件ev_hc32f4a0_lqfp176.c,hc32_ll_clk.c,并包含头文件
  2. 删除自己不需要的函数,仅保留__WEAKDEF void BSP_CLK_Init(void)函数
  3. 修改时钟配置参数,由于我使用的是25M晶振,先修改XTAL_VALUE的参数为 25000000UL,然后配置如下

    /* VCO = (25/1)*48 = 1200MHz*/

stcPLLHInit.u8PLLState = CLK_PLL_ON;
stcPLLHInit.PLLCFGR = 0UL;
stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLN = 48UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLP = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLQ = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLR = 5UL - 1UL;
stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
(void)CLK_PLLInit(&stcPLLHInit);

 

  • SYSTICK移植

   在官方例程中,发现官方用的是软件延时,根本没有用上SYSTICK定时器,所以这里需要移植一下STM32的延时函数

  1. 新增delay.c和delay.h文件
  2. 新增DELAY_Init函数

 

void DELAY_Init(void)
{
    SysTick->LOAD = (uint32_t)(SystemCoreClock/1000); /* set reload register 1KHz */
    NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
    SysTick->VAL = 0UL; /* Load the SysTick Counter Value */

    SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
    SysTick_CTRL_TICKINT_Msk |
    SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
}

 

    2.新增两个延时函数

//us延时
void delay_us(uint32_t u32Cnt)
{
    uint32_t ticks;
    uint32_t told,tnow,tcnt=0;
    uint32_t reload=SysTick->LOAD; 
       
    ticks=u32Cnt*(SystemCoreClock/1000000);
    told=SysTick->VAL;
    while(1)
    {
        tnow=SysTick->VAL;
        if(tnow!=told)
        {
            if(tnow<told)tcnt+=told-tnow;
            else tcnt+=reload-tnow+told;
            told=tnow;
            if(tcnt>=ticks)break;
        }
    }
}

 //ms延时
void delay_ms(uint32_t u32Cnt)
{

    u32 i;
    for(i=0;i<nms;i++) delay_us(1000);

}

 

  4.在main.c中初始化DELAY_Init(),即可使用以上两个延时函数

 

posted @ 2022-11-10 13:57  小木头丶  阅读(221)  评论(0)    收藏  举报