久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3007|回復(fù): 0
收起左側(cè)

利用stm32systic定時(shí)器用作時(shí)鐘基線實(shí)現(xiàn)多個(gè)定時(shí)器定時(shí)

[復(fù)制鏈接]
ID:362131 發(fā)表于 2020-5-8 21:44 | 顯示全部樓層 |閱讀模式
systick時(shí)鐘基線運(yùn)用,充分利用cpu性能,拒絕延時(shí)等浪費(fèi)cpu時(shí)間行為

systick.c中的程序:
/*****************************************************************************************************/

SOFT_TMR g_Tmr[COUNT_TIM];

/* cpu運(yùn)行時(shí)間,單位ms */
__IO uint32_t g_iRunTime = 0;

static void Soft_TimerDec(SOFT_TMR *_tmr);

/*
*********************************************************************************************************
*    函 數(shù) 名:Systick_Init
*    功能說明:初始化Systick定時(shí)器
*    形    參:無
*    返 回 值:無
*********************************************************************************************************
*/
void Systick_Init(void)
{   
    /* 清零所有的軟件定時(shí)器 */
    memset(g_Tmr,0,COUNT_TIM * sizeof(g_Tmr));

    /*
        配置systic中斷周期,并啟動systick中斷。
        這個(gè)函數(shù)在 \Libraries\CMSIS\CM3\CoreSupport\core_cm3.h
        
        Systick中斷向量在(\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\
            startup_stm32f10x_hd.s 文件中定義為 SysTick_Handler。
        SysTick_Handler函數(shù)的實(shí)現(xiàn)在stm32f10x_it.c 文件。
        SysTick_Handler函數(shù)調(diào)用了SysTick_ISR()函數(shù),在本文件末尾。
    */   
    SysTick_Config(SystemCoreClock / 1000 * Systick_tim);
}

/*
*********************************************************************************************************
*    函 數(shù) 名: SysTick_ISR
*    功能說明:SysTick中斷服務(wù)程序,在SysTick_Handler中調(diào)用
*    形    參:無
*    返 回 值: 無
*********************************************************************************************************
*/
void SysTick_ISR(void)
{
    static uint8_t s_count = 0;
    uint8_t i;

    for (i = 0; i < COUNT_TIM; i++)
    {
        Soft_TimerDec(&g_Tmr[ i]);
    }

    g_iRunTime += Systick_tim;        /* cpu運(yùn)行時(shí)間增Systick_tim*/
    if (g_iRunTime >= 0x9A7EC800)    /* 30天清零 */
    {
        g_iRunTime = 0;
    }
        
    s_count += Systick_tim;
    if (s_count >= 10)
    {
        s_count = 0;

        /*
            此處可加入按鍵的檢測。按鍵檢測每隔10ms一次就行了,一般做40ms的濾波處理就可以
            有效過濾掉機(jī)械動作造成的按鍵抖動。
        */
//        Key_Scan();
    }
}
/*
*********************************************************************************************************
*    函 數(shù) 名: delay_ms
*    功能說明: ms級延遲,延遲精度為正負(fù)1ms
*    形    參:n : 延遲長度,單位 ms。
*    返 回 值: 無
*********************************************************************************************************
*/
void Delay_Ms(int32_t n)
{
//    /* 避免 n = 1 出現(xiàn)主程序死鎖 */
//    if (n <= 1)
//    {
//        n = 2;
//    }
   
    __set_PRIMASK(1);          /* 關(guān)中斷 */
    g_Tmr[DELAY_TIM].count = n;
    g_Tmr[DELAY_TIM].flag = 0 ;
    __set_PRIMASK(0);          /* 開中斷 */

    while (1)
    {
        CPU_IDLE();    /* 此處是空操作。用戶可以定義,讓CPU進(jìn)入IDLE狀態(tài),以降低功耗;或?qū)崿F(xiàn)喂狗 */

        /* 等待延遲時(shí)間到 */
        if (g_Tmr[DELAY_TIM].flag == 1)
        {
            return;
        }
    }
}

systick.h中的代碼
/*********************************************************************************************/
#define SYSTICK_MODE    0    //0中斷模式,1查詢模式

/* 軟件延時(shí) */
void SoftDelay_Ms(uint16_t nms);
void SoftDelay_Us(uint16_t nus);

/**********************************************中斷模式**********************************************/
#if SYSTICK_MODE == 0   

/* 目前是空操作,用戶可以定義讓CPU進(jìn)入IDLE狀態(tài)的函數(shù)和喂狗函數(shù) */
#define CPU_IDLE()

#define Systick_tim        1        //Systic中斷時(shí)間(時(shí)鐘基線),單位:ms

/*
    可在此處枚舉中增加若干個(gè)軟件定時(shí)器
    注意:變量在中斷和主程序中同時(shí)被訪問,有可能造成編譯器錯(cuò)誤優(yōu)化,必須增加__IO 即 volatile。
*/
enum enum_tim_id{
    DELAY_TIM = 0,    //第1個(gè)保留給Delay_Ms()使用
    USER_TIM1,
    USER_TIM2,
    USER_TIM3,
    COUNT_TIM        //軟件定時(shí)器的個(gè)數(shù)
};

/* 定時(shí)器結(jié)構(gòu)體 */
typedef struct
{
    volatile int32_t count;    //計(jì)數(shù)器
    volatile uint8_t flag;    //定時(shí)到達(dá)標(biāo)志
}SOFT_TMR;


/* 供外部調(diào)用的函數(shù)聲明 */
void Systick_Init(void);
void SysTick_ISR(void);


更多請下載源碼
systick時(shí)鐘基線運(yùn)用.7z (453.11 KB, 下載次數(shù): 13)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久久精品视频免费看 | 久久首页 | 久久精品久久久久久 | 欧美极品少妇xxxxⅹ免费视频 | 日韩免费一区 | 国产成人久久av免费高清密臂 | 国产精品一区二区不卡 | 午夜精品久久久久久久久久久久久 | 99亚洲精品 | 日韩精品久久久 | 久久亚洲春色中文字幕久久久 | jdav视频在线观看免费 | www.97zyz.com| 国产精品一区二区在线 | 九九热精 | 国产成人福利视频 | 久久av.com| 中文天堂在线观看 | www.黄色片视频 | 国产精品一区二区免费 | 亚洲美女视频 | 亚洲一区二区三区高清 | 国产一区二区三区四区五区加勒比 | av大全在线 | 亚洲一区二区久久 | 日韩精品一区中文字幕 | 99亚洲精品| 91精品国产高清久久久久久久久 | 日本理论片好看理论片 | 欧美黄色大片在线观看 | 欧美午夜一区二区三区免费大片 | 亚洲精品一区二区三区四区高清 | av中文字幕在线播放 | 亚洲欧洲精品在线 | 精品欧美一区免费观看α√ | 国产精品久久久久永久免费观看 | 精品综合久久 | 欧美成人精品一区二区男人看 | 成人免费福利 | 二区av| 欧美bondage紧缚视频 |