STM32延時(shí)函數(shù)分析
delay_init(u8 SYSCLK) //定時(shí)初始化函數(shù)分析
{
Systick->CTRL&=0xfffffffb; //bit2清空,選擇外部時(shí)鐘 HCLK/8
fac_us=SYSCLK/8;
fac_ms=(u16)fac_us*1000;
}
摘自STM32手冊(cè)
6.2.6
系統(tǒng)時(shí)鐘(SYSCLK)選擇
系統(tǒng)復(fù)位后,HSI振蕩器被選為系統(tǒng)時(shí)鐘。當(dāng)時(shí)鐘源被直接或通過PLL間接作為系統(tǒng)時(shí)鐘時(shí),它將不能被停止。
只有當(dāng)目標(biāo)時(shí)鐘源準(zhǔn)備就緒了(經(jīng)過啟動(dòng)穩(wěn)定階段的延遲或PLL穩(wěn)定),從一個(gè)時(shí)鐘源到另一個(gè)時(shí)鐘源的切換才會(huì)發(fā)生。在被選擇時(shí)鐘源沒有就緒時(shí),系統(tǒng)時(shí)鐘的切換不會(huì)發(fā)生。直至目標(biāo)時(shí)鐘源就緒,才發(fā)生切換。
在時(shí)鐘控制寄存器(RCC_CR)里的狀態(tài)位指示哪個(gè)時(shí)鐘已經(jīng)準(zhǔn)備好了,哪個(gè)時(shí)鐘目前被用作系統(tǒng)時(shí)鐘。
Systick時(shí)鐘那里來?
Systick時(shí)鐘由系統(tǒng)時(shí)鐘8分頻后決定.
解析delay_us(u32 nus)函數(shù)
void delay_us(u32 nus)
{
u32 temp;
Systick->LOAD=nus*fac_us; //裝入定時(shí)值
Systick->VAL=0x00; //清空計(jì)數(shù)器值
Systick->CTRL=0x01; //開啟倒計(jì)時(shí)定時(shí)器
do
{
temp=Systick->CTRL; //定時(shí)器狀態(tài)賦給變量
}while((temp&0x01)&&(temp&(1<<16))); //判斷開啟和是否計(jì)數(shù)到了0 (到達(dá)設(shè)定值)
Systick->CTRL=0x00; //關(guān)閉定時(shí)
Systick->VAL=0x00; //清空計(jì)數(shù)值
}
定時(shí)1us分析:
由于Systick時(shí)鐘設(shè)置為是系統(tǒng)時(shí)鐘的8分頻 ,假設(shè)SYSCLK=72M 則Systick=9MHZ
因?yàn)閒ac_us是基數(shù)無單位
fac_us=SYSCLK/8; 即72/8=9 則Systick->LOAD=nus*fac_us, 假設(shè)定時(shí)1us 則Systick->LOAD=9.
因?yàn)镾ystick是9M的速度倒計(jì)時(shí) 所以9個(gè)計(jì)數(shù)時(shí)間為9*(1/9M) 就是1us
必須保證nus<=(2^24)/fac_us
編程實(shí)例: I/O口輸出500us方波
delay_ms(u16 nms)函數(shù)分析:
看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
Systick時(shí)鐘那里來?
Systick時(shí)鐘由系統(tǒng)時(shí)鐘8分頻后決定.
解析delay_us(u32 nus)函數(shù)
void delay_us(u32 nus)
{
u32 temp;
Systick->LOAD=nus*fac_us; //裝入定時(shí)值
Systick->VAL=0x00; //清空計(jì)數(shù)器值
Systick->CTRL=0x01; //開啟倒計(jì)時(shí)定時(shí)器
do
{
temp=Systick->CTRL; //定時(shí)器狀態(tài)賦給變量
}while((temp&0x01)&&(temp&(1<<16))); //判斷開啟和是否計(jì)數(shù)到了0 (到達(dá)設(shè)定值)
Systick->CTRL=0x00; //關(guān)閉定時(shí)
Systick->VAL=0x00; //清空計(jì)數(shù)值
}
定時(shí)1us分析:
由于Systick時(shí)鐘設(shè)置為是系統(tǒng)時(shí)鐘的8分頻 ,假設(shè)SYSCLK=72M 則Systick=9MHZ
因?yàn)閒ac_us是基數(shù)無單位
fac_us=SYSCLK/8; 即72/8=9 則Systick->LOAD=nus*fac_us, 假設(shè)定時(shí)1us 則Systick->LOAD=9.
因?yàn)镾ystick是9M的速度倒計(jì)時(shí) 所以9個(gè)計(jì)數(shù)時(shí)間為9*(1/9M) 就是1us
必須保證nus<=(2^24)/fac_us
編程實(shí)例: I/O口輸出500us方波
#include
#include "sys.h"
#include "delay.h"
#include "usart.h"
#define LED0 PBout(0)
#define LED1 PBout(1)
void led_init(void)
{
RCC->APB2ENR|=1<<3;
GPIOB->CRL&=0xffffff00;
GPIOB->CRL|=0x00000033; //推挽輸出
GPIOB->ODR|=0xffff;
}
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72);
led_init();
while(1)
{
LED0=0;
delay_us(500);
LED0=1;
delay_us(500);
}
}
delay_ms(u16 nms)函數(shù)分析:
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms;//時(shí)間加載(SysTick->LOAD為24bit)
SysTick->VAL =0x00; //清空計(jì)數(shù)器
SysTick->CTRL=0x01 ; //開始倒數(shù)
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待時(shí)間到達(dá)
SysTick->CTRL=0x00; //關(guān)閉計(jì)數(shù)器
SysTick->VAL =0X00; //清空計(jì)數(shù)器
關(guān)鍵詞:
STM32延時(shí)函
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論