[STM8] 汇编延时函数不能运行怎么回事?

[复制链接]
1252|24
 楼主| renyaq 发表于 2019-9-15 11:22 | 显示全部楼层 |阅读模式
之前按asm(nop);改的延时函数,时间不准。找正点原子写得汇编延迟改程序,编译都能过,就是延时不能运行,开在开头。把整个汇编拆开写,编译就提示DELAY_XUS,DELAY_US_1没有定义。其他人也有不能运行的。原因有没顶左边起始的,未设置正确频率的,我都没有。但是就是不能运行。
 楼主| renyaq 发表于 2019-9-15 11:30 | 显示全部楼层
gongche 发表于 2019-9-15 11:34 | 显示全部楼层
可能你汇编用到的那些寄存器里面有C的数据。
huanghuac 发表于 2019-9-15 11:59 | 显示全部楼层
楼主不如直接用C写啊,配合定时器。
午夜粪车 发表于 2019-9-15 12:02 | 显示全部楼层
#include"stm8s.h"


uint8_t startflag = 0;
uint16_t timercnt = 0;


/*******************************************************************************
函数名;init_clk()
功能  :初始化系统时钟
输入  :无
输出  :无
返回值:无
备注  :无
*******************************************************************************/
void init_clk(void)
{
      //初始化时钟
  CLK_HSICmd(ENABLE);//开始内部高频RC
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//不分频
  CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
}

/*******************************************************************************
函数名:init_timer4()
功能  :初始化timer4
输入  :无
输出  :无
返回值:无
备注  :无
*******************************************************************************/
void init_timer4(void)
{

  TIM4_TimeBaseInit(TIM4_PRESCALER_8, 50);   //每个计数周期为0.5us@8分频@16MHz
  TIM4_ClearFlag(TIM4_FLAG_UPDATE);
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
  TIM4_Cmd(ENABLE);
}

/*******************************************************************************
函数名:init_gpio()
功能  :初始化GPIO
输入  :无
输出  :无
返回值:无
备注  :无
*******************************************************************************/
void init_gpio(void)
{
  GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
}

/*******************************************************************************
函数名:delayus()
功能  :延时函数
输入  :us 微秒数
输出  :无
返回值:无
备注  :目前支持25us的整数倍,最小为25us,不能再小了
*******************************************************************************/
void delayus(uint16_t us)
{   
    //Set the flag to make ISR start to count
    startflag = 1;

    us = (us <= 25?25:us);

    us = us / 25 - 1;

    //  TIM4_Cmd(ENABLE);

    //Wait until expire
    while(timercnt <= us);

    //TIM4_Cmd(DISABLE);

    //Clear flag and timer cnt
    startflag = 0;
    timercnt = 0;
}


/*******************************************************************************
函数名:delayms()
功能  :延时函数
输入  :ms 毫秒数
输出  :无
返回值:无
备注  :最小为1ms
*******************************************************************************/
void delayms(uint16_t ms)
{
  uint16_t i=0;
  uint16_t j=0;

  for(i=0;i<ms;i++)
  {
    delayus(1000);
  }
}

/*******************************************************************************
函数名:main()
功能  :主函数
输入  :无
输出  :无
返回值:无
备注  : 无
*******************************************************************************/
int main(void)
{
  init_gpio();
  init_clk();
  init_timer4();
  enableInterrupts();

  while(1)
  {
    GPIO_WriteReverse(GPIOB, GPIO_PIN_5);
    delayus(50);
    //delayms(750);
  }

  return 0;
}

void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* Infinite loop */
  while (1)
  {
  }
}

午夜粪车 发表于 2019-9-15 12:02 | 显示全部楼层
/**
  * @brief Timer4 Update/Overflow Interrupt routine.
  * @param  None
  * @retval None
  */
INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */

  if(startflag == 1)
  {
    timercnt++;
  }
  TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
}
yszong 发表于 2019-9-15 12:36 | 显示全部楼层
怎么不能使用呢?
tian111 发表于 2019-9-15 12:47 | 显示全部楼层

可以直接使用;试试
songqian17 发表于 2019-9-15 12:51 | 显示全部楼层
这个固件库的吗
gongche 发表于 2019-9-15 12:53 | 显示全部楼层
为什么使用汇编语言呢
yszong 发表于 2019-9-15 12:57 | 显示全部楼层
使用nop呢?
huanghuac 发表于 2019-9-15 13:00 | 显示全部楼层
这个还真不知道怎么编写的。
yszong 发表于 2019-9-15 13:12 | 显示全部楼层
这是哪里的代码呢
jiahy 发表于 2019-9-15 13:15 | 显示全部楼层
没有见过这个演示函数。
chenho 发表于 2019-9-15 13:18 | 显示全部楼层

楼主可以使用1++这样自定义的。
bqyj 发表于 2019-9-15 13:21 | 显示全部楼层

STVD汇编OK的 16MHz
delay_1ms.l
  mov time1,#8     
delay_1ms1.l
  mov time2,#182   
delay_1ms2.l
       nop                     
        nop
        nop
        nop
        dec time2        
        jrne delay_1ms2
        dec time1        
        jrne delay_1ms1
        retf
 楼主| renyaq 发表于 2019-9-15 13:24 | 显示全部楼层
找到原因了。匹配的ms延时函数void delay_ms(u32 nms);是32位,如果调用delay_ms填的是整数,比如delay_ms(10)或者delay_ms(1000),到函数内部

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);
}
nms会溢出,基本都是6553XXXX,int型整数就变的不可知了。只有设置成u16 nms才正常
qcliu 发表于 2019-10-14 10:25 | 显示全部楼层
不懂汇编啊
tfqi 发表于 2019-10-14 11:01 | 显示全部楼层
用C语言多好
wiba 发表于 2019-10-14 11:51 | 显示全部楼层
不懂汇编语言啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部