国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 5318|回復: 4
打印 上一主題 下一主題

深入了解Systick系統滴答定時學習筆記

[復制鏈接]
跳轉到指定樓層
樓主
發表于 2012-11-16 12:26:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
/****************************************************************************
*                 SysTick系統滴答定時學習筆記
*          //深入研究
*
*            
*****************************************************************************/
#ifndef                 _SYSTICK_H
#define                 _SYSTICK_H
#include "SysTick.h"                        
#define    SYSTICK_CSR   (*((volatile unsigned long *) 0xE000E010)) //控制寄存器
#define    SYSTICK_LOAD  (*((volatile unsigned long *) 0xE000E014)) //重載寄存器
#define    SYSTICK_VAL   (*((volatile unsigned long *) 0xE000E018)) //當前值寄存器
#define    SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校準值寄存器
肯定會有個別人不知道宏定義的意思,這里我先介紹一下宏定義首先肯定是看最里面的括號,也就是(volatile unsigned long *),
這個用來修飾地  址:0xE000E010,當然就是把這個地址強制轉換為unsigned long型的指針. 然后再開外部的*,這個就不難理解了,
指針前面加* 就是取值了。                           
unsigned long SysTick_Delay;//全局變量       // 所以SYSTICK_CSR 的意思就是存放在0xE000E01C地址的值.大家都
//配置寄存器                                 //明白了吧,學C語言的人因該都知道啊,我們開始看下面。
void SysTick_InitStructReadCmd(void)
{
    if(SysTick_Config(72)) //SYSTICK_LOAD = SystemCoreClock / 1000000;    //重要部分就在這里  系統AHB時鐘72000000 / 1000000
   {
      while(1);
    }
      SYSTICK_CSR |= 0x06;                   //先關閉SysTick使能用的時候在打開
}
//SysTick中斷服務程序
void SysTick_Hangler(void)
{
    SYSTICK_VAL = 0;                     //當前值寄存器清零
    if(SysTick_Delay != 0x00)          //判斷延時SysTick_Delay 是否等于0
    {
        SysTick_Delay--;                //減一次 10us
    }               
}
//延時函數
void Delay_10us(unsigned long Countlinef)
{                                       
    SYSTICK_CSR |= 0x07;                         //啟動SysTick使能
    SysTick_Delay = Countlinef;                  //把延時變量賦值SysTick_Delay全局變量
    while(SysTick_Delay != 0);                   //判斷延時時間是否到
    SYSTICK_CSR |= 0x06;                         //時間到關閉 SysTick使能用的時候在打開
}
int main(void)
{
    SystemInit();   //注意這么是把系統時鐘設初始化為 72M主頻,這里是必須的
    SysTick_InitStructReadCmd();
    while(1)
    {
        GPIOD->BSRR = 0x00000100;
        Delay_10us(100000)  ; //實現1ms延時
        GPIOD->BRR  = 0x00000100;
    }
}
//====================================END=============================================//
/*   好了我們開始講解程序1us是怎么實現的,我們使用時鐘源為AHB時鐘,AHB系統頻率陪配置為72MHZ
     SYSTICK_LOAD = SystemCoreClock / 1000000; SysTick重載初值重要的地方就在這里
     1:SystemCoreClock 這個是什么意思,跟蹤庫函數找到如下:
        #ifdef SYSCLK_FREQ_HSE
        uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;      
        #elif defined SYSCLK_FREQ_24MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;     
        #elif defined SYSCLK_FREQ_36MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;      
        #elif defined SYSCLK_FREQ_48MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;      
        #elif defined SYSCLK_FREQ_56MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        
        #elif defined SYSCLK_FREQ_72MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        
        #else /*!< HSI Selected as System Clock source */
//     uint32_t SystemCoreClock         = HSI_VALUE;     
/*這里不難看出,我們初始化SystemInit(); 是系統已經把SystemCoreClock配置成72M下面就不難理解了,
               先看一下計算公式:T = TICKS * (1/f);  
               T : 為要計時的總時間。
               TICKS :為SYSTICK_LOAD 的輸入參數。
               (1/f)為使用時鐘源的時鐘周期,f為時鐘源的時鐘頻率
               使用時鐘源為AHB時鐘, 頻率被配置72M;
               把SYSTICK_LOAD重載寄存器賦值為 SystemCoreClock / 100000;大家
               發現了什么,就是72000000 / 1000000 = 72; 大家都應該知道了72個時鐘周期
               中斷一次,大家接著看(1/f)是時鐘周期的時間。1/72M = 0.13888888888888888888888888888889;
              一個時鐘周期時間*72時鐘周期中斷一次
               1us誕生了,0.13888888888888888888888888888889*72 = 1;1us哈哈哈大家明白了吧。
         
*/         
                     

#endif
沙發
 樓主| 發表于 2012-11-16 12:32:43 | 只看該作者
這個程序是我用做項目的時候寫的,紅外解碼上面用到的1us很精準,大家可以放心使用
板凳
發表于 2012-11-16 14:03:10 | 只看該作者
學習了
地板
 樓主| 發表于 2012-11-16 16:38:12 | 只看該作者
void SysTick_Hangler(void)

{

  //  SYSTICK_VAL = 0;                     //當前值寄存器清零

    if(SysTick_Delay != 0x00)          //判斷延時SysTick_Delay 是否等于0

    {

        SysTick_Delay--;                //減一次 10us

    }               

}
不好意思這個程序,以前被我給過,把當前值寄存器清零去掉


地下室
發表于 2012-11-29 10:01:58 | 只看該作者
mark
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99热这里只有精品5 99热这里只有精品4 | 成年人黄色网址 | 亚洲一区二区三区高清不卡 | 日本一区二区成人教育 | 国产精品高清在线观看 | 亚洲福利网址 | 久热这里只有精品6 | 国产亚洲欧美在线观看的 | 日日日夜夜夜夜 | 免费毛片在线播放 | 成人一区二区免费中文字幕 | 2022欧美高清中文字幕在线看 | 97精品在线 | 韩毛片| 婷婷色在线视频 | 麻豆资源| 在线观看精品视频网站www | 久久国产精彩视频 | 一色屋免费视频 | 久久精品国产一区二区三区不卡 | 在线观看不卡一区 | 亚洲欧美国产日本 | 国产欧美日韩中文字幕 | 久久黄色精品视频 | 插菊花网 | 四虎影视成人精品 | 国产成人欧美 | 国产成人香蕉在线视频网站 | 日本精品久久 | 精品国产免费久久久久久婷婷 | 国内精品一区二区三区 | 亚洲视频观看 | 亚洲动漫在线观看 | 韩国精品在线 | 韩国视频一区二区 | 97一级毛片全部免费播放 | 国产精品玖玖玖在线观看 | 日韩欧美国产中文字幕 | 欧美成人一区二区三区不卡 | 精品国产国语对白主播野战 | 四虎在线永久视频观看 |