STM8,延时函数

发布者:快乐阳光最新更新时间:2020-09-07 来源: eefocus关键字: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,延时应该算是准确的吧。


关键字:STM8  延时函数  累加器 引用地址:STM8,延时函数

上一篇:STM8时基单元
下一篇:STM8l051,新建工程

推荐阅读最新更新时间:2024-11-10 12:28

STM8 配置看门狗的坑
首先祭出正确的打开方式。。 void IWDG_Init(void) //配置并启动看门狗 { IWDG- KR = 0xcc;//启动独立看门狗 IWDG- KR = 0x55;//写入解锁 IWDG- PR = 0x06;//256分频 IWDG- RLR = 0xff;//设置重载寄存器 IWDG- KR = 0xaa;//锁定并刷新 } void IWDG_Feed(void)//喂狗 { IWDG- KR = 0xaa; }
[单片机]
学习单片机5
单片机教学 三、逻辑运算类指令: 1. 对累加器A的逻辑操作:   CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。 CPL A ;将A中的值按位取反     RL A ;将A中的值逻辑左移   RLC A ;将A中的值加上进位位进行逻辑左移   RR A ;将A中的值进行逻辑右移 RRC A ;将A中的值加上进位位进行逻辑右移 SWAP A ;将A中的值高、低4位交换。 例:(A)=73H,则执行CPL A,这样进行: 73H化为二进制为01110011, 逐位取反即为 10001100,也就是8CH。 RL A是将(A)中的值的第7位送到第0位,第0位
[单片机]
STM8 SPI主模式
STM8 SPI主模式 在主配置时,串行时钟在SCK脚产生。 置配步骤 1.通过SPI_CR1寄存器的BR 位定义串行时钟波特率。 2.选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系(见图91)。 3.配置SPI_CR1寄存器的LSBFIRST位定义帧格式。 4.硬件模式下,在数据帧的全部传输过程中应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR2寄存器的SSM和SSI位为'1'。 5.必须设置MSTR和SPE位(只当NSS脚被连到高电平,这些位才能保持为‘1’)。 在这个配置里,MOSI引脚是数据输出,MISO引脚是数据输入。 数据传输过程 当一字节写进发送缓冲器时,发送过程开始。
[单片机]
<font color='red'>STM8</font> SPI主模式
STM8 仿真跑飞 swim comm timeout
跑飞原因就很多了,我说说程序没问题,莫名其妙跑飞的情况。 为啥说程序没问题呢?首先是编译通过啦,其次我们也正确的配置寄存器了,但是还跑飞了,蛋疼。 特别是相对于STM8S103F3这些只有少的可怜的8K存储空间的单片机,真是蛋疼啊,好了不废话了,据我的经验总结一下: 用IAR平台,COSMIC的很烂,劝君莫用。 1、debug模式优化设置为none,此种情况下编译并运行还跑飞的话,可能是Option byte设置问题。比如你用了TIM2_CH1的PWM功能,但是你的Option byte没设置,那么跑起来会飞掉(我第一次遇到这么奇葩的单片机) 2、如果程序真的很大,要把优化设置为middle,那么就要小心了。IAR的优化有点
[单片机]
STM8 固件库编写 使用外部晶振串口通信时,发送是乱码
因为我需要做9600波特率的串口通信,所以外部接的是11.0592MHz的晶振。时钟初始化程序如下: void Clock_init() { CLK_DeInit(); CLK_HSECmd(ENABLE); //启用外部时钟 while(SET!=CLK_GetFlagStatus(CLK_FLAG_HSERDY)); //等待外部时钟启动 CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //1分频 CLK_ClockSwitchCmd(ENABLE); CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSE,
[单片机]
单片机c语言中nop函数的使用方法和延时计算
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。 这在汇编语言中很容易实现,写几个nop就行了。 在keil C51中,直接调用库函数: #include intrins.h // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用 _nop_ 函数,这个函数相当汇编NOP指令,延时几微秒。 NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。 对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。 在选择C51中
[单片机]
STM8内部EEPROM的使用
@eeprom u8save ={5,4,3};//大括号内为初始值,初始值只在仿真器仿真时才会起作用 u8 *pSave = (u8 *)&save ;//对EEPROM数据区进行写操作时必须使用指针访问 void main() { do { FLASH_Unlock(FLASH_MEMTYPE_DATA); }while((FLASH- IAPSR & FLASH_IAPSR_DUL) == 0);//等待DATA EEPROM区解锁 *pSave = *pSave+1; //save =save +1;//对EEPROM数据区进行写操作时不能使用直接访问,仅可用地址间接访问,原因:可以比较和上面一句的汇编代码 while((
[单片机]
IAR for stm8 中指定编译的起始地址
IAR for stm8 中指定编译的起起地址 已经用STVD+cosmic完成了IAP功能,但想试着在STM8上跑上官的UCOS,不得不用IAR编译,但编译后代码的生成地址怎么再从0X9000开始生成呢,找遍全网,也没有发现三言两语直接的表白,又对IAR环境不熟,看过了IAR下的工程设置的全部选项,都没有发现怎么修改这个地址,IAR的这个地址的修改,并不象KEIL及STVD下那么直接,它必须通过IAR的根目录下有个CONFIG的文件夹,里面有各种单片机的*.icf的文件,我看着有两处0x8000改为0x9000,然后编译文件,呵呵,果然有效,在STVP下,发现HEX文件就是从0x9000开始生成代码了。找的好辛苦,又不太懂英文看帮
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved