在做18B20时需要用到精准的微秒定时器。
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);
}
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;
}
全部0条评论
快来发表一下你的评论吧 !