|
systick時鐘基線運用,充分利用cpu性能,拒絕延時等浪費cpu時間行為
systick.c中的程序:
/*****************************************************************************************************/
SOFT_TMR g_Tmr[COUNT_TIM];
/* cpu運行時間,單位ms */
__IO uint32_t g_iRunTime = 0;
static void Soft_TimerDec(SOFT_TMR *_tmr);
/*
*********************************************************************************************************
* 函 數 名:Systick_Init
* 功能說明:初始化Systick定時器
* 形 參:無
* 返 回 值:無
*********************************************************************************************************
*/
void Systick_Init(void)
{
/* 清零所有的軟件定時器 */
memset(g_Tmr,0,COUNT_TIM * sizeof(g_Tmr));
/*
配置systic中斷周期,并啟動systick中斷。
這個函數在 \Libraries\CMSIS\CM3\CoreSupport\core_cm3.h
Systick中斷向量在(\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\
startup_stm32f10x_hd.s 文件中定義為 SysTick_Handler。
SysTick_Handler函數的實現在stm32f10x_it.c 文件。
SysTick_Handler函數調用了SysTick_ISR()函數,在本文件末尾。
*/
SysTick_Config(SystemCoreClock / 1000 * Systick_tim);
}
/*
*********************************************************************************************************
* 函 數 名: SysTick_ISR
* 功能說明:SysTick中斷服務程序,在SysTick_Handler中調用
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
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運行時間增Systick_tim*/
if (g_iRunTime >= 0x9A7EC800) /* 30天清零 */
{
g_iRunTime = 0;
}
s_count += Systick_tim;
if (s_count >= 10)
{
s_count = 0;
/*
此處可加入按鍵的檢測。按鍵檢測每隔10ms一次就行了,一般做40ms的濾波處理就可以
有效過濾掉機械動作造成的按鍵抖動。
*/
// Key_Scan();
}
}
/*
*********************************************************************************************************
* 函 數 名: delay_ms
* 功能說明: ms級延遲,延遲精度為正負1ms
* 形 參:n : 延遲長度,單位 ms。
* 返 回 值: 無
*********************************************************************************************************
*/
void Delay_Ms(int32_t n)
{
// /* 避免 n = 1 出現主程序死鎖 */
// if (n <= 1)
// {
// n = 2;
// }
__set_PRIMASK(1); /* 關中斷 */
g_Tmr[DELAY_TIM].count = n;
g_Tmr[DELAY_TIM].flag = 0 ;
__set_PRIMASK(0); /* 開中斷 */
while (1)
{
CPU_IDLE(); /* 此處是空操作。用戶可以定義,讓CPU進入IDLE狀態,以降低功耗;或實現喂狗 */
/* 等待延遲時間到 */
if (g_Tmr[DELAY_TIM].flag == 1)
{
return;
}
}
}
systick.h中的代碼
/*********************************************************************************************/
#define SYSTICK_MODE 0 //0中斷模式,1查詢模式
/* 軟件延時 */
void SoftDelay_Ms(uint16_t nms);
void SoftDelay_Us(uint16_t nus);
/**********************************************中斷模式**********************************************/
#if SYSTICK_MODE == 0
/* 目前是空操作,用戶可以定義讓CPU進入IDLE狀態的函數和喂狗函數 */
#define CPU_IDLE()
#define Systick_tim 1 //Systic中斷時間(時鐘基線),單位:ms
/*
可在此處枚舉中增加若干個軟件定時器
注意:變量在中斷和主程序中同時被訪問,有可能造成編譯器錯誤優化,必須增加__IO 即 volatile。
*/
enum enum_tim_id{
DELAY_TIM = 0, //第1個保留給Delay_Ms()使用
USER_TIM1,
USER_TIM2,
USER_TIM3,
COUNT_TIM //軟件定時器的個數
};
/* 定時器結構體 */
typedef struct
{
volatile int32_t count; //計數器
volatile uint8_t flag; //定時到達標志
}SOFT_TMR;
/* 供外部調用的函數聲明 */
void Systick_Init(void);
void SysTick_ISR(void);
更多請下載源碼
systick時鐘基線運用.7z
(453.11 KB, 下載次數: 13)
2020-5-8 21:43 上傳
點擊文件名下載附件
源碼 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|