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

[复制链接]
1755|15
 楼主| cronus2 发表于 2018-3-10 13:16 | 显示全部楼层 |阅读模式
之前按asm(nop);改的延时函数,时间不准。找正点原子写得汇编延迟改程序,编译都能过,就是延时不能运行,开在开头。把整个汇编拆开写,编译就提示DELAY_XUS,DELAY_US_1没有定义。其他人也有不能运行的。原因有没顶左边起始的,未设置正确频率的,我都没有。但是就是不能运行。能帮看看吗?谢了


延时函数.jpg
antusheng 发表于 2018-3-10 17:22 | 显示全部楼层
可能你汇编用到的那些寄存器里面有C的数据。
antusheng 发表于 2018-3-10 17:24 | 显示全部楼层
楼主不如直接用C写啊,配合定时器。
antusheng 发表于 2018-3-10 17:24 | 显示全部楼层
  1. #include"stm8s.h"


  2. uint8_t startflag = 0;
  3. uint16_t timercnt = 0;


  4. /*******************************************************************************
  5. 函数名;init_clk()
  6. 功能  :初始化系统时钟
  7. 输入  :无
  8. 输出  :无
  9. 返回值:无
  10. 备注  :无
  11. *******************************************************************************/
  12. void init_clk(void)
  13. {
  14.       //初始化时钟
  15.   CLK_HSICmd(ENABLE);//开始内部高频RC
  16.   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//不分频
  17.   CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
  18. }

  19. /*******************************************************************************
  20. 函数名:init_timer4()
  21. 功能  :初始化timer4
  22. 输入  :无
  23. 输出  :无
  24. 返回值:无
  25. 备注  :无
  26. *******************************************************************************/
  27. void init_timer4(void)
  28. {

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

  34. /*******************************************************************************
  35. 函数名:init_gpio()
  36. 功能  :初始化GPIO
  37. 输入  :无
  38. 输出  :无
  39. 返回值:无
  40. 备注  :无
  41. *******************************************************************************/
  42. void init_gpio(void)
  43. {
  44.   GPIO_Init(GPIOB, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);
  45. }

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

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

  59.     us = us / 25 - 1;

  60.     //  TIM4_Cmd(ENABLE);

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

  63.     //TIM4_Cmd(DISABLE);

  64.     //Clear flag and timer cnt
  65.     startflag = 0;
  66.     timercnt = 0;
  67. }


  68. /*******************************************************************************
  69. 函数名:delayms()
  70. 功能  :延时函数
  71. 输入  :ms 毫秒数
  72. 输出  :无
  73. 返回值:无
  74. 备注  :最小为1ms
  75. *******************************************************************************/
  76. void delayms(uint16_t ms)
  77. {
  78.   uint16_t i=0;
  79.   uint16_t j=0;

  80.   for(i=0;i<ms;i++)
  81.   {
  82.     delayus(1000);
  83.   }
  84. }

  85. /*******************************************************************************
  86. 函数名:main()
  87. 功能  :主函数
  88. 输入  :无
  89. 输出  :无
  90. 返回值:无
  91. 备注  : 无
  92. *******************************************************************************/
  93. int main(void)
  94. {
  95.   init_gpio();
  96.   init_clk();
  97.   init_timer4();
  98.   enableInterrupts();

  99.   while(1)
  100.   {
  101.     GPIO_WriteReverse(GPIOB, GPIO_PIN_5);
  102.     delayus(50);
  103.     //delayms(750);
  104.   }

  105.   return 0;
  106. }

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

antusheng 发表于 2018-3-10 17:25 | 显示全部楼层
  1. /**
  2.   * [url=home.php?mod=space&uid=247401]@brief[/url] Timer4 Update/Overflow Interrupt routine.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23)
  7. {
  8.   /* In order to detect unexpected events during development,
  9.      it is recommended to set a breakpoint on the following instruction.
  10.   */

  11.   if(startflag == 1)
  12.   {
  13.     timercnt++;
  14.   }
  15.   TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
  16. }
xietingfeng 发表于 2018-3-11 22:41 | 显示全部楼层
怎么不能使用呢?
suzhanhua 发表于 2018-3-11 22:42 | 显示全部楼层
可以直接使用;试试
hellosdc 发表于 2018-3-11 22:44 | 显示全部楼层
这个固件库的吗
uiint 发表于 2018-3-11 22:44 | 显示全部楼层
为什么使用汇编语言呢
xietingfeng 发表于 2018-3-11 22:45 | 显示全部楼层
使用nop呢?
suzhanhua 发表于 2018-3-11 22:45 | 显示全部楼层
这个还真不知道怎么编写的。
mituzu 发表于 2018-3-11 22:45 | 显示全部楼层
这是哪里的代码呢
hellosdc 发表于 2018-3-11 22:45 | 显示全部楼层
没有见过这个演示函数。
uiint 发表于 2018-3-11 22:45 | 显示全部楼层
楼主可以使用1++这样自定义的。
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
 楼主| 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

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