TAG批量烧写程序仪器制作
制作这个是为了批量给TAG烧录程序,通过给多个TAG烧录程序的实验发现,TAG上烧录程序的四个接口VCC,SDA,GND,SLK,在烧录程序时只需要切换SDA线就可以,其他三根线可以作为公共线。所以想的是用50个小型继电器来定时依次切换SDA线,然后通过STM8脱机烧录器做定时下载。
具体功能:按下开始,气泵下压使50pcs电路板的四个下载口与夹具上的顶针贴合,LCD显示屏上显示正在下载哪一个TAG,在五十个下载完毕后,显示屏上将那些下载失败的TAG编号显示出来,然后气泵上升。如此完成一个循环。
主要硬件:STM32,LCD,74HC154,电磁阀,5V继电器,12V继电器,117-3.3V,STM8脱机烧录器。
主要思路:让STM8脱机烧录器处于等待下载的情况,将烧录器VCC,GND,SLK三个引脚与50pcs电路板的VCC,GND,SLK相连,SDA与继电器的常开脚相连,STM32上电后,给通过控制I/O的高低电平来让74HC154的某一引脚处于高电平,其他引脚处于低电平,这样使某一继电器就会吸合让SDA线导通,让STM8脱机烧录器会开始烧录程序,程序下载完毕后,通过脱机烧录器的串口告知MCU程序是否下载完毕,MCU得到消息后会显示这一编号的电路板下载成功并切换I/O的高低电平,换到下一个继电器,STM8脱机烧录器等待2s后继续开始烧录程序。若STM32的I/O切换高低电平后3s没有收到脱机烧录器发来的烧录成功的回答,则会记录下这一个电路板的编号,并在LCD上显示出此编号下载失败。然后继续切换I/O控制下一个继电器。依次控制完50个之后就会将之前下载失败的在LCD上全部显示出来。
硬件方面打板次数3次
第一次打板时做的也很拥挤,会使50个继电器焊接不方便,这一次打板想的是将VCC,SDA,GND,SLK四根线与顶针的另一端通过杜邦线相连,所以板子做的很小,但是发现链接杜邦线的话会有两百根杜邦线相连,非常不方便。
第二次打板时做了一个转接板,将顶针另一端全部插入转接板上,然后通过转接板上的走线将三个公共线全部相连引到排针处,SDA线单独引到排针处,然后在功能板上相对应的位置放上排针母座,这样可以减少第一次的转接杜邦线的麻烦。
第三次打板是TAG工艺改了,使拼版间距变了,必须重新找到各个下载口的位置。
软件方面遇到的问题和学习的地方。
1:第一次焊接完毕上电后发现50个继电器疯狂乱跳,检查硬件电路发现没问题,之后测电压74HC154的一些引脚电压时钟无法拉低。在这个地方找原因陆陆续续浪费了5天的时间,最后才发现STM32程序初始化里面我是先将JTAG接口设置为I/O再开I/O时钟的,这里出点步骤错误导致导致花费了很长的时间。
2:因为LCD显示的是字符,而我程序里的存储的每一个元素都是数字,这里涉及到一个数字转字符的过程和数据存储的过程,因为最后要将字符输出,如下图所示
display_string_8x16(1,1,"downloading "); 输出 downloading
display_string_8x16(1,108,Downloading_Num); 输出指针 Downloading_Num 指向的地址的内容
因为指针Downloading_Num 所在的地址存储的内容肯定不止一个字符,所以需要为Downloading_Num 分配一个连续的指定大小的内存块区域,这里用到了malloc函数
malloc函数,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
使用方法:
char *Downloading_Num, //定义指针类型
No_Downloading_Num=(char*)malloc(10);//给Downloading_Num分配10个字符的存储空间并定义为char型
具体函数
if(Down[0]>=10)
{
i=0;
*(Downloading_Num+i) = '0'+Down[0]/10;
*(Downloading_Num+1+i) = '0'+Down[0]%10;
*(Downloading_Num+2+i) = ' '
原理图
1.MCU原理图
2.继电器部分原理图
程序下载:https://download.****.net/download/liaotanzhuangc8953/10567432