STM8,延時函數


照搬原子哥的代碼:http://www.openedv.com/posts/list/17347/htm

原子哥的教程有比較詳細的注釋和網友回復,這里僅作記錄

這是基於IAR的,原子哥的帖子下面有網友回復的STVD的

main.c

#include "stm8l15x_conf.h"

volatile u8 fac_us=0;

void delay_init(u8 clk)
{
  if(clk>16)fac_us=(16-4)/4;
  else if(clk>4)fac_us=(clk-4)/4;
  else fac_us=1;
}

void delay_us(u16 nus)
{
  __asm(
"PUSH A          \n"    //1T,壓棧
"DELAY_XUS:      \n"
"LD A,fac_us     \n"    //1T,fac_us加載到累加器A
"DELAY_US_1:     \n"
"NOP             \n"    //1T,nop延時
"DEC A           \n"    //1T,A--
"JRNE DELAY_US_1 \n"    //不等於0,則跳轉(2T)到DELAY_US_1繼續執行,若等於0,則不跳轉(1T).
"NOP             \n"    //1T,nop延時
"DECW X          \n"    //1T,x--
"JRNE DELAY_XUS  \n"    //不等於0,則跳轉(2T)到DELAY_XUS繼續執行,若等於0,則不跳轉(1T).
"POP A           \n"    //1T,出棧
);
}

void delay_ms(u32 nms)
{
  u8 t;
  if(nms>65)
  {
    t=nms/65;
    while(t--)delay_us(65000);
    nms=nms%65;
  }
  delay_us(nms*1000);
}

void Sysclk_Init(void)

{

 //HSI內部時鍾,0分頻,16MHZ

  CLK_HSICmd(ENABLE);
  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);   
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);

}

void main(void)
{
  Sysclk_Init();
  LED_Init();
  //Uart1_Init();
  delay_init(16);  //參數16為內部時鍾頻率
 
  while (1)
  {
    GPIO_ToggleBits(LED1_Port, LED1_Pin);
    delay_ms(15);
  }
}

 

注1:之前用定時器2延時,每1s串口打印信息一次,用 調試助手看的時間戳會差10ms左右,以為 是我寫的定時器配置的有問題,用了上面的延時之后發現是一樣的,不知道是不是執行一句printf();需要10ms。

注2:上面的延時不知道怎么用示波器測量,所以就測量了下 反轉LED的頻率,發現延時15ms的情況下,測量出來的一個周期是29.7ms,延時應該算是准確的吧。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM