打印
[STM8]

上次问题还未解决,现把程序全部删除了,只

[复制链接]
4936|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jd9945|  楼主 | 2010-12-31 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, IO, GPIO, gp, pi
剩下几个函数了,但是现歇象依然,程序如下:我只要注释掉// GPIO_WriteHigh(GPIO_V5_CON , V5_CON);  语句,主函数中delay(7)延时就增加19%左右, 真是郁闷,望高人指点.. 附项目工程

void     InitPort(void)
{
  GPIO_Init(GPIO_V5_CON , V5_CON     ,GPIO_MODE_OUT_PP_LOW_SLOW);
  GPIO_Init(PORT_TX791 , TX791       ,GPIO_MODE_OUT_PP_LOW_SLOW);   
// GPIO_WriteHigh(GPIO_V5_CON , V5_CON);  
  GPIO_WriteLow(PORT_TX791, TX791);
  
  //System_WDRInit();
  
}



void   main(void)
{  
  SysClkSet();
  InitPort();
  sim();//关中断
  while(1)
  {
    GPIO_WriteLow(PORT_TX791, TX791);
    delay(7);
    GPIO_WriteHigh(PORT_TX791, TX791);
    delay(7);
    IWDG_ReloadCounter();
  }

}

void   SysClkSet(void)
{  
#if    1
    CLK_DeInit();
    /* Configure the Fcpu to DIV1*/
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
    /* Configure the HSI prescaler to the optimal value */
    CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
     
    /* Initilize the CLock controller according to CLK_InitStructure */
    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, DISABLE);
     
    CLK_HSECmd(ENABLE);
#endif   
}

   
/**************************************
函数名称:看门狗init
函数功能:
输入参数:
输出参数:
**************************************/
void System_WDRInit(void)
{
#if   0
  /* Enable the IWDG*/
   IWDG_Enable();
  /* Enable the access to the IWDG registers*/
  IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* Fixe IWDG Reset period */
  IWDG_SetPrescaler(IWDG_Prescaler_256);//分频
  IWDG_SetReload(0xFF);   
  /* Refresh IWDG */
  IWDG_ReloadCounter();  
#endif  
}


void    delay(u16  temp)
//void    delay(unsigned int   temp)
//void    delay(unsigned int   temp)  //单位140us for 4mhz
{                           //把它改到100us
unsigned char  i ;
while(temp-->0)
{         
           
  for(i=0;i<=80;i++);
        }
}

s704主控测试.rar

1.23 MB

沙发
ST_ARM| | 2010-12-31 09:27 | 只看该作者
对比前后两种状况时,delay函数的汇编代码是否不同。

使用特权

评论回复
板凳
jd9945|  楼主 | 2010-12-31 09:33 | 只看该作者
delay函数的汇编代码是一样的..

使用特权

评论回复
地板
ST_ARM| | 2010-12-31 09:54 | 只看该作者
主函数中有两个delay(7)延时,每个都就增加19%左右?
你用示波器抓一下两种状况,贴出来。

使用特权

评论回复
5
jd9945|  楼主 | 2010-12-31 10:09 | 只看该作者
是啊,每个都增加19%左右, 波形我想办法捕捉下来。。

使用特权

评论回复
6
jd9945|  楼主 | 2010-12-31 10:31 | 只看该作者
波形图如下

IMAGE_164.jpg (540.6 KB )

IMAGE_164.jpg

IMAGE_165.jpg (525.62 KB )

IMAGE_165.jpg

使用特权

评论回复
7
jd9945|  楼主 | 2010-12-31 11:09 | 只看该作者
我把程序从IAR移到STVD后现象依旧,只时延时时间变长了点。。。

使用特权

评论回复
8
ST_ARM| | 2010-12-31 11:16 | 只看该作者
好像问题出在你的时钟初始化上:
void   SysClkSet(void)
{  
#if    1
    CLK_DeInit();
    /* Configure the Fcpu to DIV1*/
    CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);

    /* Configure the HSI prescaler to the optimal value */
    CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
     
    /* Initilize the CLock controller according to CLK_InitStructure */
    CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, DISABLE);
     
    CLK_HSECmd(ENABLE);
#endif   
}
好像你使用的是外部晶振作为主时钟,但是初始化流程不对。
请详细阅读STM8的Clock章节了解一下STM8 的时钟初始化配置流程。

使用特权

评论回复
9
ST_ARM| | 2010-12-31 11:24 | 只看该作者
另外你的项目中为什么用FWLib.a而不直接用源代码?那个文件是否是最新软件库编译出来的?

使用特权

评论回复
10
jd9945|  楼主 | 2010-12-31 11:48 | 只看该作者
谢谢你的回复,是用外部时钟,我用CCO引脚测试过FCPU FMASTER等时钟信号,输出都是对的..  PWLIB.a也是从原代码进行编译后产生的的库文件加载到该工程中去的. 我上传的工程文件中里已经含有库程序的原代码,

使用特权

评论回复
11
ST_ARM| | 2010-12-31 12:07 | 只看该作者
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, DISABLE);      
    CLK_HSECmd(ENABLE);
这两句的顺序是否正确?

使用特权

评论回复
12
jd9945|  楼主 | 2010-12-31 12:08 | 只看该作者
我把SysClkSet时钟设置去掉了,用内部2MHZ的RC,现在也是一样,也会变长....

使用特权

评论回复
13
ST_ARM| | 2010-12-31 12:17 | 只看该作者
那么说明问题出在FWLIB.a里,你使用的GPIO_WriteHigh(GPIO_V5_CON , V5_CON);  是在这个文件里,用源代码编译试一试。

使用特权

