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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3296|回復: 0
打印 上一主題 下一主題
收起左側

奮斗stm32開發板學習日記7—SysTick

[復制鏈接]
跳轉到指定樓層
樓主
                  SysTick——操作系統的心跳:
SysTick簡單的來說,就相當于操作系統的心跳, 只要使用了時基的系統都必須要有一個硬件定時器來產生所需要的滴答中斷, 而systick就相當于這個硬件定時器。 在ucos中,作為操作系統的心跳,他是整個操作系統的核心部件, 操作系統依據systick,可以為多個任務分配不同的時間片段, 從而不讓任務霸占系統。 因此,用戶最好不要隨意訪問修改systick的寄存器。
Systick工作分析:
Systick他是一個24位寄存器, 即一次最多可以計數2的24次方個時鐘脈沖, 計數脈沖保保存在當前計數值寄存器STK_VAL中。如圖所示:

只能向下計數,每接收到一個時鐘脈沖STK_Val值就向下減一,直到0. 由硬件自動把重載寄存器STK_LOAD寄存器產生中斷,出發異常, 就可以在中斷服務程序中處理定時事件了。
接下來介紹下,STK_CTRL寄存器中的關鍵位, COUNTFLAG, CLKSOURCE, TICKINT, ENABLE。
  • ENABLE 位于第一位, 該位為使能定時器, 為0關閉定時器。
  • TICKINT 為1時,計數到0會引發異常中斷, 為0 便不會。
  • CLKSOURCE 時鐘選擇位,1 使用AHB時鐘, 為0 則使用AHB的8分頻, AHB時鐘為72MHz;
  • COUNTFLAG :若計數到0, 則此位為1.

延時分析:
使用SysTick可以進行精確的延時, 理論上他的精度為1/72000000秒, 72分之一微妙。足以滿足大部分需求。
代碼如下:
#include "stm32f10x.h"
#include "SysTick.h"
#include "led.h"
uint32_t ticktime;
/*
* 函數名:main
* 描述 :主函數
* 輸入 :無
* 輸出 :無
*/
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
/* 配置SysTick 為10us中斷一次 */
SysTick_Init();
for(;;)
{
LED1( 0 );
Delay_us(50000); // 50000 * 10us = 500ms
LED1( 1 );
LED2( 0 );
Delay_us(50000);// 50000 * 10us = 500ms
LED2( 1 );
LED3( 0 );
Delay_us(50000);// 50000 * 10us = 500ms
LED3( 1 );
}
}
#include "SysTick.h"
static __IO u32 TimingDelay;
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中斷一次
* SystemFrequency / 100000 10us中斷一次
* SystemFrequency / 1000000 1us中斷一次
*/
//if (SysTick_Config(SystemFrequency / 100000))// ST3.0.0庫版本
if (SysTick_Config(SystemCoreClock / 100000))// ST3.5.0庫版本
{
/* Capture error */
while (1);
}
// 關閉滴答定時器
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
// 使能滴答定時器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);
}
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_it.h"
extern void TimingDelay_Decrement(void);
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
代碼分析:
從main函數開始說起:SysTick_init Delay_us 這兩個函數配置好Systick定時器并且使之精確延時。進入SysTick_init函數中, 其中 SysTick_Config就是配置延時時間長短的函數,如果成功就返回1.
當計數到0進入中斷函數,Systick_handler函數中時, 就調用一次imingDelay_Decrement,這樣累計總共調用他的次數,就可以算出最終延遲的時間。
這段代碼的實驗現象就是可以看到實驗板上的led燈以500ms的頻率閃爍。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情精品久久久久 | 一级一级毛片免费看 | 国产男人的天堂 | 91国内精品 | 国产精品网址 | 欧美在线综合 | 国产一区二区自拍 | 免费a在线 | 国产日韩欧美在线观看 | 欧美一区二区三区视频 | 2020天天操 | 日韩视频中文字幕 | 性xxxxx| 毛片入口 | 9191在线观看 | 国产精品视频网 | 午夜一级大片 | 91精品国产91久久久久久吃药 | 粉嫩av在线| 看一级黄色毛片 | 国产高清一区二区 | 欧美一级片免费看 | 午夜男人免费视频 | 伊人狠狠干 | 欧美精品一区二区在线观看 | 日韩精品视频在线免费观看 | 中文字幕一区二区三区四区五区 | 成人a在线观看 | 精品视频一区二区 | 偷偷操视频 | 精品国产久 | 欧美黄色片 | 伊人色综合久久天天五月婷 | 国产一区免费视频 | 日日干夜夜操 | 久久69精品久久久久久久电影好 | 99免费看| 射欧美 | 一区二区不卡视频 | 久久精品国产一区二区三区不卡 | 7777在线 |