日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

STM32系统定时器SysTick(只能向下递减)延时闪烁灯

發布時間:2023/12/10 windows 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32系统定时器SysTick(只能向下递减)延时闪烁灯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:stm32 系統定時器 SysTick
作者:點燈小哥
發布時間: 2021-03-10 13:46:00
網址:https://blog.csdn.net/weixin_46016743/article/details/114633245

參考:stm32之系統定時器
作者:打醬油的;
發布時間: 2021-04-13 20:11:32
網址:https://blog.csdn.net/weixin_46098612/article/details/115669473

目錄

  • 系統定時器原理(只能向下遞減)
  • 定時時間的計算方法(1ms、1us)
  • SysTick相關寄存器
  • SysTick結構體(里面寄存器)
  • SysTick固件庫函數
  • SysTick中斷優先級(通過寄存器設置)
  • SysTick編寫us、ms延時函數閃爍燈

系統定時器原理(只能向下遞減)

定時時間的計算方法(1ms、1us)

SysTick相關寄存器

這是寄存器里面特殊的位:

SysTick結構體(里面寄存器)

在內核寄存器core_cm3.h里面

注:上面第三個是當前寄存器的值,用到最多的是前三個結構體成員。

SysTick固件庫函數

在core_cm3.h最下面找

static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); //判斷ticks值是否大于重裝載值最大值 2^24(系統定時器是24位的)SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //配置reload重裝載寄存器的初值NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置中斷優先級 1<<4 -1 = 16-1=15 即中斷優先級是15 下面詳解//內核的中斷優先級要高于外設的中斷優先級 數字越小 優先級越高SysTick->VAL = 0; //配置count的值 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //配置system時鐘為 72MSysTick_CTRL_TICKINT_Msk | //使能中斷SysTick_CTRL_ENABLE_Msk; //使能systickreturn (0); }

ticks值設置為72則延時1us,設置為720000延時1ms。

SysTick中斷優先級(通過寄存器設置)


SysTick編寫us、ms延時函數閃爍燈

SysTick.h

#include "stm32f10x.h" void ms_delay(uint32_t ms); void us_delay(uint32_t us);

SysTick.c

#include "stm32f10x.h" // Device header #include "SysTick.h"void ms_delay(uint32_t ms)//毫秒定時器 { uint32_t i;//次數SysTick_Config(72000);//SysTick固件庫函數 前面有講 本質就是給重裝載 Reload寄存器賦值//我理解的有點像多線程 上面線程獨立于CPU資源不斷重復進行重裝載定時 下面是CPU資源處理的進程進行判斷for(i=0;i<ms;i++) //定時器(計數器)一個循環就是1ms 循環多少次就是多少毫秒{//系統定時器只能遞減 判斷是否減到0就可以了 一旦減到0則CTRL寄存器第16位為1 如下圖所示:while( !( (SysTick->CTRL) &(1<<16) ) );//}SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//失能 置位回去 }void us_delay(uint32_t us)//微秒定時器 { uint32_t i;SysTick_Config(72);for(i=0;i<us;i++){while( !( (SysTick->CTRL) &(1<<16) ) );}SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; }


下面是CTRL寄存器里面相應的位:

main.c

#include "stm32f10x.h" // Device header #include "usart.h" #include "led.h" #include "tim.h" #include "motor.h" #include "SysTick.h"//添加頭文件路徑void delay(uint16_t time) {uint16_t i = 0;while(time--){i=12000;while(i--);} }int main(void) { LED_Init();GPIO_SetBits( GPIOC, GPIO_Pin_13);while(1){GPIO_ResetBits( GPIOC, GPIO_Pin_13);ms_delay(500);GPIO_SetBits( GPIOC, GPIO_Pin_13);ms_delay(500); } }

總結

以上是生活随笔為你收集整理的STM32系统定时器SysTick(只能向下递减)延时闪烁灯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。