评论回复
14
jd9945|  楼主 | 2011-1-4 10:15 | 只看该作者
我已经没有用GPIO_WriteHigh库函数了, 用寄存器操作方式也是一样啊..
我还把程序移到三合一板上试了一样,两款芯片(型号不一样)结果现象是一样... 顾闷死了.

使用特权

评论回复
15
STM32W108| | 2011-1-4 10:36 | 只看该作者
楼上发个三合一能用的 测试工程。

使用特权

评论回复
16
jd9945|  楼主 | 2011-1-4 10:48 | 只看该作者
不行, 上面的工程是stm8s208rb  , 要把型号改一下,就可以用了三合一上用了.

使用特权

评论回复
17
jd9945|  楼主 | 2011-1-4 10:56 | 只看该作者
上面的工程是在iar环境中测试的.我还用原三合一网上下载的stm8\STM8_Miniki_Docs\Sinwave例程在stvd环境中, 在void GPIO_Init(void) 增加了
          PA_DDR |= 0x10;              /* Output.                  */
    PA_CR1 |= 0x10;              /* PushPull.                */
    PA_CR2  = 0x00;              /* Output speed up to 2MHz. */
               
                 _asm("nop");
     _asm("nop");




void    delay(unsigned int  temp)
//void    delay(unsigned int   temp)
//void    delay(unsigned int   temp)  //单位140us for 4mhz
{                           //把它改到100us
        unsigned char  i ;
        while(temp-->0)
        {         
           
                for(i=0;i<=80;i++);
        }
}


主程序
while(1)
{
// LED_Control(0x08);
                 
                PA_ODR&= (unsigned char )(~0x10);
                   //GPIO_WriteLow(PORT_TX791, TX791);  
    delay(7);
                PA_ODR|= (unsigned char)0x10;
   //GPIO_WriteHigh(PORT_TX791, TX791);  
    delay(7);
}

只要把 GPIO_Init函数中_asm("nop");     _asm("nop"); 增减则测试PA4口输出频率就会发生变化,

使用特权

评论回复
18
STM32W108| | 2011-1-4 13:50 | 只看该作者
本帖最后由 STM32W108 于 2011-1-4 13:57 编辑

用IAR STM8 1.2试了下:
asm("nop")加不加,延时都是一样的。

#include <iostm8.h>         
#include <intrinsics.h>

void GPIO_Init(void)
{   
    PA_DDR |= 0x10;              /* Output.                  */
    PA_CR1 |= 0x10;              /* PushPull.                */
    PA_CR2  = 0x00;              /* Output speed up to 2MHz. */
               
    asm("nop");
    asm("nop");   
}

void CLK_Init(void)
{
    CLK_CKDIVR &= ~0x10;          /* 01: fHSI= fHSI RC output/2. */
    CLK_CKDIVR |= 0x01;           /* 001: fCPU=fMASTER/2. */
}

void  delay_us_100(unsigned int  temp)    //延时,单位100us
{                           
        unsigned int  i ;
        while(temp-->0)
        {                    
           for(i=0;i<49;i++)
           asm("");
        }
}

void main ( void )
{   
    CLK_Init();
    GPIO_Init();
    while(1)
   {

    PA_ODR&= (unsigned char )(~0x10);
    delay_us_100(10);     //实测1.00ms
     
    PA_ODR|= (unsigned char)0x10;
    delay_us_100(10);     //实测1.00ms
   }
}

stm8_io.rar

8.1 KB

使用特权

评论回复
19
jd9945|  楼主 | 2011-1-4 14:44 | 只看该作者
兄弟,用你的程序试了一下, 只要在void GPIO_Init(void) 程序中增加10个nop指令,频率就会从495hz变成442hz,其余的都不动

   PA_DDR |= 0x10;              /* Output.                  */
    PA_CR1 |= 0x10;              /* PushPull.                */
    PA_CR2  = 0x00;              /* Output speed up to 2MHz. */
               
    asm("nop");
    asm("nop");   
   
    asm("nop");
    asm("nop");  
    asm("nop");
    asm("nop");
    asm("nop");
   
    asm("nop");  
    asm("nop");
    asm("nop");  
    asm("nop");
    asm("nop");

使用特权

评论回复
20
STM32W108| | 2011-1-4 15:28 | 只看该作者
貌似与指令对其有关:
      
        NAME   delay_us_100_s
        EXTERN ?b0
        public delay_us_100
        
        
        SECTION `.far_func.text`:CODE:REORDER:NOROOT(3)
        CODE
//   45 void  delay_us_100(unsigned int  temp)  [url=]//@0x8010[/url]
//   46 {                           
delay_us_100:
        TNZW      X
        JRNE      L:??delay_us_100_0
//   47         unsigned int  i ;
//   48         while(temp-->0)
//   49         {                    
//   50            for(i=0;i<49;i++)
//   51            {
//   52                asm("");
//   53               //asm("nop");  
//   54               //asm("nop");
//   55               //asm("nop");  
//   56               //asm("nop");
//   57              // asm("nop");
//   58            }
//   59         }
//   60 }
??delay_us_100_1:
        RETF
??delay_us_100_2:
        TNZW      X
        JREQ      L:??delay_us_100_1
??delay_us_100_0:
        DECW      X
        LD        A, #0x31
        LD        S:?b0, A
??delay_us_100_3:
        LD        A, S:?b0
        ADD       A, #0xff
        LD        S:?b0, A
        CLR       A
        CP        A, S:?b0
        JREQ      L:??delay_us_100_2
        JRA       L:??delay_us_100_3
//   61
      
      
       end
楼主再试试。

stm8_io.rar

27.12 KB

使用特权

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

本版积分规则

26

主题

84

帖子

0

粉丝