0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CW32L083實(shí)現(xiàn)SysTick精準(zhǔn)微秒延時(shí)驅(qū)動(dòng)

華仔的編程隨筆 ? 來源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-06-11 14:44 ? 次閱讀

在做18B20時(shí)需要用到精準(zhǔn)的微秒定時(shí)器。

  1. 時(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);

}
  1. 在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í).png微秒延時(shí).png

微秒延時(shí)2.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3248

    瀏覽量

    114790
  • RCC
    RCC
    +關(guān)注

    關(guān)注

    0

    文章

    93

    瀏覽量

    26937
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    13087
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于CW32L083的線控器方案設(shè)計(jì)

    基于武漢芯源推出的CW32L083設(shè)計(jì)的空調(diào)線控器產(chǎn)品.
    的頭像 發(fā)表于 06-25 14:23 ?14.4w次閱讀
    基于<b class='flag-5'>CW32L083</b>的線控器方案設(shè)計(jì)

    CW32L083 RTC初始化設(shè)置

    介紹CW32L083的RTC初始化設(shè)置
    的頭像 發(fā)表于 06-24 10:16 ?1546次閱讀
    <b class='flag-5'>CW32L083</b> RTC初始化設(shè)置

    基于CW32L083設(shè)計(jì)的超低功耗溫濕度計(jì)

    基于CW32L083設(shè)計(jì)的超低功耗溫濕度計(jì),可以用電池供電,實(shí)現(xiàn)數(shù)年超長(zhǎng)工作時(shí)間。
    的頭像 發(fā)表于 06-25 12:08 ?2.7w次閱讀
    基于<b class='flag-5'>CW32L083</b>設(shè)計(jì)的超低功耗溫濕度計(jì)

    基于CW32L083的空調(diào)遙控器方案設(shè)計(jì)

    基于武漢芯源半導(dǎo)體推出的CW32L083而設(shè)計(jì)的的空調(diào)遙控器方案
    的頭像 發(fā)表于 06-21 16:03 ?1529次閱讀
    基于<b class='flag-5'>CW32L083</b>的空調(diào)遙控器方案設(shè)計(jì)

    移植RT-Thread nano到CW32L083

    移植RT-Thread Nano到CW32L083開發(fā)板上,并成功運(yùn)行。
    的頭像 發(fā)表于 07-03 09:04 ?2.2w次閱讀
    移植RT-Thread nano到<b class='flag-5'>CW32L083</b>

    CW32L083移植驅(qū)動(dòng)st7735 TFT屏

    CW32L083驅(qū)動(dòng)ST7735屏
    的頭像 發(fā)表于 07-04 19:16 ?1656次閱讀
    <b class='flag-5'>CW32L083</b>移植<b class='flag-5'>驅(qū)動(dòng)</b>st7735 TFT屏

    CW32L083串口中斷+定時(shí)器實(shí)現(xiàn)不定長(zhǎng)數(shù)據(jù)接收

    CW32L083 用串口中斷加定時(shí)器中斷實(shí)現(xiàn)串口的不定長(zhǎng)數(shù)據(jù)的接收,特別適用于AT指令的接收。
    的頭像 發(fā)表于 07-12 09:00 ?2017次閱讀
    <b class='flag-5'>CW32L083</b>串口中斷+定時(shí)器<b class='flag-5'>實(shí)現(xiàn)</b>不定長(zhǎng)數(shù)據(jù)接收

    [技術(shù)手冊(cè)] CW32L083數(shù)據(jù)手冊(cè)

    CW32L083數(shù)據(jù)手冊(cè),PSMCU0116.pdf,Rev1.2
    發(fā)表于 05-31 16:13

    [技術(shù)手冊(cè)] CW32L083用戶手冊(cè)

    CW32L083用戶手冊(cè)
    發(fā)表于 06-02 15:41

    武漢芯源Cortex-M0+ 32位低功耗MCU CW32L083系列產(chǎn)品介紹

    ~ 5.5V。極大程度滿足用戶各種使用環(huán)境。03 CW32L083系列選型指南和購(gòu)買渠道主流開發(fā)設(shè)計(jì)工具和編程器廠家已實(shí)現(xiàn)對(duì) CW32L083系列的支持。同時(shí)還有配套的開發(fā)工具,用于CW32
    發(fā)表于 08-24 09:12

    CW32L083產(chǎn)品介紹

    CW32L083是一款基于eFlash的單芯片低功耗微控制器,集成了ARM?Cortex?-M0+ 核心,主頻高達(dá)64MHz,高速嵌入式存儲(chǔ)器(高達(dá)256K字節(jié)的FLASH和 高達(dá)24K字節(jié)
    發(fā)表于 09-14 06:41

    CW32L083 StartKit軟件包分享

    CW32L083 StartKit軟件包
    發(fā)表于 09-15 07:00

    CW32L083段碼屏驅(qū)動(dòng)

    CW32L083開發(fā)板上有8個(gè)段碼LCD顯示,使其顯示為0-9數(shù)字。
    的頭像 發(fā)表于 06-18 09:13 ?18.1w次閱讀
    <b class='flag-5'>CW32L083</b>段碼屏<b class='flag-5'>驅(qū)動(dòng)</b>

    CW32L083實(shí)現(xiàn)SHT30驅(qū)動(dòng)

    CW32L083驅(qū)動(dòng)SHT30,并顯示到LCD屏上。
    的頭像 發(fā)表于 06-22 09:57 ?3097次閱讀
    <b class='flag-5'>CW32L083</b><b class='flag-5'>實(shí)現(xiàn)</b>SHT30<b class='flag-5'>驅(qū)動(dòng)</b>

    CW32L083如何實(shí)現(xiàn)AUTOTRIM時(shí)鐘校準(zhǔn)?

    CW32L083如何實(shí)現(xiàn)AUTOTRIM時(shí)鐘校準(zhǔn)?
    的頭像 發(fā)表于 11-07 17:17 ?641次閱讀
    <b class='flag-5'>CW32L083</b>如何<b class='flag-5'>實(shí)現(xiàn)</b>AUTOTRIM時(shí)鐘校準(zhǔn)?