CW32L083实现SysTick精准微秒延时驱动

描述

在做18B20时需要用到精准的微秒定时器。

  1. 时钟初始化,这里采用CW的例程,驱动HSI主频为64M
void RCC_Configuration(void)
{
    /* 0. HSI使能并校准 */
    RCC_HSI_Enable(RCC_HSIOSC_DIV6);

    /* 1. 设置HCLK和PCLK的分频系数 */
    RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
    RCC_PCLKPRS_Config(RCC_PCLK_DIV1);

    /* 2. 使能PLL,通过HSI倍频到64MHz */
    RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, RCC_PLL_MUL_8); // HSI 默认输出频率8MHz

    ///< 当使用的时钟源HCLK大于24M,小于等于48MHz:设置FLASH 读等待周期为2 cycle
    ///< 当使用的时钟源HCLK大于48M,小于等于72MHz:设置FLASH 读等待周期为3 cycle
    __RCC_FLASH_CLK_ENABLE();
    FLASH_SetLatency(FLASH_Latency_3);

    /* 3. 时钟切换到PLL */
    RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
    RCC_SystemCoreClockUpdate(64000000);

}
  1. 在cw32l083_systick.c中增加三个函数:
    初始化ms、us的装载初值,以实现毫秒、微秒的装装:
static uint32_t fac_ms ;
static uint32_t fac_us;
#define HclkFreq 64000000
void init_SysTick(void)
{
fac_ms = HclkFreq/1000U;
fac_us = fac_ms/1000U;
}

3、微秒延时函数,实现的思路是用微少的时装载初值*延时需要的时间,加载到计数器中(SysTick->Load),然后开始计时,查询到计数器已经在计时,且溢出标志位为1时中止计时,以实现微秒延时,代码如下:

void delayTick_us(uint32_t nus)
{
		uint32_t temp;
	  SysTick- >CTRL=0;
		SysTick- >LOAD = fac_us*nus - 1;
	  SysTick- >CTRL  = SysTick_CTRL_CLKSOURCE_Msk |SysTick_CTRL_ENABLE_Msk;    //使能时钟、开始计时
		do {
		temp = SysTick- >CTRL; //读寄存器,判断是否溢出位
		}while(!(temp&(SysTick_CTRL_COUNTFLAG_Msk)) && (temp & 0x01));
		SysTick- >CTRL=0; 	//停止计时
	
}

4、毫秒延时函数的实现,由于毫秒的计数初值比较大,所以不能象微秒一样直接把相乘的计数值装载进LOAD寄存器中,需要以1毫秒为单位,在中断中每一毫秒相加进行计数,当计数值达到所需要的计数的值时,中止计时,来实现精准的延时。

代码如下:

void delayTick_ms(uint32_t nms)
{
	  SysTick- >CTRL=0;
	  uwTick = 0;
    SysTick_Config(fac_ms);
		while(uwTick< nms);
		SysTick- >CTRL=0;
		uwTick = 0;
		
}

RCCRCC

RCC

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分