?? bsp_timer.c
字號:
/*
*********************************************************************************************************
*
* 模塊名稱 : 定時(shí)器模塊
* 文件名稱 : bsp_timer.c
* 版 本 : V2.0
* 說 明 : 設(shè)置systick中斷,實(shí)現(xiàn)若干個(gè)軟件定時(shí)器
* 修改記錄 :
* 版本號 日期 作者 說明
* v0.1 2009-12-27 armfly 創(chuàng)建該文件,ST固件庫版本為V3.1.2
* v1.0 2011-01-11 armfly ST固件庫升級到V3.4.0版本。
* v2.0 2011-10-16 armfly ST固件庫升級到V3.5.0版本。
*
* Copyright (C), 2010-2011, 安富萊電子 www.armfly.com
*
*********************************************************************************************************
*/
#include "stm32f10x.h"
#include <stdio.h>
#include "bsp_timer.h"
#include "bsp_button.h"
/*
在此定義若干個(gè)軟件定時(shí)器全局變量
注意,必須增加__IO 即 volatile,因?yàn)檫@個(gè)變量在中斷和主程序中同時(shí)被訪問,有可能造成編譯器錯(cuò)誤優(yōu)化。
*/
#define TMR_COUNT 4 /* 軟件定時(shí)器的個(gè)數(shù),第1個(gè)保留給bsp_DelayMS()使用 */
SOFT_TMR g_Tmr[TMR_COUNT];
/* 全局運(yùn)行時(shí)間,單位10ms,用于uIP */
__IO int32_t g_iRunTime = 0;
static void bsp_SoftTimerDec(SOFT_TMR *_tmr);
void bsp_InitTimer(void)
{
uint8_t i;
/* 清零所有的軟件定時(shí)器 */
for (i = 0; i < TMR_COUNT; i++)
{
g_Tmr[i].count = 0;
g_Tmr[i].flag = 0;
}
/*
配置systic中斷周期為1ms,并啟動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);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: SysTick_ISR
* 功能說明: SysTick中斷服務(wù)程序,每隔1ms進(jìn)入1次
* 形 參:無
* 返 回 值: 無
*********************************************************************************************************
*/
extern void AdcPro(void);
void SysTick_ISR(void)
{
static uint8_t s_count = 0;
uint8_t i;
for (i = 0; i < TMR_COUNT; i++)
{
bsp_SoftTimerDec(&g_Tmr[i]);
}
g_iRunTime++; /* 全局運(yùn)行時(shí)間每1ms增1 */
if (g_iRunTime == 0x7FFFFFFF)
{
g_iRunTime = 0;
}
if (++s_count >= 10)
{
s_count = 0;
/*
下面的代碼實(shí)現(xiàn)所有按鍵的檢測。按鍵檢測每隔10ms一次就行了,一般做40ms的濾波處理就可以
有效過濾掉機(jī)械動作造成的按鍵抖動。
*/
bsp_KeyPro(); /* 該函數(shù)在 bsp_button.c 中實(shí)現(xiàn) */
}
AdcPro(); /* ADC采樣濾波 */
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_SoftTimerDec
* 功能說明: 每隔1ms對所有定時(shí)器變量減1。必須被SysTick_ISR周期性調(diào)用。
* 形 參:_tmr : 定時(shí)器變量指針
* 返 回 值: 無
*********************************************************************************************************
*/
static void bsp_SoftTimerDec(SOFT_TMR *_tmr)
{
if (_tmr->flag == 0)
{
if (_tmr->count > 0)
{
/* 如果定時(shí)器變量減到1則設(shè)置定時(shí)器到達(dá)標(biāo)志 */
if (--_tmr->count == 0)
{
_tmr->flag = 1;
}
}
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_DelayMS
* 功能說明: ms級延遲,延遲精度為正負(fù)1ms
* 形 參:n : 延遲長度,單位1 ms。 n 應(yīng)大于2
* 返 回 值: 無
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t n)
{
/* 避免 n = 1 出現(xiàn)主程序死鎖 */
if (n <= 1)
{
n = 2;
}
__set_PRIMASK(1); /* 關(guān)中斷 */
g_Tmr[0].count = n;
g_Tmr[0].flag = 0;
__set_PRIMASK(0); /* 開中斷 */
while (1)
{
CPU_IDLE(); /* 此處是空操作。用戶可以定義,讓CPU進(jìn)入IDLE狀態(tài),以降低功耗;或?qū)崿F(xiàn)喂狗 */
/* 等待延遲時(shí)間到 */
if (g_Tmr[0].flag == 1)
{
break;
}
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_StartTimer
* 功能說明: 啟動一個(gè)定時(shí)器,并設(shè)置定時(shí)周期。
* 形 參: _id : 定時(shí)器ID,值域【1,TMR_COUNT-1】。用戶必須自行維護(hù)定時(shí)器ID,以避免定時(shí)器ID沖突。
* 定時(shí)器ID = 0 已用于bsp_DelayMS()函數(shù)
* _period : 定時(shí)周期,單位1ms
* 返 回 值: 無
*********************************************************************************************************
*/
void bsp_StartTimer(uint8_t _id, uint32_t _period)
{
if (_id >= TMR_COUNT)
{
/* while(1); 死機(jī) */
return;
}
__set_PRIMASK(1); /* 關(guān)中斷 */
g_Tmr[_id].count = _period;
g_Tmr[_id].flag = 0;
__set_PRIMASK(0); /* 開中斷 */
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_CheckTimer
* 功能說明: 檢測定時(shí)器是否超時(shí)
* 形 參: _id : 定時(shí)器ID,值域【1,TMR_COUNT-1】。用戶必須自行維護(hù)定時(shí)器ID,以避免定時(shí)器ID沖突。
* 0 用于
* _period : 定時(shí)周期,單位1ms
* 返 回 值: 返回 0 表示定時(shí)未到, 1表示定時(shí)到
*********************************************************************************************************
*/
uint8_t bsp_CheckTimer(uint8_t _id)
{
if (_id >= TMR_COUNT)
{
return 0;
}
if (g_Tmr[_id].flag == 1)
{
g_Tmr[_id].flag = 0;
return 1;
}
else
{
return 0;
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_GetRunTime
* 功能說明: 獲取CPU運(yùn)行時(shí)間,單位1ms
* 形 參:無
* 返 回 值: CPU運(yùn)行時(shí)間,單位1ms
*********************************************************************************************************
*/
int32_t bsp_GetRunTime(void)
{
int runtime;
__set_PRIMASK(1); /* 關(guān)中斷 */
runtime = g_iRunTime; /* 由于在Systick中斷被改寫,因此關(guān)中斷進(jìn)行保護(hù) */
__set_PRIMASK(0); /* 開中斷 */
return runtime;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -