我的程序只是使用的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的 |
求一个STM8S207例程
初次接触STM8,请问在STVD中,为什么这个Struct会报错
STMS005K6T6 如何采集内部参考电压。
stm8s003 adc中断和通道切换的问题
adc施密特触发器stm8
stm8l051f3 TSSOP20 封装,待机模式下,2天后,电流突然增加到140UA
STM8S用STVP烧录怎么加密?
如何使用ST官网例程_LIN总线通讯_STM8AF
STM8 LIN
IAR代码编辑太费劲了,想问一下有没有好的方法,试了VScode但是头文件老是报错,调了很久也没调好,想换个方法了。
今天发现一个现象,如果把时钟改换成内部时钟就没有问题,还请各位大侠帮忙看看怎么回事
{
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,不知道这个大家有什么见解