这块新的板子基本采用上个板子一样的设计,而且电阻电容基本没有什么变化,但是在焊接好板子,使用上个板子的程序时,却发生了flash timeou问题,这个如何解决?
网上提示说,可能是芯片锁了,需要作用st-link utility,但是显示无法连接上,一起报can’t connect错误。这篇文章提示说可能是重置模式问题,需要修改重置模式为software system reset;同时提到这种情况适用于st-link能够连接,这个情况符合我这个板子的情况。只是奇怪这里的device为什么不是stm32f10x系列,而是stm32f05x/f030x8。
程序可以正常烧录,但是led灯并没有点亮,而烧录到另一个板子中就能够正常工作,所以还是这个板子本身的硬件问题。接下来打算考虑看看gpio的变化,从而判断芯片本身是否有问题,减少led问题的可能。其次,考虑芯片起振问题是否影响程序?
st-link utility能够下载程序,但是这个板子无法用梦源的逻辑分析仪分析出PB12的GPIO口的电平变化。同时keil仍然无法下载程序,并且产生新的debug session错误,如下图。结果表明是当时正在连接st-link utility所致。其次,我断开SWDIO的电源和地后,想要确认这个电压是没问题,用之间锂电池时显示正常3.3v电压。但是出现了intenal command error错误,重新接回线后,恢复正常。
这篇文章提示电源和晶振两个方面问题,由于使用万用表测过节点电压为3.3v,这晶振可能是潜在的问题,考虑到这次的板子确实重置电路发生的调整,所以可能这个变化是影响也不是不可能。图一为正常运行板子的重置走线。图二是改动后的重置电路走线。
stm32F103RET6晶振不起振,程序能下载进去。这篇文章提醒我可能是晶振问题或者是焊锡膏问题。考虑到需要首先确认晶振的问题,我觉得有必要使用stm32内部晶振解决,或者使用示波器看看晶振是否起振。
使用别人的例程,尝试开启内部时钟,没想到程序动都不动,真是奇怪。这篇文章提供启示,我在此基础上添加了flash相关的代码,程序可以正确运行了。
void SystemInit(void)
{
RCC_DeInit();//将外设 RCC寄存器重设为缺省值
RCC_HSICmd(ENABLE);//使能HSI
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功
//加上这两句才能到64M
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //FLASH半周期访问
// FLASH_SetLatency(FLASH_Latency_2); //设置代码延时值
/* Enable Prefetch Buffer */
FLASH->ACR |= FLASH_ACR_PRFTBE;
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PCLK2Config(RCC_HCLK_Div1);
//设置 PLL 时钟源及倍频系数
RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_10);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE
//此处不能太高,我刚开始设置50多,系统都无法运行。
RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能
//等待指定的 RCC 标志位设置成功 等待PLL初始化成功
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//设置系统时钟(SYSCLK) 设置PLL为系统时钟源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟
//等待PLL成功用作于系统时钟的时钟源
// 0x00:HSI 作为系统时钟
// 0x04:HSE作为系统时钟
// 0x08:PLL作为系统时钟
while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
}
需要注意的是这篇文章提到修改时钟涉及到flash外设,所以需要添加stm32f10x_flash.c文件。
值得注意的是,板子的led变化频率产生一种变化
在切换了内部时钟程序后,keil仍然出现flash timeout问题。通过st-link utility下载好程序后,板子没有任何反应。这个似乎说明晶振没有问题,可能是其它问题造成。
万用表分别测量晶振两端的电压,显示为0.025V,非常小。但是实际理想晶振值为0.5VDD,说明晶振没有正常起振,晶振是没有正常工作的。
晶振起振需要什么条件?这篇文章提醒晶振起振的影响因素和正常起振下的特点。
外部晶振会导致无法下载程序这篇文章提醒,虽然stm32程序没有使用外部晶振,但是晶振无法起振仍然会影响实际芯片的初始化流程等。
stm32F103RET6晶振不起振,程序能下载进去这篇文章提醒,焊锡膏本身的化学作用也会影响晶振起振,所以需要清理板子。确实上个板子直接使用锡线。【我的板子能够正常连接st-link,但是无法通过keil下载程序,只能通过st utility下载程序。但是下载的程序无法运行。】
晶振仍然无法起振,于是直接把晶振卸下。
考虑到板子下载程序过程中,右下角的显示为erase,然后就会跳出flash timeout。所以如果问题一起无法解决,可以考虑了解下flash下载流程,并反推板子问题的问题可能出现在哪儿。keil下载程序具体过程4可以提供相关流程说明。
之前的板子卸下晶振,但是板子仍然能够正常下载程序,这说明这次的绿板的flash timeout问题晶振应该不是问题的关键。可以看到如果我把晶振卸下,led就不会发生变化,但是放上去之后,led又正常亮灭【晶振卸下后,直接放在上面,没有焊接】。万用表探头放上去后,led停止闪烁,但是万用表的电压显示2V左右,说明还是起振了,虽然电压值有点不同。
在现象1中我就注意到utility识别出的device family有点奇怪,跟我的实际器件有点不符。刚刚突然发现,自己一起搞错了自己用的stm32器件。我又看了下淘宝网页,购买的也确实是stm32f051。之所以st-link utility能够直接下载程序就是这个软件能够直接识别器件类型,但是keil上需要在option中配置,所以无法直接下载。这也可以理解为什么无法erase,因为keil的下载已经搞错device了。
考虑到现在使用的芯片是stm32f051,我查看了它的引脚图后,发现除了PF7和PF6不是电源引脚外,其它基本引脚没有什么不同【普通引脚接上电容也没有什么问题】。所以可以考虑直接在这个芯片上运行stm32f051相关的程序就行,可以考虑用cubemx生成模板,不用自己一点点配置。
我直接用cubeMx生成了stm32f051的keil工程,直接下载成功。cubeMx的图形化配置界面确实好用,我使用内部晶振的操作都没有花费什么时间。不像之间需要修改stm32的系统文件,比较麻烦还容易出错。这提醒我需要主动拥抱cubeMx,虽然HAL相关语法让人有点陌生,但是至少能够减少许多初始化配置的工作量。编程语言的学习只是一个熟能生巧 的过程。
总之,flash timeout问题出现的原因是我弄错了芯片名,有点乌龙;上次紫色板子的问题则是我弄错了引脚映射。虽然这些错误都耗费了比较多时间,但是这个过程中我不断定位错误,发掘出了许多新的定位 错误方法,比较使用utility、cubeMx;了解晶振起振的一些内容。这些过程本身都会成为经验的一部分,都是值得的。
比较搞笑的是,stm32f051没有CAN外设,所以如果我还想使用这个板子进行CAN通信相关的测试,就只能换个芯片了;或者只是用这个板子上的CAN引脚接口,毕竟这个板子本来就是用于实现这个手牵手连接。虽然不能使用里面的can外设,但是可以使用其中的CAN螺钉端子。CAN-bus总线现场布线与接口设计及电缆与连接器选择