0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-06-11 14:44 次阅读

在做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;
		
}

毫秒延时.png微秒延时.png

微秒延时2.png

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

    关注

    23

    文章

    3246

    浏览量

    114711
  • RCC
    RCC
    +关注

    关注

    0

    文章

    93

    浏览量

    26929
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    13066
收藏 人收藏

    评论

    相关推荐

    基于CW32L083的线控器方案设计

    基于武汉芯源推出的CW32L083设计的空调线控器产品.
    的头像 发表于 06-25 14:23 11.4w次阅读
    基于<b class='flag-5'>CW32L083</b>的线控器方案设计

    CW32L083 RTC初始化设置

    介绍CW32L083的RTC初始化设置
    的头像 发表于 06-24 10:16 1529次阅读
    <b class='flag-5'>CW32L083</b> RTC初始化设置

    基于CW32L083设计的超低功耗温湿度计

    基于CW32L083设计的超低功耗温湿度计,可以用电池供电,实现数年超长工作时间。
    的头像 发表于 06-25 12:08 2.7w次阅读
    基于<b class='flag-5'>CW32L083</b>设计的超低功耗温湿度计

    基于CW32L083的空调遥控器方案设计

    基于武汉芯源半导体推出的CW32L083而设计的的空调遥控器方案
    的头像 发表于 06-21 16:03 1522次阅读
    基于<b class='flag-5'>CW32L083</b>的空调遥控器方案设计

    移植RT-Thread nano到CW32L083

    移植RT-Thread Nano到CW32L083开发板上,并成功运行。
    的头像 发表于 07-03 09:04 2.2w次阅读
    移植RT-Thread nano到<b class='flag-5'>CW32L083</b>

    CW32L083移植驱动st7735 TFT屏

    CW32L083驱动ST7735屏
    的头像 发表于 07-04 19:16 1625次阅读
    <b class='flag-5'>CW32L083</b>移植<b class='flag-5'>驱动</b>st7735 TFT屏

    CW32L083串口中断+定时器实现不定长数据接收

    CW32L083 用串口中断加定时器中断实现串口的不定长数据的接收,特别适用于AT指令的接收。
    的头像 发表于 07-12 09:00 1989次阅读
    <b class='flag-5'>CW32L083</b>串口中断+定时器<b class='flag-5'>实现</b>不定长数据接收

    [技术手册] CW32L083数据手册

    CW32L083数据手册,PSMCU0116.pdf,Rev1.2
    发表于 05-31 16:13

    [技术手册] CW32L083用户手册

    CW32L083用户手册
    发表于 06-02 15:41

    武汉芯源Cortex-M0+ 32位低功耗MCU CW32L083系列产品介绍

    ~ 5.5V。极大程度满足用户各种使用环境。03 CW32L083系列选型指南和购买渠道主流开发设计工具和编程器厂家已实现CW32L083系列的支持。同时还有配套的开发工具,用于CW32
    发表于 08-24 09:12

    CW32L083产品介绍

    CW32L083是一款基于eFlash的单芯片低功耗微控制器,集成了ARM®Cortex®-M0+ 核心,主频高达64MHz,高速嵌入式存储器(高达256K字节的FLASH和 高达24K字节
    发表于 09-14 06:41

    CW32L083 StartKit软件包分享

    CW32L083 StartKit软件包
    发表于 09-15 07:00

    CW32L083段码屏驱动

    CW32L083开发板上有8个段码LCD显示,使其显示为0-9数字。
    的头像 发表于 06-18 09:13 18.1w次阅读
    <b class='flag-5'>CW32L083</b>段码屏<b class='flag-5'>驱动</b>

    CW32L083实现SHT30驱动

    CW32L083驱动SHT30,并显示到LCD屏上。
    的头像 发表于 06-22 09:57 3069次阅读
    <b class='flag-5'>CW32L083</b><b class='flag-5'>实现</b>SHT30<b class='flag-5'>驱动</b>

    CW32L083如何实现AUTOTRIM时钟校准?

    CW32L083如何实现AUTOTRIM时钟校准?
    的头像 发表于 11-07 17:17 634次阅读
    <b class='flag-5'>CW32L083</b>如何<b class='flag-5'>实现</b>AUTOTRIM时钟校准?