在做18B20時需要用到精準的微秒定時器。
- 時鐘初始化,這里采用CW的例程,驅(qū)動HSI主頻為64M
void RCC_Configuration(void)
{
/* 0. HSI使能并校準 */
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 默認輸出頻率8MHz
///< 當(dāng)使用的時鐘源HCLK大于24M,小于等于48MHz:設(shè)置FLASH 讀等待周期為2 cycle
///< 當(dāng)使用的時鐘源HCLK大于48M,小于等于72MHz:設(shè)置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中增加三個函數(shù):
初始化ms、us的裝載初值,以實現(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ù),實現(xiàn)的思路是用微少的時裝載初值*延時需要的時間,加載到計數(shù)器中(SysTick->Load),然后開始計時,查詢到計數(shù)器已經(jīng)在計時,且溢出標志位為1時中止計時,以實現(xiàn)微秒延時,代碼如下:
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、毫秒延時函數(shù)的實現(xiàn),由于毫秒的計數(shù)初值比較大,所以不能象微秒一樣直接把相乘的計數(shù)值裝載進LOAD寄存器中,需要以1毫秒為單位,在中斷中每一毫秒相加進行計數(shù),當(dāng)計數(shù)值達到所需要的計數(shù)的值時,中止計時,來實現(xiàn)精準的延時。
代碼如下:
void delayTick_ms(uint32_t nms)
{
SysTick- >CTRL=0;
uwTick = 0;
SysTick_Config(fac_ms);
while(uwTick< nms);
SysTick- >CTRL=0;
uwTick = 0;
}
-
定時器
+關(guān)注
關(guān)注
23文章
3256瀏覽量
115450 -
RCC
+關(guān)注
關(guān)注
0文章
93瀏覽量
27101 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13172
發(fā)布評論請先 登錄
相關(guān)推薦
CW32L083串口中斷+定時器實現(xiàn)不定長數(shù)據(jù)接收
![<b class='flag-5'>CW32L083</b>串口中斷+定時器<b class='flag-5'>實現(xiàn)</b>不定長數(shù)據(jù)接收](https://file1.elecfans.com/web2/M00/8C/84/wKgZomStaWCAexo7ABsa6AuK_mk250.png)
評論