打印
[STM8]

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

[复制链接]
1405|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cronus2|  楼主 | 2018-3-10 13:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
之前按asm(nop);改的延时函数,时间不准。找正点原子写得汇编延迟改程序,编译都能过,就是延时不能运行,开在开头。把整个汇编拆开写,编译就提示DELAY_XUS,DELAY_US_1没有定义。其他人也有不能运行的。原因有没顶左边起始的,未设置正确频率的,我都没有。但是就是不能运行。能帮看看吗?谢了


延时函数.jpg (103.53 KB )

延时函数.jpg
沙发
antusheng| | 2018-3-10 17:22 | 只看该作者
可能你汇编用到的那些寄存器里面有C的数据。

使用特权

评论回复
板凳
antusheng| | 2018-3-10 17:24 | 只看该作者
楼主不如直接用C写啊,配合定时器。

使用特权

评论回复
地板
antusheng| | 2018-3-10 17:24 | 只看该作者
#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)
  {
  }
}

使用特权

评论回复
5
antusheng| | 2018-3-10 17:25 | 只看该作者
/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] 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);
}

使用特权

评论回复
6
xietingfeng| | 2018-3-11 22:41 | 只看该作者
怎么不能使用呢?

使用特权

评论回复
7
suzhanhua| | 2018-3-11 22:42 | 只看该作者
可以直接使用;试试

使用特权

评论回复
8
hellosdc| | 2018-3-11 22:44 | 只看该作者
这个固件库的吗

使用特权

评论回复
9
uiint| | 2018-3-11 22:44 | 只看该作者
为什么使用汇编语言呢

使用特权

评论回复
10
xietingfeng| | 2018-3-11 22:45 | 只看该作者
使用nop呢?

使用特权

评论回复
11
suzhanhua| | 2018-3-11 22:45 | 只看该作者
这个还真不知道怎么编写的。

使用特权

评论回复
12
mituzu| | 2018-3-11 22:45 | 只看该作者
这是哪里的代码呢

使用特权

评论回复
13
hellosdc| | 2018-3-11 22:45 | 只看该作者
没有见过这个演示函数。

使用特权

评论回复
14
uiint| | 2018-3-11 22:45 | 只看该作者
楼主可以使用1++这样自定义的。

使用特权

评论回复
15
qioby| | 2018-3-12 17:22 | 只看该作者
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

使用特权

评论回复
16
cronus2|  楼主 | 2018-3-13 10:36 | 只看该作者
找到原因了。匹配的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才正常

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

94

帖子

2

粉丝