我的程序只是使用的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的 |
测试标签123
IAR FOR ARM和IAR FOR STM8无法共存,
STM8L052,液晶内部电源怎么用?
STM8S103飞线外接芯片,I2C不能得到slaveAddress应答,通讯失败。
STM8S105C6T6 UART2串口,能接收数据,不能发送数据
STM8S105K4 串口2 无奇偶校验,也能接收 偶校验的 数据
在STM8S的IAP使用中断和APP使用中断问题
STM8L151 SMBUS设计
STM8S103F复位异常
STM8L的LCD调试时不亮
今天发现一个现象,如果把时钟改换成内部时钟就没有问题,还请各位大侠帮忙看看怎么回事
{
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进行解锁和上锁,但是他就行了,不知道各位大侠有什么解释啊
{
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,不知道这个大家有什么见解