CN111857742A - 一种在苹果电脑os x系统下串口烧录stm32单片机的方法 - Google Patents
一种在苹果电脑os x系统下串口烧录stm32单片机的方法 Download PDFInfo
- Publication number
- CN111857742A CN111857742A CN202010506930.XA CN202010506930A CN111857742A CN 111857742 A CN111857742 A CN 111857742A CN 202010506930 A CN202010506930 A CN 202010506930A CN 111857742 A CN111857742 A CN 111857742A
- Authority
- CN
- China
- Prior art keywords
- serial port
- burning
- apple computer
- terminal
- chip microcomputer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
- G06F8/63—Image based installation; Cloning; Build to order
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Read Only Memory (AREA)
Abstract
本发明提供了一种步骤简单、操作方便且成本低的在苹果电脑OS X系统下串口烧录STM32单片机的方法。本发明方法包括以下步骤:(1)将板卡上面的MCU芯片设置到烧录模式;(2)打开苹果电脑自带的终端软件,将工具拖进去终端,再将串口名复制进终端,最后将要烧录的固件也拖进终端,按回车键运行;(3)苹果电脑上的终端软件运行时,终端软件获取到的第一个参数作为串口去打开,第二个参数作为文件去打开,终端软件打开串口后,发送7F指令,让单片机进入UART模式,再发送指令获取指令集,根据擦除模式来擦除芯片;(4)擦除成功后,就将要烧录的固件分包,将每个包写入芯片对应的地址,结束烧录。本发明可应用于电子设备领域。
Description
技术领域
本发明涉及电子设备领域,尤其涉及一种在苹果电脑OS X系统下串口烧录STM32单片机的方法。
背景技术
目前整个行业都是使用Windows系统和Linux系统开发STM32单片机的FW(固件),网上也有很多对应的下载工具。但是对于OS X系统,因为使用的少,意法半导体等企业没有提供工具,网上也没有类似的工具。目前市面上没有运行在苹果电脑OS X系统下的对STM32单片机使用串口烧录的较好办法。
而现场只有苹果电脑或者非Windows系统和Linux系统的设备的情况下,需要对STM32单片机使用串口烧录则无法实现。为了改变这种情况,需要设计一种在OS X系统下串口烧录STM32单片机的的方法。
发明内容
本发明所要解决的技术问题是克服现有技术的不足,提供一种步骤简单、操作方便且成本低的在苹果电脑OS X系统下串口烧录STM32单片机的方法。
本发明所采用的技术方案是,该方法中,STM32单片机设置在产品的板卡上作为MCU芯片,本发明方法包括以下步骤:
(1)将板卡上面的MCU芯片设置到烧录模式:将MCU芯片的BOOT引脚拉高,再将MCU进行复位,并使用USB转串口线连接到苹果电脑;
(2)运行工具:打开苹果电脑自带的终端软件,将工具拖进去终端,再将串口名复制进终端,最后将要烧录的固件也拖进终端,按回车键运行;
(3)苹果电脑上的终端软件运行时,终端软件获取到的第一个参数作为串口去打开,第二个参数作为文件去打开,终端软件打开串口后,发送7F指令,让单片机进入UART模式,再发送指令获取指令集,判断支持的擦除模式,根据擦除模式来擦除芯片;
(4)擦除成功之后,就将要烧录的固件按128字节的大小进行分包,将每个包写入芯片对应的地址,返回成功之后,当就提示用户烧录成功时,结束烧录。
进一步地,所述步骤(2)中,所述工具为命令行软件工具。
再进一步地,所述步骤(2)中,所述固件的文件格式为Bin格式文件。
又进一步地,所述工具的编写语言为C语言,编译工具为Xcode Version 11.3.1(11C504),在OS X 10.15.4 (19E266)的运行环境下运行。
本发明的有益效果是:通过上述简单的方法,首先设置好MCU芯片处于烧录模式,然后通过开启苹果电脑上自带的软件,将设置好的工具和固件均拖入软件中并运行,再配置成UART模式将MCU芯片内的原有的内容擦除掉,然后将将要烧录的固件分包写入MCU芯片相应的地址,实现烧录,可见本发明方法步骤简单,操作方便,且无需其它额外的设备辅助,即可实现在苹果电脑OS X系统下串口烧录STM32单片机,大大地节省了成本,也提高了烧录速度。
具体实施方式
本发明方法中,该方法中,STM32单片机设置在产品的板卡上作为MCU芯片,该方法包括以下步骤:
(1)将板卡上面的MCU芯片设置到烧录模式:将MCU芯片的BOOT引脚拉高,再将MCU进行复位,并使用USB转串口线连接到苹果电脑。
(2)运行工具:打开苹果电脑自带的终端软件,将工具拖进去终端,再将串口名复制进终端,最后将要烧录的固件也拖进终端,按回车键运行,在这里,所述固件的文件格式为Bin格式文件。
(3)苹果电脑上的终端软件运行时,终端软件获取到的第一个参数作为串口去打开,第二个参数作为文件去打开,终端软件打开串口后,发送7F指令,让单片机进入UART模式,再发送指令获取指令集,判断支持的擦除模式,根据擦除模式来擦除芯片。
(4)擦除成功之后,就将要烧录的固件按128字节的大小进行分包,将每个包写入芯片对应的地址,返回成功之后,当就提示用户烧录成功时,结束烧录。
本发明中,所述工具的编写语言为C语言,编译工具为Xcode Version 11.3.1(11C504),在OS X 10.15.4 (19E266)的运行环境下运行。
所述步骤(2)中,所述工具为命令行软件工具。其代码实现如下。
// main.c
// Flash_Loader
//
// Created by Xin.Zhang on 14/4/2020.
// Copyright © 2020 Xin.Zhang. All rights reserved.
//
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
#define FALSE 1
#define TRUE 0
int Serial_Driver;
#define GetComnmand 0x00
#define GetVersion 0x01
#define GetID 0x02
#define WriteMemory 0x31
#define Readprotect 0x82
#define ReadUnprotect 0x92
#define Erase_Cmd 0x43
#define Extended_Erase 0x44
#define ACK 0x79
#define NACK 0x1f
int speed_arr[] = { B38400, B115200, B19200, B9600, B4800, B2400, B1200,B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 115200, 19200, 9600, 4800, 2400, 1200, 300,38400, 19200, 9600, 4800, 2400, 1200, 300, };
void Add_XOR_Value(uint8_t *buff,uint8_t Len)
{
uint8_t *p_buff=buff;
uint8_t XOR_Value=0xff;
if (Len==1)
{
XOR_Value=XOR_Value ^ *p_buff;
p_buff++;
}
else
{
XOR_Value=*p_buff;
p_buff++;
for (int i = 0; i < Len-1; ++i)
{
XOR_Value=XOR_Value ^ *p_buff;
p_buff++;
}
}
*p_buff=XOR_Value;
}
void set_speed(int fd, int speed) //Linux 下串口USB等设备通信编程入门2中有终端属性的获取设置函数
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);//Update the options and do it NOW
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7; break;
case 8:
options.c_cflag |= CS8; break;
default:
fprintf(stderr,"Unsupported data size\n");
return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
break;
case 'o':
case 'O':
//停止位为1或2位 N->无奇偶校验,O->奇校验 E->为偶校验,
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK;
break;
case 'e':
case 'E':
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_iflag |= INPCK;
break;
case 's':
case 'S': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB; break;
case 2:
options.c_cflag |= CSTOPB; break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 0; // 15 seconds options.c_cc[VMIN] = 0;
/* Disnable parity checking */
/* Enable parity */ /* 转换为偶效验*/
/* Disnable parity checking */
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3"); return (FALSE);
}
return (TRUE);
}
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR );
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
void Serial_Write(uint8_t *Tx,uint32_t len)
{
#ifdef SW_Debug
printf("Serial Write:");
for (int i=0; i<len; i++)
{
printf("0x%X ",Tx[i]);
}
printf("\r\n");
#endif
write(Serial_Driver,Tx,len);
}
uint32_t Serial_Read(uint8_t *Rx,uint32_t len,uint32_t timeout)
{
uint32_t nread=0;
nread=read(Serial_Driver, Rx, len);
#ifdef SW_Debug
printf("Serial Read:");
for (int i=0; i<nread; i++)
{
printf("0x%X ",Rx[i]);
}
printf("\r\n");
#endif
return nread;
}
char ConnectDriverAddress(char *input ,char *output)
{
char tital[]="/dev/";
if (input[1]=='d' || input[1]=='D')
{
strcpy(output, input);
return TRUE;
}
else if(input[1]=='u')
{
strcpy(output, tital);
strcat(output, input);
return TRUE;
}
else
{
return FALSE;
}
}
char GoToBootloader()
{
uint8_t GoToISP=0x7f;
uint8_t Rx_buff[50]={0};
uint32_t timeout=0;
uint8_t nread=0;
Serial_Write(&GoToISP,1);
nread=Serial_Read( Rx_buff, 50,1000);
if(Rx_buff[0]==ACK && nread==1)
{
printf("Go to Bootloader Success\r\n");
return TRUE;
}
else
{
printf("Fail,Check Boot Mode!\r\n");
return FALSE;
}
}
char CheckErase(uint8_t *buff, uint8_t Len)
{
uint8_t *p_buff=buff;
for (int i = 0; i < 20; ++i)
{
if (*p_buff==0x43)
{
printf("Got Erase Command\r\n");
return 1;
}
else if (*p_buff==0x44)
{
printf("Got Extended Erase Command\r\n");
return 2;
}
p_buff++;
if (i>15)
{
printf("Can not find Erase Command\r\n");
return 11;
}
}
return 0;
}
char MCU_0X43_Erase(void)
{
uint8_t nread=0;
uint8_t Txbuff[3]={0};
uint8_t Rxbuff[30]={0};
Txbuff[0]=Erase_Cmd;
Add_XOR_Value(Txbuff,1);
Serial_Write(Txbuff,2);
nread=Serial_Read( Rxbuff, 20,100);
if (Rxbuff[0]==ACK)
{
memset(Rxbuff,0x00,20);
Txbuff[0]=0xff;
Add_XOR_Value(Txbuff,1);
Serial_Write(Txbuff,2);
nread=Serial_Read( Rxbuff, 20,100);
if (Rxbuff[0]==ACK)
{
printf("Erase OK\r\n");
return TRUE;
}
else
{
printf("Erase FAIL ON GLOBAL\r\n");
return FALSE;
}
}
else
{
printf("Erase Command NACK\r\n");
return FALSE;
}
}
char MCU_0X44_Erase(void)
{
uint8_t nread=0;
uint8_t Txbuff[3]={0};
uint8_t Rxbuff[30]={0};
Txbuff[0]=Extended_Erase;
Add_XOR_Value(Txbuff,1);
Serial_Write(Txbuff,2);
nread=Serial_Read( Rxbuff, 20,100);
if (Rxbuff[0]==ACK)
{
memset(Rxbuff,0x00,20);
Txbuff[0]=0xff;
Txbuff[1]=0xff;
Add_XOR_Value(Txbuff,2);
Serial_Write(Txbuff,3);
nread=Serial_Read( Rxbuff, 20,100);
if (Rxbuff[0]==ACK)
{
printf("Erase OK\r\n");
return TRUE;
}
else
{
printf("Erase FAIL ON GLOBAL\r\n");
return FALSE;
}
}
else
{
printf("Erase Command NACK\r\n");
return FALSE;
}
}
char MCU_0X31_Write(uint32_t Add, uint8_t *buff,uint8_t len)
{
uint8_t WriteCmd[2]={0x31,0xCE};
uint8_t AddBuff[5]={0};
uint8_t RxBuff[10]={0};
uint8_t nread=0;
AddBuff[0]=(uint8_t)((Add>>24) & 0x000000ff);
AddBuff[1]=(uint8_t)((Add>>16) & 0x000000ff);
AddBuff[2]=(uint8_t)((Add>>8) & 0x000000ff);
AddBuff[3]=(uint8_t)((Add) & 0x000000ff);
Add_XOR_Value(AddBuff, 4);
Serial_Write(WriteCmd,2);
nread=Serial_Read(RxBuff, 8, 100);
if (RxBuff[0]==ACK)
{
memset(RxBuff, 0x00, 10);
Serial_Write(AddBuff, 5);
nread=Serial_Read(RxBuff, 8, 100);
if (nread==1 && RxBuff[0]==ACK)
{
memset(RxBuff, 0x00, 10);
Serial_Write(buff,len);
nread=Serial_Read(RxBuff, 8, 100);
if (RxBuff[0]==ACK)
{
return TRUE;
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
else
{
return FALSE;
}
}
char MCU_Erase(void)
{
uint8_t nread=0;
uint8_t ret_Check,ret_Op=0;
uint8_t Rxbuff[30]={0};
uint8_t Txbuff[3]={0};
Txbuff[0]=GetComnmand;
Add_XOR_Value(Txbuff,1);
Serial_Write(Txbuff,2);
nread=Serial_Read( Rxbuff, 20,100);
ret_Check=CheckErase(Rxbuff,nread);
memset(Rxbuff,0x00,20);
if (ret_Check==1)
{
ret_Op=MCU_0X43_Erase();
}
else if(ret_Check==2)
{
ret_Op=MCU_0X44_Erase();
}
else
{
return FALSE;
}
return ret_Op;
}
char MCU_WriteMemory(char *FilePath,uint32_t Star_Address)
{
FILE *fd;
uint8_t TxBuff[130]={0};
uint32_t count=0;
uint8_t lev=0;
uint8_t len=0;
fd=fopen(FilePath,"r");
if(fd==NULL)
{
printf("Fail to open\r\n");
return FALSE;
}
while (!feof(fd))
{
len++;
TxBuff[len]= fgetc(fd);
#ifdef SW_Debug
printf("len %d: 0x%X\r\n",len,TxBuff[len]);
#endif
if (len==128)
{
TxBuff[0]=len-1;
Add_XOR_Value(TxBuff, 129);
if (MCU_0X31_Write(Star_Address, TxBuff, 130)==TRUE )
{
count++;
Star_Address=Star_Address+len;
len=0;
printf("Write %d 128Bytes\r\n",count);
}
else
{
return FALSE;
}
}
}
#ifdef SW_Debug
printf("Lever :%d\r\n",len);
#endif
if (len!=0)
{
lev=len%4;
len=len+(4-lev);
TxBuff[0]=len-1;
Add_XOR_Value(TxBuff, len+1);
if (MCU_0X31_Write(Star_Address, TxBuff, len+2)==TRUE )
{
count++;
printf("Write %d Bytes\r\n",len);
len=0;
}
else
{
fclose(fd);
return FALSE;
}
}
fclose(fd);
return TRUE;
}
int main(int argc, const char * argv[])
{
char *Version="V01";
char DriverAdd[30]={0};
printf("Hello, World!\n");
printf("Flash Loader %s\r\n",Version);
if (ConnectDriverAddress(argv[1],DriverAdd)==FALSE) //串口地址拼接
{
printf("Driver Address Error\r\n");
exit(0);
}
printf("Driver Address: %s\r\n",DriverAdd);
Serial_Driver = OpenDev(DriverAdd); //打开串口
if (Serial_Driver>0)
set_speed(Serial_Driver,115200); //设置通信速度
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
if (set_Parity(Serial_Driver,8,1,'E')== FALSE) // 8位数据,1位停止位,偶校验
{
printf("Set Parity Error\n");
exit(1);
}
printf("Open Serial OK\r\n");
if(GoToBootloader()==TRUE) //进入烧录模式的UART模式
{
if(MCU_Erase()==TRUE) //擦除MUC的Flash
{
if (MCU_WriteMemory(argv[2],0x08000000)==TRUE) //开始将程序分包写入单片机的内存地址中
{
printf("Flash Program Successful\r\n");
}
else
{
printf("Flash Program Fail\r\n");
}
}
else
{
printf("MCU Erase Fail\r\n");
}
}
close(Serial_Driver); //关闭串口
printf("If you have any question ,please contact with me by xin.zhang@cyg.com\r\n");
exit(0);
}。
本发明首先设置好MCU芯片处于烧录模式,然后通过开启苹果电脑上自带的软件,将设置好的工具和固件均拖入软件中并运行,再配置成UART模式将MCU芯片内的原有的内容擦除掉,然后将将要烧录的固件分包写入MCU芯片相应的地址,实现烧录,能够解决当现场只有苹果电脑的时候,不能烧录和更新单片机程序的问题。
Claims (4)
1.一种在苹果电脑OS X系统下串口烧录STM32单片机的方法,该方法中,STM32单片机设置在产品的板卡上作为MCU芯片,其特征在于,该方法包括以下步骤:
(1)将板卡上面的MCU芯片设置到烧录模式:将MCU芯片的BOOT引脚拉高,再将MCU进行复位,并使用USB转串口线连接到苹果电脑;
(2)运行工具:打开苹果电脑自带的终端软件,将工具拖进去终端,再将串口名复制进终端,最后将要烧录的固件也拖进终端,按回车键运行;
(3)苹果电脑上的终端软件运行时,终端软件获取到的第一个参数作为串口去打开,第二个参数作为文件去打开,终端软件打开串口后,发送7F指令,让单片机进入UART模式,再发送指令获取指令集,判断支持的擦除模式,根据擦除模式来擦除芯片;
(4)擦除成功之后,就将要烧录的固件按128字节的大小进行分包,将每个包写入芯片对应的地址,返回成功之后,当就提示用户烧录成功时,结束烧录。
2.根据权利要求1所述的一种在苹果电脑OS X系统下串口烧录STM32单片机的方法,其特征在于:所述步骤(2)中,所述工具为命令行软件工具。
3.根据权利要求1所述的一种在苹果电脑OS X系统下串口烧录STM32单片机的方法,其特征在于:所述步骤(2)中,所述固件的文件格式为Bin格式文件。
4.根据权利要求1所述的一种在苹果电脑OS X系统下串口烧录STM32单片机的方法,其特征在于:所述工具的编写语言为C语言,编译工具为Xcode Version 11.3.1 (11C504),在OS X 10.15.4 (19E266)的运行环境下运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010506930.XA CN111857742A (zh) | 2020-06-05 | 2020-06-05 | 一种在苹果电脑os x系统下串口烧录stm32单片机的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010506930.XA CN111857742A (zh) | 2020-06-05 | 2020-06-05 | 一种在苹果电脑os x系统下串口烧录stm32单片机的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN111857742A true CN111857742A (zh) | 2020-10-30 |
Family
ID=72986128
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010506930.XA Pending CN111857742A (zh) | 2020-06-05 | 2020-06-05 | 一种在苹果电脑os x系统下串口烧录stm32单片机的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111857742A (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20030025574A (ko) * | 2001-09-21 | 2003-03-29 | 김철오 | 캔 통신을 이용한 원격 다중 직렬 통신 시스템 구현 |
CN102820061A (zh) * | 2012-08-31 | 2012-12-12 | 东北大学 | 嵌入式远程设备程序烧写装置及方法 |
CN109240719A (zh) * | 2017-07-03 | 2019-01-18 | 湖南大学 | 一种基于stm32的程序下载器 |
CN109857433A (zh) * | 2019-01-15 | 2019-06-07 | 四川虹美智能科技有限公司 | 一种单片机软件升级工具和方法 |
CN110609690A (zh) * | 2019-08-30 | 2019-12-24 | 珠海泰芯半导体有限公司 | 一种烧录器的烧录加速方法 |
-
2020
- 2020-06-05 CN CN202010506930.XA patent/CN111857742A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20030025574A (ko) * | 2001-09-21 | 2003-03-29 | 김철오 | 캔 통신을 이용한 원격 다중 직렬 통신 시스템 구현 |
CN102820061A (zh) * | 2012-08-31 | 2012-12-12 | 东北大学 | 嵌入式远程设备程序烧写装置及方法 |
CN109240719A (zh) * | 2017-07-03 | 2019-01-18 | 湖南大学 | 一种基于stm32的程序下载器 |
CN109857433A (zh) * | 2019-01-15 | 2019-06-07 | 四川虹美智能科技有限公司 | 一种单片机软件升级工具和方法 |
CN110609690A (zh) * | 2019-08-30 | 2019-12-24 | 珠海泰芯半导体有限公司 | 一种烧录器的烧录加速方法 |
Non-Patent Citations (1)
Title |
---|
W何生: "单片机——mac下的开发环境搭建", pages 1 - 3, Retrieved from the Internet <URL:https://www.jianshu.com/p/1eb1e8965757> * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102033770B (zh) | 移动终端的触摸屏固件升级方法及装置 | |
CN204331708U (zh) | 一种便携式设备和一种主机系统 | |
CN112667320A (zh) | 一种基于MicroBlaze的FPGA及DSP远程加载系统 | |
CN110209419A (zh) | 一种基于can总线的嵌入式dsp设备升级方法及装置 | |
CN101330399A (zh) | 嵌入式设备的升级方法 | |
CN102446141B (zh) | 用于实现写保护控制的装置和方法 | |
CN101986266A (zh) | Android手机操作系统移植到凌动处理器开发板的方法 | |
CN106201605B (zh) | 基于FPGA和PowerPC的FPGA启动加载FLASH升级系统及方法 | |
CN1940802A (zh) | 解除基本输入/输出系统写保护的系统及方法 | |
CN104461638B (zh) | 一种基于Bootloader的XFP光模块升级方法 | |
CN111857742A (zh) | 一种在苹果电脑os x系统下串口烧录stm32单片机的方法 | |
CN102520993A (zh) | 在特异硬件平台上移植通用引导装载程序的方法 | |
CN101384063A (zh) | 一种终端设备修复升级的方法与系统及其系统的制作方法 | |
CN108694052B (zh) | 一种固件升级方法、固件升级装置及固件升级系统 | |
CN101788946B (zh) | Cpld上连接有e2prom设备的固件烧结方法及装置 | |
WO2024093542A1 (zh) | Usb免驱通信方法、装置、电子设备及存储介质 | |
CN111459468A (zh) | 高可靠性串口通讯的dsp程序在线升级系统和方法 | |
CN107332589A (zh) | 一种基于蓝牙的固件升级装置 | |
CN116756067A (zh) | 基于鸿蒙分布式SoftBus的AI-EC嵌入式系统及其构建、部署方法 | |
CN110750489A (zh) | 一种在fpga中部署算子的方法、设备及介质 | |
CN104991774A (zh) | 一种uefi平台下截获系统引导的系统和方法 | |
CN110286940B (zh) | 智能电视日志生成方法 | |
CN111294985A (zh) | 一种基于4g的便携式矿灯通信系统、通信方法及构建方法 | |
CN111638899A (zh) | 一种通过dsp串口升级fpga程序的方法 | |
CN112748946A (zh) | 应用程序安装文件生成方法和装置、计算设备、存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |