在做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文章
3254瀏覽量
115143 -
RCC
+關注
關注
0文章
93瀏覽量
26987 -
Systick
+關注
關注
0文章
62瀏覽量
13126
發布評論請先 登錄
相關推薦
武漢芯源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
評論