在做18B20時(shí)需要用到精準(zhǔn)的微秒定時(shí)器。
- 時(shí)鐘初始化,這里采用CW的例程,驅(qū)動(dòng)HSI主頻為64M
void RCC_Configuration(void)
{
/* 0. HSI使能并校準(zhǔn) */
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
/* 1. 設(shè)置HCLK和PCLK的分頻系數(shù)*/
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 默認(rèn)輸出頻率8MHz
///< 當(dāng)使用的時(shí)鐘源HCLK大于24M,小于等于48MHz:設(shè)置FLASH 讀等待周期為2 cycle
///< 當(dāng)使用的時(shí)鐘源HCLK大于48M,小于等于72MHz:設(shè)置FLASH 讀等待周期為3 cycle
__RCC_FLASH_CLK_ENABLE();
FLASH_SetLatency(FLASH_Latency_3);
/* 3. 時(shí)鐘切換到PLL */
RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
RCC_SystemCoreClockUpdate(64000000);
}
- 在cw32l083_systick.c中增加三個(gè)函數(shù):
初始化ms、us的裝載初值,以實(shí)現(xiàn)毫秒、微秒的裝裝:
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、微秒延時(shí)函數(shù),實(shí)現(xiàn)的思路是用微少的時(shí)裝載初值*延時(shí)需要的時(shí)間,加載到計(jì)數(shù)器中(SysTick->Load),然后開始計(jì)時(shí),查詢到計(jì)數(shù)器已經(jīng)在計(jì)時(shí),且溢出標(biāo)志位為1時(shí)中止計(jì)時(shí),以實(shí)現(xiàn)微秒延時(shí),代碼如下:
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; //使能時(shí)鐘、開始計(jì)時(shí)
do {
temp = SysTick- >CTRL; //讀寄存器,判斷是否溢出位
}while(!(temp&(SysTick_CTRL_COUNTFLAG_Msk)) && (temp & 0x01));
SysTick- >CTRL=0; //停止計(jì)時(shí)
}
4、毫秒延時(shí)函數(shù)的實(shí)現(xiàn),由于毫秒的計(jì)數(shù)初值比較大,所以不能象微秒一樣直接把相乘的計(jì)數(shù)值裝載進(jìn)LOAD寄存器中,需要以1毫秒為單位,在中斷中每一毫秒相加進(jìn)行計(jì)數(shù),當(dāng)計(jì)數(shù)值達(dá)到所需要的計(jì)數(shù)的值時(shí),中止計(jì)時(shí),來實(shí)現(xiàn)精準(zhǔn)的延時(shí)。
代碼如下:
void delayTick_ms(uint32_t nms)
{
SysTick- >CTRL=0;
uwTick = 0;
SysTick_Config(fac_ms);
while(uwTick< nms);
SysTick- >CTRL=0;
uwTick = 0;
}
-
定時(shí)器
+關(guān)注
關(guān)注
23文章
3248瀏覽量
114790 -
RCC
+關(guān)注
關(guān)注
0文章
93瀏覽量
26937 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13087
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論