STM8S207RB 每次下载前必须用STVP修改选项字才能下载
我的程序只是使用的W5500的程序,其他什么都没开,每次下载前都必须用STVP修改选项字,才能再次下载,我进行一步步试验,发现程序中只要加入下面这些,程序运行后,再次下载时就必须STVP修改选项字。memset(&W5500Object.W5500Inf,0,sizeof(W5500Object.W5500Inf)); /* 将W5500Inf全部清零*/ memcpy(W5500Object.W5500Inf.IPAddr,W5500IPAddr,sizeof(W5500IPAddr)); /* 将IP地址写入W5500Inf中 */memcpy(W5500Object.W5500Inf.GWIPAddr,W5500GWIPAddr,sizeof(W5500GWIPAddr)); /* 将网关IP地址写入W5500Inf中 */
memcpy(W5500Object.W5500Inf.MASKAddr,W5500IPMask,sizeof(W5500IPMask)); /* 将子网掩码写入W5500Inf中 */
上面这些语句只是对一个结构体进行清零和部分赋值,这些操作为啥会造成这种现象,而且我把整个W5500的初始化加入其中,还会有一奇怪的现象,就是我运行时,时钟那边经常性会运行不过去,就在时钟自动切换的时候
while (!CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE,\
CLK_CURRENTCLOCKSTATE_DISABLE));
/*切换到外部时钟,并等待时钟却换成功*/
各位大侠,麻烦尽快帮忙解决下,多谢多谢,本来初接触STM8S的东西,以前只弄过STM32的
没人遇到过这样的问题吗????
帮顶 把目录换成英文的试试看。。。目录深度是不是太大了 目录全部改成英文试过还是一样的效果,不能解决问题!
今天发现一个现象,如果把时钟改换成内部时钟就没有问题,还请各位大侠帮忙看看怎么回事 解决了,各位!但是具体原因我还没搞清楚,是时钟设置问题,void SystemClock_Init(SystemClock_TypeDef sysclk)
{
if(sysclk==HSE_Clock)/*选用外部时钟*/
{
#ifdef DEBUG
HSE_ClockStartUpConfiguration(HSE_24MHz,HSECNT_8CLK);
#endif
while (!CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE,\
CLK_CURRENTCLOCKSTATE_DISABLE));
/*切换到外部时钟,并等待时钟却换成功*/
}
else
{
#ifdef DEBUG
DefaultSystemClockForHSI();
#endif
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
}
}
我这么设置时,就会出现问题。但是
static void CLK_Config(void)
{
/* Initialization of the clock */
CLK_DeInit();
Set_Flash_wait_OptionByte();
/* Configure the Fcpu to DIV1*/
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SWIMConfig(CLK_SWIMDIVIDER_2);
// CLK_HSECmd(ENABLE);
// while((CLK->ECKR & 0x02) == 0x00); // 等待外部高速振荡器准备好
/* Configure the HSI prescaler to the optimal value */
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);
/* Configure the system clock to use HSE clock source and to run at 24Mhz */
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE);
}
void Set_Flash_wait_OptionByte(void)
{
uint16_t Flash_wait_Option_status;/*记录访问flash等待状态,为了调使用的*/
Flash_wait_Option_status=FLASH_ReadOptionByte(Flash_wait_OptionAddr);
/*Flash_wait_Option_status是一个16位,bit15~8的高8为,是Flash_wait_OptionAddr
地址的数据,其中bit15~9是保留的,因此是0,如果bit8是1,则表明访问flash要1一个周期的
访问周期,bit7~0的数据是Flash_wait_OptionAddr+1地址数据,跟bit15~8的数据是相反的,
在STM8里面,如果你使用外部时钟大于16M,小于24M的话,访问flash必须要配置Flash插入一个等待周期*/
//printf("\r\nWAITSATATE状态:0x%X\r\n",Flash_wait_Option_status);
if((Flash_wait_Option_status&0x0100)==FALSE)
FLASH_ProgramOptionByte(Flash_wait_OptionAddr,FLASHWAITSTATE);
}
这么设置时就可以!真搞不明白,下面这个写选项字都没对FLASH进行解锁和上锁,但是他就行了,不知道各位大侠有什么解释啊 上面解决方法错误,问题持续出现。最终解决方法是:STM8S最好不要用24M时钟,使用外部24M时钟需要增加一个FLASH操作等待周期,在STM8里面,如果你使用外部时钟大于16M,小于24M的话,访问flash必须要配置Flash插入一个等待周期,这个修改OPTION BYTE容易出错,最好的方法就是用STVP先把OPTION BYTE下载下去,然后再下程序 程序里面修改选项字,是容易出问题的,最好是用STVP下载,如果一定要程序修改的话,一定要加上判断(先读取选项字,看是否已经修改了,没有的话再修改),选项字只用修改一次。 void Set_Flash_wait_OptionByte(void)
{
uint16_t Flash_wait_Option_status;/*记录访问flash等待状态,为了调使用的*/
Flash_wait_Option_status=FLASH_ReadOptionByte(Flash_wait_OptionAddr);
if((Flash_wait_Option_status&0x0100)==FALSE)
FLASH_ProgramOptionByte(Flash_wait_OptionAddr,FLASHWAITSTATE);
}
我已经读取了状态进行判别了,还是不行,我还找到一种说法,在修改选项字节的时候是否要先解锁FLASH,修改完了之后需要上锁FLASH,不知道这个大家有什么见解 我遇到过相同的提示..不过是调试器问题..重新插拔一下调试器就OK了..................
页:
[1]
2