在做18B20时需要用到精准的微秒定时器。
- 时钟初始化,这里采用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);
}
- 在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;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
定时器
+关注
关注
23文章
3246浏览量
114711 -
RCC
+关注
关注
0文章
93浏览量
26929 -
Systick
+关注
关注
0文章
62浏览量
13066
发布评论请先 登录
相关推荐
武汉芯源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
评论