<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>1949啦网--小小</title><link>https://blog.qiquanji.com/</link><description>痛苦，是因为能力和欲望不匹配造成的</description><item><title>stm32中电脑设备管理器识别到了ST-Link，但是在keil5中无法识别的解决办法</title><link>https://blog.qiquanji.com/post/11122.html</link><description>&lt;p&gt;原来是驱动没装。。，装了驱动就好了&lt;/p&gt;</description><pubDate>Thu, 19 Jun 2025 15:10:31 +0800</pubDate></item><item><title>keil5软件所需软件包下载地址</title><link>https://blog.qiquanji.com/post/11121.html</link><description>&lt;p&gt;&lt;a href=&quot;https://www.keil.arm.com/devices/#!%23third-party-download-dialog&quot; target=&quot;_self&quot;&gt;https://www.keil.arm.com/devices/#!%23third-party-download-dialog&lt;/a&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 19 Jun 2025 14:52:21 +0800</pubDate></item><item><title>编写QT串口上位机接收stm32串口发送的数据</title><link>https://blog.qiquanji.com/post/11120.html</link><description>&lt;p&gt;QT串口上位机的代码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include&amp;nbsp;&amp;quot;mainwindow.h&amp;quot;
#include&amp;nbsp;&amp;quot;ui_mainwindow.h&amp;quot;

MainWindow::MainWindow(QWidget&amp;nbsp;*parent)&amp;nbsp;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QMainWindow(parent),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui(new&amp;nbsp;Ui::MainWindow)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;setupUi(this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setEnabled(false);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial=new&amp;nbsp;QSerialPort(this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updateSerialPortMenu();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect(ui-&amp;gt;pushButton,&amp;amp;QPushButton::clicked,this,[=]()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(serial-&amp;gt;isOpen())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setText(&amp;quot;打开串口&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;label-&amp;gt;setText(&amp;quot;串口&amp;quot;+currentPortName+&amp;quot;已关闭&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serialControl();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QAction&amp;nbsp;*refreshAction=new&amp;nbsp;QAction(&amp;quot;刷新串口&amp;quot;,this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;menuBar()-&amp;gt;addAction(refreshAction);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect(refreshAction,&amp;amp;QAction::triggered,this,&amp;amp;MainWindow::refreshSerialPortList);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect(serial,&amp;amp;QSerialPort::readyRead,this,&amp;amp;MainWindow::readSerialData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect(serial,SIGNAL(error(QSerialPort::SerialPortError)),this,SLOT(handleSerialError(QSerialPort::SerialPortError)));
}

//如果中途出现串口断开的处理槽函数
void&amp;nbsp;MainWindow::handleSerialError(QSerialPort::SerialPortError&amp;nbsp;error)
{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(error==QSerialPort::PermissionError)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setText(&amp;quot;打开串口&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;label-&amp;gt;setText(&amp;quot;串口&amp;quot;+currentPortName+&amp;quot;异常关闭&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

void&amp;nbsp;MainWindow::readSerialData()//处理单片机传过来的数据的槽函数
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QByteArray&amp;nbsp;data&amp;nbsp;=serial-&amp;gt;readAll();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;textEdit-&amp;gt;append(QString::fromUtf8(data));

}
//刷新串口端口的槽函数
void&amp;nbsp;MainWindow::refreshSerialPortList()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//清除旧菜单项
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(QAction*action:&amp;nbsp;protactionGroup-&amp;gt;actions())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;removeAction(action);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protactionGroup-&amp;gt;removeAction(action);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;action;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//再重新添加扫描到的串口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;auto&amp;nbsp;ports=QSerialPortInfo::availablePorts();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(const&amp;nbsp;QSerialPortInfo&amp;nbsp;&amp;amp;info:ports&amp;nbsp;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QAction&amp;nbsp;*protAction=new&amp;nbsp;QAction(info.portName(),this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protAction-&amp;gt;setCheckable(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protactionGroup-&amp;gt;addAction(protAction);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;addAction(protAction);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;setEnabled(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;label-&amp;gt;setText(&amp;quot;串口菜单已刷新&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setText(&amp;quot;打开串口&amp;quot;);

}

void&amp;nbsp;MainWindow::serialControl()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(serial-&amp;gt;open(QIODevice::ReadWrite))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;clear(QSerialPort::AllDirections);//清除缓冲区,要不然一开始接收的字符可能是乱码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setEnabled(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;pushButton-&amp;gt;setText(&amp;quot;关闭串口&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;textEdit-&amp;gt;clear();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;label-&amp;gt;setText(&amp;quot;串口&amp;quot;+currentPortName+&amp;quot;已打开&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setBaudRate(QSerialPort::Baud115200);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setDataBits(QSerialPort::Data8);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setParity(QSerialPort::NoParity);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setStopBits(QSerialPort::OneStop);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setFlowControl(QSerialPort::NoFlowControl);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;label-&amp;gt;setText(&amp;quot;串口&amp;quot;+currentPortName+&amp;quot;打开失败&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//弹窗提示
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QMessageBox::information(this,&amp;quot;串口打开失败&amp;quot;,&amp;quot;无法打开串口&amp;quot;+currentPortName+&amp;quot;.\n请检查是否被其他程序占用或不存在.&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

}

//当用户选择了对应的串口端口后进行的处理
void&amp;nbsp;MainWindow::onSerialPorSelected(QAction&amp;nbsp;*action)
{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString&amp;nbsp;selectedPort&amp;nbsp;=&amp;nbsp;action-&amp;gt;text();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;currentPortName=selectedPort;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;setPortName(selectedPort);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;setEnabled(false);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(serial-&amp;gt;isOpen())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serial-&amp;gt;close();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serialControl();

}

void&amp;nbsp;MainWindow::updateSerialPortMenu()
{

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;clear();//清除旧的菜单栏
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protactionGroup=new&amp;nbsp;QActionGroup(this);//用于管理互斥选择
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protactionGroup-&amp;gt;setExclusive(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(const&amp;nbsp;QSerialPortInfo&amp;nbsp;&amp;amp;info,QSerialPortInfo::availablePorts())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QAction&amp;nbsp;*protAction=new&amp;nbsp;QAction(info.portName(),this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protAction-&amp;gt;setCheckable(true);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;protactionGroup-&amp;gt;addAction(protAction);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ui-&amp;gt;menuSerialPorts-&amp;gt;addAction(protAction);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//连接槽函数:当用户点击某个串口菜单项时
&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;connect(protactionGroup,&amp;amp;QActionGroup::triggered,this,&amp;amp;MainWindow::onSerialPorSelected);//这句话用Lambda表示如下:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;connect(protactionGroup,&amp;amp;QActionGroup::triggered,this,[this](QAction&amp;nbsp;*action)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QString&amp;nbsp;selectSerial=action-&amp;gt;text();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qDebug()&amp;lt;&amp;lt;&amp;quot;select&amp;nbsp;Serial&amp;nbsp;Port:&amp;quot;&amp;lt;&amp;lt;selectSerial;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this-&amp;gt;onSerialPorSelected(action);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

}



MainWindow::~MainWindow()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;ui;
}&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506161750064785718705.jpg&quot; title=&quot;Snipaste_2025-06-15_21-39-58.jpg&quot; alt=&quot;Snipaste_2025-06-15_21-39-58.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;stm32的串口代码(使用定时器定时往串口发送数据)&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;#include&amp;nbsp;&amp;quot;timer.h&amp;quot;

uint8_t&amp;nbsp;timer_flag&amp;nbsp;=&amp;nbsp;0;
void&amp;nbsp;Timer_NVIC(void)
{
	NVIC_InitTypeDef&amp;nbsp;NVIC_InitStructure;

	NVIC_InitStructure.NVIC_IRQChannel&amp;nbsp;=&amp;nbsp;TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&amp;nbsp;=&amp;nbsp;0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority&amp;nbsp;=&amp;nbsp;1;
	NVIC_InitStructure.NVIC_IRQChannelCmd&amp;nbsp;=&amp;nbsp;ENABLE;
	NVIC_Init(&amp;amp;NVIC_InitStructure);&amp;nbsp;
}

void&amp;nbsp;Timer_Config(void)
{
	TIM_TimeBaseInitTypeDef&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,&amp;nbsp;ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Time&amp;nbsp;Base&amp;nbsp;configuration&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure.TIM_Prescaler&amp;nbsp;=&amp;nbsp;7200-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure.TIM_CounterMode&amp;nbsp;=&amp;nbsp;TIM_CounterMode_Up;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure.TIM_Period&amp;nbsp;=&amp;nbsp;10000-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure.TIM_ClockDivision&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseInit(TIM2,&amp;nbsp;&amp;amp;TIM_TimeBaseStructure);
&amp;nbsp;&amp;nbsp;&amp;nbsp;Timer_NVIC();
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	/*&amp;nbsp;TIM3&amp;nbsp;counter&amp;nbsp;enable&amp;nbsp;*/
	TIM_Cmd(TIM2,&amp;nbsp;ENABLE);
&amp;nbsp;	
}

void&amp;nbsp;TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		timer_flag=1;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}


#include&amp;nbsp;&amp;quot;usart.h&amp;quot;&amp;nbsp;&amp;nbsp;
void&amp;nbsp;Usart_Config(void)
{
	GPIO_InitTypeDef&amp;nbsp;GPIO_InitStructure;
	USART_InitTypeDef&amp;nbsp;USART_InitStructure;
	/*&amp;nbsp;Enable&amp;nbsp;GPIO&amp;nbsp;clock&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA&amp;nbsp;|&amp;nbsp;RCC_APB2Periph_AFIO,&amp;nbsp;ENABLE);
	&amp;nbsp;

&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;Rx&amp;nbsp;as&amp;nbsp;input&amp;nbsp;floating&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;GPIO_Pin_10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_IN_FLOATING;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;Tx&amp;nbsp;as&amp;nbsp;alternate&amp;nbsp;function&amp;nbsp;push-pull&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;GPIO_Pin_9;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Speed&amp;nbsp;=&amp;nbsp;GPIO_Speed_50MHz;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_AF_PP;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
		
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_BaudRate&amp;nbsp;=&amp;nbsp;115200;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_WordLength&amp;nbsp;=&amp;nbsp;USART_WordLength_8b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_StopBits&amp;nbsp;=&amp;nbsp;USART_StopBits_1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_Parity&amp;nbsp;=&amp;nbsp;USART_Parity_No;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_HardwareFlowControl&amp;nbsp;=&amp;nbsp;USART_HardwareFlowControl_None;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_Mode&amp;nbsp;=&amp;nbsp;USART_Mode_Rx&amp;nbsp;|USART_Mode_Tx;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_Init(USART1,&amp;nbsp;&amp;amp;USART_InitStructure);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Enable&amp;nbsp;USARTz&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_Cmd(USART1,&amp;nbsp;ENABLE);

}

void&amp;nbsp;Usart_send(uint8_t&amp;nbsp;ch)
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Place&amp;nbsp;your&amp;nbsp;implementation&amp;nbsp;of&amp;nbsp;fputc&amp;nbsp;here&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;e.g.&amp;nbsp;write&amp;nbsp;a&amp;nbsp;character&amp;nbsp;to&amp;nbsp;the&amp;nbsp;USART&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_SendData(USART1,&amp;nbsp;(uint8_t)&amp;nbsp;ch);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Loop&amp;nbsp;until&amp;nbsp;the&amp;nbsp;end&amp;nbsp;of&amp;nbsp;transmission&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(USART_GetFlagStatus(USART1,&amp;nbsp;USART_FLAG_TXE)&amp;nbsp;==&amp;nbsp;RESET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;{}
&amp;nbsp;
&amp;nbsp;}
&amp;nbsp;
&amp;nbsp;void&amp;nbsp;Usart_sendBuff(uint8_t&amp;nbsp;*buf,uint32_t&amp;nbsp;size)
{
	for(uint32_t&amp;nbsp;i=0;i&amp;lt;size;i++)
	{
		Usart_send(buf[i]);
	}
}

&amp;nbsp;//¶¨Ê±·¢ËÍ
&amp;nbsp;void&amp;nbsp;Send_Handle()
&amp;nbsp;{
&amp;nbsp;	uint8_t&amp;nbsp;xiao[9]=&amp;quot;xiaoxiao&amp;quot;;
		if(timer_flag==1)
		{
			timer_flag=0;
			Usart_sendBuff(xiao,sizeof(xiao));
		}
&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;&lt;video class=&quot;edui-upload-video &quot; controls=&quot;&quot; preload=&quot;none&quot; width=&quot;420&quot; height=&quot;280&quot; src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506161750064906159823.mp4&quot; data-setup=&quot;{}&quot;&gt;&lt;source src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506161750064906159823.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/p&gt;</description><pubDate>Mon, 16 Jun 2025 16:57:16 +0800</pubDate></item><item><title>stm32使用PWM+DMA控制呼吸灯与PWM+DMA+TIM控制呼吸灯</title><link>https://blog.qiquanji.com/post/11119.html</link><description>&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;使用PWM+DMA+TIM控制呼吸灯,此种办法DMA搬运速度与另外定时器触发周期有关
使用PWM+DMA控制呼吸灯,此种办法DMA搬运速度与PWM周期有关
如下:
此是PWM+DMA
void&amp;nbsp;Pwm_Config(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitTypeDef&amp;nbsp;GPIO_InitStructure;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseInitTypeDef&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_OCInitTypeDef&amp;nbsp;&amp;nbsp;TIM_OCInitStructure;
	/*&amp;nbsp;TIM3&amp;nbsp;clock&amp;nbsp;enable&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,&amp;nbsp;ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;GPIOA&amp;nbsp;and&amp;nbsp;GPIOB&amp;nbsp;clock&amp;nbsp;enable&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|RCC_APB2Periph_AFIO,&amp;nbsp;ENABLE);
	
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;&amp;nbsp;GPIO_Pin_6;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_AF_PP;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Speed&amp;nbsp;=&amp;nbsp;GPIO_Speed_50MHz;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
	GPIO_ResetBits(GPIOA,&amp;nbsp;GPIO_Pin_6);
	
	TIM_TimeBaseStructure.TIM_Period&amp;nbsp;=&amp;nbsp;500-1;//200hz
	TIM_TimeBaseStructure.TIM_Prescaler&amp;nbsp;=&amp;nbsp;720-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision&amp;nbsp;=&amp;nbsp;0;
	TIM_TimeBaseStructure.TIM_CounterMode&amp;nbsp;=&amp;nbsp;TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3,&amp;nbsp;&amp;amp;TIM_TimeBaseStructure);
	

	/*&amp;nbsp;Channel&amp;nbsp;3&amp;nbsp;Configuration&amp;nbsp;in&amp;nbsp;PWM&amp;nbsp;mode&amp;nbsp;*/
	TIM_OCInitStructure.TIM_OCMode&amp;nbsp;=&amp;nbsp;TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState&amp;nbsp;=&amp;nbsp;TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse&amp;nbsp;=&amp;nbsp;pwm_buff[0];
	TIM_OCInitStructure.TIM_OCPolarity&amp;nbsp;=&amp;nbsp;TIM_OCPolarity_Low;
	TIM_OC1Init(TIM3,&amp;nbsp;&amp;amp;TIM_OCInitStructure);

	/*&amp;nbsp;TIM3&amp;nbsp;Update&amp;nbsp;DMA&amp;nbsp;Request&amp;nbsp;enable&amp;nbsp;*/
	TIM_DMACmd(TIM3,&amp;nbsp;TIM_DMA_CC1,&amp;nbsp;ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_OC1PreloadConfig(TIM3,&amp;nbsp;TIM_OCPreload_Enable);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_ARRPreloadConfig(TIM3,&amp;nbsp;ENABLE);

	/*&amp;nbsp;TIM3&amp;nbsp;counter&amp;nbsp;enable&amp;nbsp;*/
	TIM_Cmd(TIM3,&amp;nbsp;ENABLE);

}
Dma_Config()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_InitTypeDef&amp;nbsp;dma_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
/*&amp;nbsp;DMA1&amp;nbsp;Channel5&amp;nbsp;Config&amp;nbsp;*/
DMA_DeInit(DMA1_Channel6);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)&amp;amp;TIM3-&amp;gt;CCR1;//当内存传内存时可看作数据的源
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)pwm_buff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_DIR&amp;nbsp;=&amp;nbsp;DMA_DIR_PeripheralDST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_BufferSize&amp;nbsp;=&amp;nbsp;PWM_SIZE;&amp;nbsp;//传输数目
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralInc&amp;nbsp;=&amp;nbsp;DMA_PeripheralInc_Disable;&amp;nbsp;//外设地址增量模式
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryInc&amp;nbsp;=&amp;nbsp;DMA_MemoryInc_Enable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralDataSize&amp;nbsp;=&amp;nbsp;DMA_PeripheralDataSize_HalfWord;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryDataSize&amp;nbsp;=&amp;nbsp;DMA_MemoryDataSize_HalfWord;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Mode&amp;nbsp;=&amp;nbsp;DMA_Mode_Circular;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_M2M&amp;nbsp;=&amp;nbsp;DMA_M2M_Disable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Priority&amp;nbsp;=&amp;nbsp;DMA_Priority_High;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Init(DMA1_Channel6,&amp;amp;dma_InitStruct);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Cmd(DMA1_Channel6,&amp;nbsp;ENABLE);

}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap-mode: nowrap;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506151749981573604727.jpg&quot; title=&quot;Snipaste_2025-06-15_17-58-13.jpg&quot; alt=&quot;Snipaste_2025-06-15_17-58-13.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;使用PWM+DMA+TIM控制呼吸灯,此种办法DMA搬运速度与另外定时器触发周期有关
#include&amp;nbsp;&amp;quot;pwm.h&amp;quot;
#include&amp;nbsp;&amp;quot;math.h&amp;quot;


extern&amp;nbsp;volatile&amp;nbsp;uint16_t&amp;nbsp;new_pwm;
uint16_t&amp;nbsp;pwm_buff[PWM_SIZE]={0};

void&amp;nbsp;Led_PwmBuff()
{
	int&amp;nbsp;i=0;
	for(&amp;nbsp;i=0;i&amp;lt;(PWM_SIZE/2);i++)
	{
		pwm_buff[i]=i;
	}
	for(;i&amp;lt;PWM_SIZE;i++)
	{
		pwm_buff[i]=PWM_SIZE-i;
	}	
}
void&amp;nbsp;Pwm_Config(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitTypeDef&amp;nbsp;GPIO_InitStructure;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_TimeBaseInitTypeDef&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure;
&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_OCInitTypeDef&amp;nbsp;&amp;nbsp;TIM_OCInitStructure;
	/*&amp;nbsp;TIM3&amp;nbsp;clock&amp;nbsp;enable&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,&amp;nbsp;ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;GPIOA&amp;nbsp;and&amp;nbsp;GPIOB&amp;nbsp;clock&amp;nbsp;enable&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|RCC_APB2Periph_AFIO,&amp;nbsp;ENABLE);
	
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;&amp;nbsp;GPIO_Pin_6;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_AF_PP;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Speed&amp;nbsp;=&amp;nbsp;GPIO_Speed_50MHz;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_ResetBits(GPIOA,&amp;nbsp;GPIO_Pin_6);
	
	TIM_TimeBaseStructure.TIM_Period&amp;nbsp;=&amp;nbsp;500-1;//2khz
	TIM_TimeBaseStructure.TIM_Prescaler&amp;nbsp;=&amp;nbsp;72-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision&amp;nbsp;=&amp;nbsp;0;
	TIM_TimeBaseStructure.TIM_CounterMode&amp;nbsp;=&amp;nbsp;TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3,&amp;nbsp;&amp;amp;TIM_TimeBaseStructure);
	

	/*&amp;nbsp;Channel&amp;nbsp;3&amp;nbsp;Configuration&amp;nbsp;in&amp;nbsp;PWM&amp;nbsp;mode&amp;nbsp;*/
	TIM_OCInitStructure.TIM_OCMode&amp;nbsp;=&amp;nbsp;TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState&amp;nbsp;=&amp;nbsp;TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse&amp;nbsp;=&amp;nbsp;pwm_buff[0];
	TIM_OCInitStructure.TIM_OCPolarity&amp;nbsp;=&amp;nbsp;TIM_OCPolarity_Low;
	TIM_OC1Init(TIM3,&amp;nbsp;&amp;amp;TIM_OCInitStructure);


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_OC1PreloadConfig(TIM3,&amp;nbsp;TIM_OCPreload_Enable);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TIM_ARRPreloadConfig(TIM3,&amp;nbsp;ENABLE);

	/*&amp;nbsp;TIM3&amp;nbsp;counter&amp;nbsp;enable&amp;nbsp;*/
	TIM_Cmd(TIM3,&amp;nbsp;ENABLE);

}

void&amp;nbsp;Time_init()//为了控制dma搬运
{
	TIM_TimeBaseInitTypeDef&amp;nbsp;&amp;nbsp;TIM_TimeBaseStructure;
	TIM_OCInitTypeDef&amp;nbsp;&amp;nbsp;TIM_OCInitStructure;
	NVIC_InitTypeDef&amp;nbsp;NVIC_InitStructure;
	/*&amp;nbsp;TIM2&amp;nbsp;clock&amp;nbsp;enable&amp;nbsp;*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,&amp;nbsp;ENABLE);

	TIM_TimeBaseStructure.TIM_Period&amp;nbsp;=&amp;nbsp;500-1;//200hz
	TIM_TimeBaseStructure.TIM_Prescaler&amp;nbsp;=&amp;nbsp;720-1;//72000000/72=1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision&amp;nbsp;=&amp;nbsp;0;
	TIM_TimeBaseStructure.TIM_CounterMode&amp;nbsp;=&amp;nbsp;TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM2,&amp;nbsp;&amp;amp;TIM_TimeBaseStructure);


	NVIC_InitStructure.NVIC_IRQChannel&amp;nbsp;=&amp;nbsp;TIM2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority&amp;nbsp;=&amp;nbsp;0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority&amp;nbsp;=&amp;nbsp;1;
	NVIC_InitStructure.NVIC_IRQChannelCmd&amp;nbsp;=&amp;nbsp;ENABLE;
	NVIC_Init(&amp;amp;NVIC_InitStructure);&amp;nbsp;
	TIM_DMACmd(TIM2,&amp;nbsp;TIM_DMA_Update,&amp;nbsp;ENABLE);
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	/*&amp;nbsp;TIM3&amp;nbsp;counter&amp;nbsp;enable&amp;nbsp;*/
	TIM_Cmd(TIM2,&amp;nbsp;ENABLE);
	
}

void&amp;nbsp;TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		TIM3-&amp;gt;CCR1=new_pwm;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

void&amp;nbsp;Dma_Config()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_InitTypeDef&amp;nbsp;dma_InitStruct;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	&amp;nbsp;/*&amp;nbsp;DMA1&amp;nbsp;Channel5&amp;nbsp;Config&amp;nbsp;*/
	DMA_DeInit(DMA1_Channel2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)&amp;amp;new_pwm;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)pwm_buff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_DIR&amp;nbsp;=&amp;nbsp;DMA_DIR_PeripheralDST;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_BufferSize&amp;nbsp;=&amp;nbsp;PWM_SIZE;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralInc&amp;nbsp;=&amp;nbsp;DMA_PeripheralInc_Disable;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryInc&amp;nbsp;=&amp;nbsp;DMA_MemoryInc_Enable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralDataSize&amp;nbsp;=&amp;nbsp;DMA_PeripheralDataSize_HalfWord;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryDataSize&amp;nbsp;=&amp;nbsp;DMA_MemoryDataSize_HalfWord;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Mode&amp;nbsp;=&amp;nbsp;DMA_Mode_Circular;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_M2M&amp;nbsp;=&amp;nbsp;DMA_M2M_Disable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Priority&amp;nbsp;=&amp;nbsp;DMA_Priority_High;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Init(DMA1_Channel2,&amp;amp;dma_InitStruct);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Cmd(DMA1_Channel2,&amp;nbsp;ENABLE);
	
}&lt;/pre&gt;&lt;p&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506151749981954448707.jpg&quot; title=&quot;Snipaste_2025-06-15_18-05-03.jpg&quot; alt=&quot;Snipaste_2025-06-15_18-05-03.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;video class=&quot;edui-upload-video &quot; controls=&quot;&quot; preload=&quot;none&quot; width=&quot;420&quot; height=&quot;280&quot; src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506151749982003681389.mp4&quot; data-setup=&quot;{}&quot;&gt;&lt;source src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506151749982003681389.mp4&quot; type=&quot;video/mp4&quot;/&gt;&lt;/video&gt;&lt;/p&gt;</description><pubDate>Sun, 15 Jun 2025 17:32:57 +0800</pubDate></item><item><title>串口+DMA非中断接收不定长数据</title><link>https://blog.qiquanji.com/post/11118.html</link><description>&lt;p&gt;1.DMA重要知识点&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;单次模式时：当传输计数器减到0就停止了；还想再次启动，得先失能装载计数器的值再使能
循环模式：当减到0时会重新加载&lt;/pre&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506121749705427196718.png&quot; style=&quot;width: 434px; height: 307px;&quot; title=&quot;C737E52E2C7230F8C34DE28F62C907D6.png&quot; width=&quot;434&quot; height=&quot;307&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506121749705436133567.png&quot; style=&quot;width: 636px; height: 1px;&quot; title=&quot;0BDE87189A82BE15E329B6565829AD26.png&quot; width=&quot;636&quot; height=&quot;1&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506121749705589116237.png&quot; title=&quot;0BDE87189A82BE15E329B6565829AD26.png&quot; alt=&quot;0BDE87189A82BE15E329B6565829AD26.png&quot; width=&quot;464&quot; height=&quot;375&quot; style=&quot;width: 464px; height: 375px;&quot;/&gt;&lt;/p&gt;&lt;p&gt;2.STM32使用串口工具高波特率发送多数据的时候,使用DMA能减少MCU的负担,并进行快速搬运数据,此代码是非中断接收不定长数据的.&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506121749706842913101.jpg&quot; title=&quot;Snipaste_2025-06-12_13-40-13.jpg&quot; alt=&quot;Snipaste_2025-06-12_13-40-13.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;#include&amp;nbsp;&amp;quot;usart.h&amp;quot;
void&amp;nbsp;Usart_Config(void)
{
	GPIO_InitTypeDef&amp;nbsp;GPIO_InitStructure;
	USART_InitTypeDef&amp;nbsp;USART_InitStructure;
	/*&amp;nbsp;Enable&amp;nbsp;GPIO&amp;nbsp;clock&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA&amp;nbsp;|&amp;nbsp;RCC_APB2Periph_AFIO,&amp;nbsp;ENABLE);
	&amp;nbsp;

&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;Rx&amp;nbsp;as&amp;nbsp;input&amp;nbsp;floating&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;GPIO_Pin_10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_IN_FLOATING;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;Tx&amp;nbsp;as&amp;nbsp;alternate&amp;nbsp;function&amp;nbsp;push-pull&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Pin&amp;nbsp;=&amp;nbsp;GPIO_Pin_9;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Speed&amp;nbsp;=&amp;nbsp;GPIO_Speed_50MHz;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_InitStructure.GPIO_Mode&amp;nbsp;=&amp;nbsp;GPIO_Mode_AF_PP;
&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_Init(GPIOA,&amp;nbsp;&amp;amp;GPIO_InitStructure);
		
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_BaudRate&amp;nbsp;=&amp;nbsp;115200;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_WordLength&amp;nbsp;=&amp;nbsp;USART_WordLength_8b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_StopBits&amp;nbsp;=&amp;nbsp;USART_StopBits_1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_Parity&amp;nbsp;=&amp;nbsp;USART_Parity_No;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_HardwareFlowControl&amp;nbsp;=&amp;nbsp;USART_HardwareFlowControl_None;
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_InitStructure.USART_Mode&amp;nbsp;=&amp;nbsp;USART_Mode_Rx&amp;nbsp;|USART_Mode_Tx;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Configure&amp;nbsp;USARTy&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_Init(USART1,&amp;nbsp;&amp;amp;USART_InitStructure);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Enable&amp;nbsp;USARTy&amp;nbsp;DMA&amp;nbsp;TX&amp;nbsp;request&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_DMACmd(USART1,&amp;nbsp;USART_DMAReq_Rx,&amp;nbsp;ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Enable&amp;nbsp;USARTz&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_Cmd(USART1,&amp;nbsp;ENABLE);

}

void&amp;nbsp;Usart_send(uint8_t&amp;nbsp;ch)
&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Place&amp;nbsp;your&amp;nbsp;implementation&amp;nbsp;of&amp;nbsp;fputc&amp;nbsp;here&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;e.g.&amp;nbsp;write&amp;nbsp;a&amp;nbsp;character&amp;nbsp;to&amp;nbsp;the&amp;nbsp;USART&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;USART_SendData(USART1,&amp;nbsp;(uint8_t)&amp;nbsp;ch);
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Loop&amp;nbsp;until&amp;nbsp;the&amp;nbsp;end&amp;nbsp;of&amp;nbsp;transmission&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(USART_GetFlagStatus(USART1,&amp;nbsp;USART_FLAG_TXE)&amp;nbsp;==&amp;nbsp;RESET)
&amp;nbsp;&amp;nbsp;&amp;nbsp;{}
&amp;nbsp;
&amp;nbsp;}
&amp;nbsp;
&amp;nbsp;void&amp;nbsp;Usart_sendBuff(uint8_t&amp;nbsp;*buf,uint32_t&amp;nbsp;size)
{
	for(uint32_t&amp;nbsp;i=0;i&amp;lt;size;i++)
	{
		Usart_send(buf[i]);
	}
}

#include&amp;nbsp;&amp;quot;dma.h&amp;quot;
#include&amp;nbsp;&amp;quot;string.h&amp;quot;
//M&amp;nbsp;to&amp;nbsp;M
/*定义数组作为DMA传输数据源
*使用const关键字修饰,使其定义为常量类型,表示数据存储在内部的FLASH中
*/
const&amp;nbsp;uint32_t&amp;nbsp;DMA_S_Const_Buffer[BufferSIze]={
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x12345678,0x12345679,0x1234567A,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x1234567B,0x1234567C,0x1234567D,0x1234567E};

//定义DMA传输目标存储器,存储在内部的SRAM中
uint32_t&amp;nbsp;DMA_D_Buffer[BufferSIze];
uint8_t&amp;nbsp;DMA_D_Buffer_RX[BufferSIze];
void&amp;nbsp;Dma_Config()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_InitTypeDef&amp;nbsp;dma_InitStruct;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)&amp;amp;USART1-&amp;gt;DR;//当内存传内存时可看作数据的源
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryBaseAddr&amp;nbsp;=&amp;nbsp;(uint32_t)DMA_D_Buffer_RX;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_DIR&amp;nbsp;=&amp;nbsp;DMA_DIR_PeripheralSRC;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_BufferSize&amp;nbsp;=&amp;nbsp;BufferSIze;&amp;nbsp;//传输数目
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralInc&amp;nbsp;=&amp;nbsp;DMA_PeripheralInc_Disable;&amp;nbsp;//外设地址增量模式
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryInc&amp;nbsp;=&amp;nbsp;DMA_MemoryInc_Enable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_PeripheralDataSize&amp;nbsp;=&amp;nbsp;DMA_PeripheralDataSize_Byte;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_MemoryDataSize&amp;nbsp;=&amp;nbsp;DMA_MemoryDataSize_Byte;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Mode&amp;nbsp;=&amp;nbsp;DMA_Mode_Normal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_M2M&amp;nbsp;=&amp;nbsp;DMA_M2M_Disable;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dma_InitStruct.DMA_Priority&amp;nbsp;=&amp;nbsp;DMA_Priority_High&amp;nbsp;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Init(DMA1_Channel5,&amp;amp;dma_InitStruct);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DMA_Cmd(DMA1_Channel5,&amp;nbsp;ENABLE);
	
}


uint16_t&amp;nbsp;Get_Revbuf(uint8_t&amp;nbsp;*buf,uint32_t&amp;nbsp;size)
{
	uint16_t&amp;nbsp;count=0,len=0;
	memset(buf,0,size);
	if(DMA1_Channel5-&amp;gt;CNDTR&amp;nbsp;&amp;lt;&amp;nbsp;BufferSIze)
	{
		count&amp;nbsp;=&amp;nbsp;DMA1_Channel5-&amp;gt;CNDTR&amp;nbsp;;
		delay_ms(30);
		if(count==DMA1_Channel5-&amp;gt;CNDTR)
		{
			len&amp;nbsp;=&amp;nbsp;BufferSIze-count;
			for(int&amp;nbsp;i=0;i&amp;lt;len;i++)
			{
				buf[i]=DMA_D_Buffer_RX[i];
			}
			return&amp;nbsp;len;
		}
	}
	
	return&amp;nbsp;0;
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 12 Jun 2025 12:07:08 +0800</pubDate></item><item><title>esp32_C3使用VsCode编辑时引入一些头文件报红色波浪线的解决办法</title><link>https://blog.qiquanji.com/post/11117.html</link><description>&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;这个问题在使用VsCode时报红色波浪线,虽然说使用命令行编译也是没出错,但是出于强迫症得把红色波浪线去掉,所以下面是解决办法:&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1.若是&lt;/p&gt;&lt;div style=&quot;color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; line-height: 27px; white-space-collapse: preserve;&quot;&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;报红色波浪线,说明\.vscode\c_cpp_properties.json这个文件没有配置正确,需加入此行&lt;/p&gt;&lt;div style=&quot;color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; line-height: 27px; white-space-collapse: preserve;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;quot;compilerPath&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;${config:idf.toolsPath}&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;tools&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;riscv32-esp-elf&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;esp-13.2.0_20240530&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;riscv32-esp-elf&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;bin&lt;/span&gt;&lt;span style=&quot;color: #d7ba7d;&quot;&gt;\\&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;riscv32-esp-elf-gcc.exe&amp;quot;&lt;/span&gt;,&lt;/div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;p&gt;a&amp;gt;如果你使用的芯片是esp32/S3则需使用Xtense而不是riscv32&lt;/p&gt;&lt;p&gt;b&amp;gt;如果你没有这个文件,则ctrl+shift+p,输入ESP-IDF:Add vscode configuration folder,点击其即可.&lt;/p&gt;&lt;p&gt;2.若是freertos的头文件报波浪线&lt;/p&gt;&lt;div style=&quot;color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; line-height: 27px; white-space-collapse: preserve;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;freertos/FreeRTOS.h&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;freertos/task.h&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;也是在这个文件下添加&lt;/p&gt;&lt;div style=&quot;color: rgb(212, 212, 212); background-color: rgb(30, 30, 30); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; line-height: 27px; white-space-collapse: preserve;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;&amp;quot;compileCommands&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;${workspaceFolder}/build/compile_Commands.json&amp;quot;&lt;/span&gt;,&lt;/div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;p&gt;3.还有一个就是这两句有先后顺序,&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #C586C0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #569CD6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #CE9178;&quot;&gt;&amp;quot;freertos/FreeRTOS.h&amp;quot;这句得在&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #C586C0;&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #569CD6;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 20px; white-space: pre-wrap; background-color: #1E1E1E; color: #CE9178;&quot;&gt;&amp;quot;freertos/task.h&amp;quot;前面,要不然编译的时候出错.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sat, 29 Mar 2025 22:07:30 +0800</pubDate></item><item><title> can控制器 uds诊断完整代码（c写的keil项目）遵循iso sae J1939标准（stm32 N32 系列MCU可用）</title><link>https://blog.qiquanji.com/post/11116.html</link><description>&lt;p&gt;&lt;span style=&quot;color: #FF0000; font-family: 微软雅黑, &amp;quot;Microsoft Yahei&amp;quot;, PingFangSC-Regular, &amp;quot;Helvetica Neue&amp;quot;; font-size: 18px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;可以帮忙调试，QQ：778292363&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;color: #FF0000; font-family: 微软雅黑, &amp;quot;Microsoft Yahei&amp;quot;, PingFangSC-Regular, &amp;quot;Helvetica Neue&amp;quot;; font-size: 18px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/10/202410191729322617383976.png&quot; title=&quot;二维码.png&quot; alt=&quot;二维码.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Single Frame（SF）- 单帧；First Frame (FF)-第一帧；Consecutive Frame (CF)-连续帧；Flow Control (FC)-流控帧；N_PDU type-网络层协议控制单元类型；N_PCI-网络层协议控制信息；SF_DL-单帧 数据长度；FF_DL-首帧数据长度；SN-连续帧序列号；FS-流控状态；BS-块大小；STmin-连续帧最小时间间隔。&lt;/p&gt;&lt;p&gt;‌‌UDS（Unified Diagnostic Services，统一诊断服务）是一种用于汽车行业的标准化诊断协议，基于‌CAN总线进行通信。UDS服务是诊断服务的规范化标准，规定了读取DTC（故障码）的指令、读诊断数据流的指令等。它允许维修人员使用诊断设备通过CAN总线与汽车电子控制单元（‌ECU）进行通信，执行各种诊断任务，如读取故障码、控制ECU的功能、以及更新ECU的软件等。‌&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/10/202410191729320763179976.png&quot; title=&quot;11.png&quot; alt=&quot;11.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/10/202410191729320884408168.png&quot; title=&quot;22.png&quot; alt=&quot;22.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #333333; font-family: 微软雅黑, &amp;quot;Microsoft Yahei&amp;quot;, PingFangSC-Regular, &amp;quot;Helvetica Neue&amp;quot;; font-size: 17px; text-wrap-mode: wrap; background-color: #FFFFFF;&quot;&gt;整个项目完整代码已经在前装车载设备上使用：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;/***************************************************************************//**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\author&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\mail&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\version&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0.03&amp;nbsp;-&amp;nbsp;CANoe&amp;nbsp;Test&amp;nbsp;Passed
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\date&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2024-09-24
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;\description&amp;nbsp;&amp;nbsp;&amp;nbsp;uds&amp;nbsp;network&amp;nbsp;code,&amp;nbsp;base&amp;nbsp;on&amp;nbsp;ISO&amp;nbsp;15765
*******************************************************************************/
#include&amp;nbsp;&amp;quot;network_layer_private.h&amp;quot;
#include&amp;nbsp;&amp;quot;network_layer.h&amp;quot;
#include&amp;nbsp;&amp;quot;uds_api.h&amp;quot;
/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type&amp;nbsp;Definition
*******************************************************************************/

/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Global&amp;nbsp;Varaibles
*******************************************************************************/
static&amp;nbsp;network_layer_st&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_IDLE;

static&amp;nbsp;bool_t&amp;nbsp;g_wait_cf&amp;nbsp;=&amp;nbsp;FALSE;
static&amp;nbsp;bool_t&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;FALSE;

static&amp;nbsp;uint32_t&amp;nbsp;nt_timer[TIMER_CNT]&amp;nbsp;=&amp;nbsp;{0};

static&amp;nbsp;uint8_t&amp;nbsp;g_rfc_stmin&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;received&amp;nbsp;flowcontrol&amp;nbsp;SeparationTime&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;g_rfc_bs&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;received&amp;nbsp;flowcontrol&amp;nbsp;block&amp;nbsp;size&amp;nbsp;*/

static&amp;nbsp;uint8_t&amp;nbsp;g_xcf_bc&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;transmit&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;block&amp;nbsp;counter&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;g_xcf_sn&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;transmit&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;SequenceNumber&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;g_rcf_bc&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;received&amp;nbsp;frame&amp;nbsp;block&amp;nbsp;counter&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;g_rcf_sn&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;received&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;SequenceNumber&amp;nbsp;*/

/*&amp;nbsp;transmit&amp;nbsp;buffer&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;remain_buf[UDS_FF_DL_MAX];
static&amp;nbsp;uint16_t&amp;nbsp;remain_len&amp;nbsp;=&amp;nbsp;0;
static&amp;nbsp;uint16_t&amp;nbsp;remain_pos&amp;nbsp;=&amp;nbsp;0;

/*&amp;nbsp;recieve&amp;nbsp;buffer&amp;nbsp;*/
static&amp;nbsp;uint8_t&amp;nbsp;recv_buf[UDS_FF_DL_MAX];
static&amp;nbsp;uint16_t&amp;nbsp;recv_len&amp;nbsp;=&amp;nbsp;0;
static&amp;nbsp;uint16_t&amp;nbsp;recv_fdl&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;len&amp;nbsp;*/


//OS_EVENT&amp;nbsp;*UdsMutex;

/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Function&amp;nbsp;&amp;nbsp;declaration
*******************************************************************************/
static&amp;nbsp;void
send_flowcontrol&amp;nbsp;(uint8_t&amp;nbsp;flow_st);

//static&amp;nbsp;indication_func&amp;nbsp;uds_indication&amp;nbsp;=&amp;nbsp;NULL;
//static&amp;nbsp;confirm_func&amp;nbsp;uds_confirm&amp;nbsp;=&amp;nbsp;NULL;

static&amp;nbsp;nt_usdata_t&amp;nbsp;N_USData&amp;nbsp;=&amp;nbsp;{NULL,&amp;nbsp;NULL,&amp;nbsp;NULL};
/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Function&amp;nbsp;&amp;nbsp;Definition&amp;nbsp;-&amp;nbsp;common
*******************************************************************************/

/**
&amp;nbsp;*&amp;nbsp;nt_timer_start&amp;nbsp;-&amp;nbsp;start&amp;nbsp;network&amp;nbsp;timer
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;void&amp;nbsp;:
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
nt_timer_start&amp;nbsp;(uint8_t&amp;nbsp;num)
{
	if&amp;nbsp;(num&amp;nbsp;&amp;gt;=&amp;nbsp;TIMER_CNT)&amp;nbsp;return;

	if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_N_CR)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_N_CR]&amp;nbsp;=&amp;nbsp;TIMEOUT_N_CR;
	if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_N_BS)
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_N_BS]&amp;nbsp;=&amp;nbsp;TIMEOUT_N_BS;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_STmin)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_STmin]&amp;nbsp;=&amp;nbsp;g_rfc_stmin;
}

static&amp;nbsp;void
nt_timer_start_wv&amp;nbsp;(uint8_t&amp;nbsp;num,&amp;nbsp;uint32_t&amp;nbsp;value)
{
	if&amp;nbsp;(num&amp;nbsp;&amp;gt;=&amp;nbsp;TIMER_CNT)&amp;nbsp;return;

	if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_N_CR)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_N_CR]&amp;nbsp;=&amp;nbsp;value;
	if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_N_BS)
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_N_BS]&amp;nbsp;=&amp;nbsp;value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(num&amp;nbsp;==&amp;nbsp;TIMER_STmin)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[TIMER_STmin]&amp;nbsp;=&amp;nbsp;value;
}

static&amp;nbsp;void
nt_timer_stop&amp;nbsp;(uint8_t&amp;nbsp;num)
{
	if&amp;nbsp;(num&amp;nbsp;&amp;gt;=&amp;nbsp;TIMER_CNT)&amp;nbsp;return;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[num]&amp;nbsp;=&amp;nbsp;0;
}

/**
&amp;nbsp;*&amp;nbsp;nt_timer_run&amp;nbsp;-&amp;nbsp;run&amp;nbsp;a&amp;nbsp;network&amp;nbsp;timer,&amp;nbsp;should&amp;nbsp;be&amp;nbsp;invoked&amp;nbsp;per&amp;nbsp;1ms
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;void&amp;nbsp;:
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;timer&amp;nbsp;is&amp;nbsp;not&amp;nbsp;running,&amp;nbsp;1&amp;nbsp;-&amp;nbsp;timer&amp;nbsp;is&amp;nbsp;running,&amp;nbsp;-1&amp;nbsp;-&amp;nbsp;a&amp;nbsp;timeout&amp;nbsp;occur
&amp;nbsp;*/
static&amp;nbsp;int
nt_timer_run&amp;nbsp;(uint8_t&amp;nbsp;num)
{
	if&amp;nbsp;(num&amp;nbsp;&amp;gt;=&amp;nbsp;TIMER_CNT)&amp;nbsp;return&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nt_timer[num]&amp;nbsp;==&amp;nbsp;0)
	{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
	}
	else&amp;nbsp;if&amp;nbsp;(nt_timer[num]&amp;nbsp;==&amp;nbsp;1)
	{
		nt_timer[num]&amp;nbsp;=&amp;nbsp;0;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
	}
	else
	{
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;if&amp;nbsp;(nt_timer[num]&amp;nbsp;&amp;gt;&amp;nbsp;1)&amp;nbsp;*/
		nt_timer[num]--;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;
	}

}

/**
&amp;nbsp;*&amp;nbsp;nt_timer_chk&amp;nbsp;-&amp;nbsp;check&amp;nbsp;a&amp;nbsp;network&amp;nbsp;timer&amp;nbsp;and&amp;nbsp;stop&amp;nbsp;it
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;num&amp;nbsp;:
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;timer&amp;nbsp;is&amp;nbsp;not&amp;nbsp;running,&amp;nbsp;1&amp;nbsp;-&amp;nbsp;timer&amp;nbsp;is&amp;nbsp;running,
&amp;nbsp;*/
static&amp;nbsp;int
nt_timer_chk&amp;nbsp;(uint8_t&amp;nbsp;num)
{
	if&amp;nbsp;(num&amp;nbsp;&amp;gt;=&amp;nbsp;TIMER_CNT)&amp;nbsp;return&amp;nbsp;0;

	if&amp;nbsp;(nt_timer[num]&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[num]&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;/*&amp;nbsp;stop&amp;nbsp;timer&amp;nbsp;*/
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
	else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer[num]&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;/*&amp;nbsp;stop&amp;nbsp;timer&amp;nbsp;*/
		return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}


/**
&amp;nbsp;*&amp;nbsp;clear_network&amp;nbsp;-&amp;nbsp;clear&amp;nbsp;network&amp;nbsp;status
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;void&amp;nbsp;:
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
clear_network&amp;nbsp;(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_IDLE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_cf&amp;nbsp;=&amp;nbsp;FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_bc&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_sn&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_bc&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_sn&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(num&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;num&amp;nbsp;&amp;lt;&amp;nbsp;TIMER_CNT;&amp;nbsp;num++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_stop&amp;nbsp;(num);
}

/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Function&amp;nbsp;&amp;nbsp;Definition&amp;nbsp;-&amp;nbsp;recieve
*******************************************************************************/
/**
&amp;nbsp;*&amp;nbsp;recv_singleframe&amp;nbsp;-&amp;nbsp;recieved&amp;nbsp;a&amp;nbsp;single&amp;nbsp;frame&amp;nbsp;from&amp;nbsp;CAN
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@frame_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@frame_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
recv_singleframe&amp;nbsp;(uint8_t&amp;nbsp;frame_buf[],&amp;nbsp;uint8_t&amp;nbsp;frame_dlc)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint16_t&amp;nbsp;i,&amp;nbsp;uds_dlc;
//	uint8_t&amp;nbsp;service_id;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uds_dlc&amp;nbsp;=&amp;nbsp;NT_GET_SF_DL&amp;nbsp;(frame_buf[0]);

//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service_id&amp;nbsp;=&amp;nbsp;frame_buf[1];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/************************************/

#ifdef&amp;nbsp;UDS_CAN_ID_STD
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uds_dlc&amp;nbsp;&amp;gt;&amp;nbsp;7&amp;nbsp;||&amp;nbsp;uds_dlc&amp;nbsp;==&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
#else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uds_dlc&amp;nbsp;&amp;gt;&amp;nbsp;6&amp;nbsp;||&amp;nbsp;uds_dlc&amp;nbsp;==&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
#endif

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_fdl&amp;nbsp;=&amp;nbsp;uds_dlc;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;frame_dlc&amp;nbsp;-&amp;nbsp;1;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_buf[i]&amp;nbsp;=&amp;nbsp;frame_buf[1+i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_len&amp;nbsp;=&amp;nbsp;frame_dlc&amp;nbsp;-&amp;nbsp;1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_fdl,&amp;nbsp;N_OK);
}
/**
&amp;nbsp;*&amp;nbsp;recv_firstframe&amp;nbsp;-&amp;nbsp;recieved&amp;nbsp;a&amp;nbsp;firt&amp;nbsp;frame&amp;nbsp;from&amp;nbsp;CAN
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service&amp;nbsp;:&amp;nbsp;L_Data.indication&amp;nbsp;(FF)
&amp;nbsp;*&amp;nbsp;@frame_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@frame_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;recv&amp;nbsp;a&amp;nbsp;right&amp;nbsp;frame,&amp;nbsp;other&amp;nbsp;-&amp;nbsp;err&amp;nbsp;
&amp;nbsp;*/
static&amp;nbsp;int
recv_firstframe&amp;nbsp;(uint8_t&amp;nbsp;frame_buf[],&amp;nbsp;uint8_t&amp;nbsp;frame_dlc)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint16_t&amp;nbsp;i;
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;service_id;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint16_t&amp;nbsp;uds_dlc;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uds_dlc&amp;nbsp;=&amp;nbsp;((uint16_t)(frame_buf[0]&amp;amp;0x0f))&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uds_dlc&amp;nbsp;|=&amp;nbsp;frame_buf[1];

//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service_id&amp;nbsp;=&amp;nbsp;frame_buf[2];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/************************************/

#ifdef&amp;nbsp;UDS_CAN_ID_STD
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uds_dlc&amp;nbsp;&amp;lt;&amp;nbsp;8)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
#else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uds_dlc&amp;nbsp;&amp;lt;&amp;nbsp;7)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
#endif
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;if&amp;nbsp;FF_DL&amp;nbsp;is&amp;nbsp;greater&amp;nbsp;than&amp;nbsp;the&amp;nbsp;available&amp;nbsp;receiver&amp;nbsp;buffer&amp;nbsp;size
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;abort&amp;nbsp;the&amp;nbsp;message&amp;nbsp;reception&amp;nbsp;and&amp;nbsp;send
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;an&amp;nbsp;FC&amp;nbsp;N_PDU&amp;nbsp;with&amp;nbsp;Overflow.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(uds_dlc&amp;nbsp;&amp;gt;=&amp;nbsp;UDS_FF_DL_MAX)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_flowcontrol&amp;nbsp;(FS_OVFLW);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_fdl&amp;nbsp;=&amp;nbsp;uds_dlc;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;frame_dlc&amp;nbsp;-&amp;nbsp;2;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_buf[i]&amp;nbsp;=&amp;nbsp;frame_buf[2+i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_len&amp;nbsp;=&amp;nbsp;frame_dlc&amp;nbsp;-&amp;nbsp;2;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;after&amp;nbsp;received&amp;nbsp;first&amp;nbsp;frame,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;send&amp;nbsp;flowcontrol&amp;nbsp;frame&amp;nbsp;and&amp;nbsp;wait&amp;nbsp;consecutive&amp;nbsp;frame,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_flowcontrol&amp;nbsp;(FS_CTS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_bc&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_cf&amp;nbsp;=&amp;nbsp;TRUE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start(TIMER_N_CR);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;claer&amp;nbsp;the&amp;nbsp;consecutive&amp;nbsp;frane0&amp;nbsp;sn&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_sn&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.ffindication&amp;nbsp;(uds_dlc);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;
}

/**
&amp;nbsp;*&amp;nbsp;recv_consecutiveframe&amp;nbsp;-&amp;nbsp;recieved&amp;nbsp;a&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;from&amp;nbsp;CAN
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service:&amp;nbsp;L_Data.indication&amp;nbsp;(CF)
&amp;nbsp;*&amp;nbsp;@frame_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@frame_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;recv&amp;nbsp;end,&amp;nbsp;1&amp;nbsp;-&amp;nbsp;recv&amp;nbsp;continue,&amp;nbsp;other&amp;nbsp;-&amp;nbsp;err
&amp;nbsp;*/
static&amp;nbsp;int
recv_consecutiveframe&amp;nbsp;(uint8_t&amp;nbsp;frame_buf[],&amp;nbsp;uint8_t&amp;nbsp;frame_dlc)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;cf_sn;
	uint16_t&amp;nbsp;i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cf_sn&amp;nbsp;=&amp;nbsp;NT_GET_CF_SN&amp;nbsp;(frame_buf[0]);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;if&amp;nbsp;N_Cr&amp;nbsp;timeout,&amp;nbsp;Abort&amp;nbsp;message&amp;nbsp;transmission&amp;nbsp;and&amp;nbsp;issue&amp;nbsp;N_TIMEOUT_Cr&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(nt_timer_chk&amp;nbsp;(TIMER_N_CR)&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;-1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_sn++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(g_rcf_sn&amp;nbsp;&amp;gt;&amp;nbsp;0x0f)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_sn&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(g_rcf_sn&amp;nbsp;!=&amp;nbsp;cf_sn)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_len,&amp;nbsp;N_WRONG_SN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;UDS_CF_DL_COM;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_buf[recv_len+i]&amp;nbsp;=&amp;nbsp;frame_buf[1+i];&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_len&amp;nbsp;+=&amp;nbsp;UDS_CF_DL_COM;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(recv_len&amp;nbsp;&amp;gt;=&amp;nbsp;recv_fdl)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_cf&amp;nbsp;=&amp;nbsp;FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_fdl,&amp;nbsp;N_OK);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(NT_XMIT_FC_BS&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_bc++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(g_rcf_bc&amp;nbsp;&amp;gt;=&amp;nbsp;NT_XMIT_FC_BS)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;after&amp;nbsp;NT_XMIT_FC_BS&amp;nbsp;consecutive&amp;nbsp;frames,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;send&amp;nbsp;flowcontrol&amp;nbsp;frame&amp;nbsp;and&amp;nbsp;wait&amp;nbsp;consecutive&amp;nbsp;frame,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_flowcontrol&amp;nbsp;(FS_CTS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rcf_bc&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_cf&amp;nbsp;=&amp;nbsp;TRUE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start(TIMER_N_CR);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

/**
&amp;nbsp;*&amp;nbsp;recv_flowcontrolframe&amp;nbsp;-&amp;nbsp;process&amp;nbsp;uds&amp;nbsp;flowc&amp;nbsp;control&amp;nbsp;frame
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service:&amp;nbsp;L_Data.indication&amp;nbsp;(FC)
&amp;nbsp;*&amp;nbsp;@frame_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@frame_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;recv&amp;nbsp;CTS,&amp;nbsp;1&amp;nbsp;-&amp;nbsp;recv&amp;nbsp;WT,&amp;nbsp;other&amp;nbsp;-&amp;nbsp;err
&amp;nbsp;*/
static&amp;nbsp;int
recv_flowcontrolframe&amp;nbsp;(uint8_t&amp;nbsp;frame_buf[],&amp;nbsp;uint8_t&amp;nbsp;frame_dlc)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;fc_fs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fc_fs&amp;nbsp;=&amp;nbsp;NT_GET_FC_FS&amp;nbsp;(frame_buf[0]);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;if&amp;nbsp;N_Bs&amp;nbsp;timeout,&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Abort&amp;nbsp;message&amp;nbsp;transmission&amp;nbsp;and&amp;nbsp;issue&amp;nbsp;N_TIMEOUT_Bs,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;if&amp;nbsp;not&amp;nbsp;timeout,&amp;nbsp;stop&amp;nbsp;the&amp;nbsp;timer.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(nt_timer_chk&amp;nbsp;(TIMER_N_BS)&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;-1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Got&amp;nbsp;from&amp;nbsp;CANoe&amp;nbsp;Test:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;After&amp;nbsp;the&amp;nbsp;First&amp;nbsp;frame&amp;nbsp;is&amp;nbsp;received&amp;nbsp;the&amp;nbsp;Tester&amp;nbsp;sends&amp;nbsp;a&amp;nbsp;functional
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;adressed&amp;nbsp;Flow&amp;nbsp;control.&amp;nbsp;ECU&amp;nbsp;must&amp;nbsp;abort&amp;nbsp;sending&amp;nbsp;of&amp;nbsp;the&amp;nbsp;response
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//if&amp;nbsp;(g_tatype&amp;nbsp;==&amp;nbsp;N_TATYPE_FUNCTIONAL)&amp;nbsp;return&amp;nbsp;-1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;FALSE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fc_fs&amp;nbsp;&amp;gt;=&amp;nbsp;FS_RESERVED)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.confirm&amp;nbsp;(N_INVALID_FS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-2;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fc_fs&amp;nbsp;==&amp;nbsp;FS_OVFLW)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.confirm&amp;nbsp;(N_BUFFER_OVFLW);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-3;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fc_fs&amp;nbsp;==&amp;nbsp;FS_WT)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;TRUE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start&amp;nbsp;(TIMER_N_BS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;get&amp;nbsp;the&amp;nbsp;fc&amp;nbsp;block&amp;nbsp;size&amp;nbsp;and&amp;nbsp;stmin
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rfc_bs&amp;nbsp;=&amp;nbsp;frame_buf[1];
	if&amp;nbsp;(frame_buf[2]&amp;nbsp;&amp;lt;=&amp;nbsp;0x7f)
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rfc_stmin&amp;nbsp;=&amp;nbsp;frame_buf[2]+1;
	else
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_rfc_stmin&amp;nbsp;=&amp;nbsp;0x7f;&amp;nbsp;/*&amp;nbsp;127&amp;nbsp;ms&amp;nbsp;*/

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;start&amp;nbsp;to&amp;nbsp;transmit&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_bc&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start_wv&amp;nbsp;(TIMER_STmin,&amp;nbsp;1);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}

/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Function&amp;nbsp;&amp;nbsp;Definition&amp;nbsp;-&amp;nbsp;send
*******************************************************************************/

/**
&amp;nbsp;*&amp;nbsp;send_flowcontrol&amp;nbsp;-&amp;nbsp;send&amp;nbsp;flowcontrol&amp;nbsp;frame
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service:&amp;nbsp;L_Data.confirm&amp;nbsp;(FC)
&amp;nbsp;*&amp;nbsp;@flow_st&amp;nbsp;:&amp;nbsp;flow&amp;nbsp;status
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
send_flowcontrol&amp;nbsp;(uint8_t&amp;nbsp;flow_st)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;send_buf[UDS_VALID_FRAME_LEN]&amp;nbsp;=&amp;nbsp;{0};
		memset(send_buf,&amp;nbsp;0xcc,&amp;nbsp;UDS_VALID_FRAME_LEN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[0]&amp;nbsp;=&amp;nbsp;NT_SET_PCI_TYPE_FC&amp;nbsp;(flow_st);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[1]&amp;nbsp;=&amp;nbsp;NT_XMIT_FC_BS;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[2]&amp;nbsp;=&amp;nbsp;NT_XMIT_FC_STMIN;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ZTai_UDS_Send&amp;nbsp;(send_buf,&amp;nbsp;UDS_VALID_FRAME_LEN);

}

/**
&amp;nbsp;*&amp;nbsp;send_singleframe&amp;nbsp;-&amp;nbsp;send&amp;nbsp;a&amp;nbsp;single&amp;nbsp;frame&amp;nbsp;msg
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@msg_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@msg_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
send_singleframe&amp;nbsp;(uint8_t&amp;nbsp;msg_buf[],&amp;nbsp;uint16_t&amp;nbsp;msg_dlc)
{
	uint16_t&amp;nbsp;i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;send_buf[UDS_VALID_FRAME_LEN]&amp;nbsp;=&amp;nbsp;{0};
		memset(send_buf,&amp;nbsp;0xcc,&amp;nbsp;UDS_VALID_FRAME_LEN);

	if&amp;nbsp;(msg_dlc&amp;nbsp;==&amp;nbsp;0&amp;nbsp;||&amp;nbsp;msg_dlc&amp;nbsp;&amp;gt;&amp;nbsp;UDS_SF_DL_MAX)&amp;nbsp;return;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[0]&amp;nbsp;=&amp;nbsp;NT_SET_PCI_TYPE_SF&amp;nbsp;((uint8_t)msg_dlc);
	for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;msg_dlc;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[1+i]&amp;nbsp;=&amp;nbsp;msg_buf[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ZTai_UDS_Send&amp;nbsp;(send_buf,&amp;nbsp;UDS_VALID_FRAME_LEN);

}


/**
&amp;nbsp;*&amp;nbsp;send_firstframe&amp;nbsp;-&amp;nbsp;send&amp;nbsp;a&amp;nbsp;first&amp;nbsp;frame&amp;nbsp;data
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service&amp;nbsp;:&amp;nbsp;L_Data.confirm&amp;nbsp;(FF)
&amp;nbsp;*&amp;nbsp;@msg_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@msg_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int
&amp;nbsp;*/
static&amp;nbsp;int
send_firstframe&amp;nbsp;(uint8_t&amp;nbsp;msg_buf[],&amp;nbsp;uint16_t&amp;nbsp;msg_dlc)
{
	uint16_t&amp;nbsp;i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;send_buf[UDS_VALID_FRAME_LEN]&amp;nbsp;=&amp;nbsp;{0};
		memset(send_buf,&amp;nbsp;0xcc,&amp;nbsp;UDS_VALID_FRAME_LEN);

	if&amp;nbsp;(msg_dlc&amp;nbsp;&amp;lt;&amp;nbsp;UDS_FF_DL_MIN&amp;nbsp;||&amp;nbsp;msg_dlc&amp;nbsp;&amp;gt;&amp;nbsp;UDS_FF_DL_MAX)&amp;nbsp;return&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[0]&amp;nbsp;=&amp;nbsp;NT_SET_PCI_TYPE_FF&amp;nbsp;((uint8_t)(msg_dlc&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;8));
	send_buf[1]&amp;nbsp;=&amp;nbsp;(uint8_t)(msg_dlc&amp;nbsp;&amp;amp;&amp;nbsp;0x00ff);
	for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;UDS_VALID_FRAME_LEN-2;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[2+i]&amp;nbsp;=&amp;nbsp;msg_buf[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ZTai_UDS_Send&amp;nbsp;(send_buf,&amp;nbsp;UDS_VALID_FRAME_LEN);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;start&amp;nbsp;N_Bs&amp;nbsp;and&amp;nbsp;wait&amp;nbsp;for&amp;nbsp;a&amp;nbsp;fc.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;TRUE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start&amp;nbsp;(TIMER_N_BS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
	return&amp;nbsp;UDS_VALID_FRAME_LEN-2;
}


/**
&amp;nbsp;*&amp;nbsp;send_consecutiveframe&amp;nbsp;-&amp;nbsp;send&amp;nbsp;consecutive&amp;nbsp;frame&amp;nbsp;data
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;service&amp;nbsp;:&amp;nbsp;L_Data.confirm&amp;nbsp;(CF)
&amp;nbsp;*&amp;nbsp;@msg_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@msg_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int
&amp;nbsp;*/
static&amp;nbsp;int
send_consecutiveframe&amp;nbsp;(uint8_t&amp;nbsp;msg_buf[],&amp;nbsp;uint16_t&amp;nbsp;msg_dlc,&amp;nbsp;uint8_t&amp;nbsp;frame_sn)
{
	uint16_t&amp;nbsp;i;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;send_buf[UDS_VALID_FRAME_LEN]&amp;nbsp;=&amp;nbsp;{0};
		memset(send_buf,&amp;nbsp;0xcc,&amp;nbsp;UDS_VALID_FRAME_LEN);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[0]&amp;nbsp;=&amp;nbsp;NT_SET_PCI_TYPE_CF&amp;nbsp;(frame_sn);
	for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;msg_dlc&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;UDS_CF_DL_COM;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[1+i]&amp;nbsp;=&amp;nbsp;msg_buf[i];
	for&amp;nbsp;(;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;UDS_CF_DL_COM;&amp;nbsp;i++)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_buf[1+i]&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ZTai_UDS_Send&amp;nbsp;(send_buf,&amp;nbsp;UDS_VALID_FRAME_LEN);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(msg_dlc&amp;nbsp;&amp;gt;&amp;nbsp;UDS_CF_DL_COM)
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;UDS_CF_DL_COM;
	else
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;msg_dlc;
}
/**
&amp;nbsp;*&amp;nbsp;send_multipleframe&amp;nbsp;-&amp;nbsp;send&amp;nbsp;a&amp;nbsp;multiple&amp;nbsp;frame&amp;nbsp;msg
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@msg_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@msg_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
static&amp;nbsp;void
send_multipleframe&amp;nbsp;(uint8_t&amp;nbsp;msg_buf[],&amp;nbsp;uint16_t&amp;nbsp;msg_dlc)
{
	uint16_t&amp;nbsp;i;
	uint8_t&amp;nbsp;send_len;

	if&amp;nbsp;(msg_dlc&amp;nbsp;&amp;lt;&amp;nbsp;UDS_FF_DL_MIN&amp;nbsp;||&amp;nbsp;msg_dlc&amp;nbsp;&amp;gt;&amp;nbsp;UDS_FF_DL_MAX)&amp;nbsp;return;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;msg_dlc;&amp;nbsp;i++)
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remain_buf[i]&amp;nbsp;=&amp;nbsp;msg_buf[i];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_sn&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_len&amp;nbsp;=&amp;nbsp;send_firstframe&amp;nbsp;(msg_buf,&amp;nbsp;msg_dlc);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;remain_pos&amp;nbsp;=&amp;nbsp;send_len;
	remain_len&amp;nbsp;=&amp;nbsp;msg_dlc&amp;nbsp;-&amp;nbsp;send_len;
}
/*******************************************************************************
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Function&amp;nbsp;&amp;nbsp;Definition&amp;nbsp;-&amp;nbsp;external&amp;nbsp;API
*******************************************************************************/

/**
&amp;nbsp;*&amp;nbsp;network_main&amp;nbsp;-&amp;nbsp;network&amp;nbsp;main&amp;nbsp;task,&amp;nbsp;should&amp;nbsp;be&amp;nbsp;schedule&amp;nbsp;every&amp;nbsp;one&amp;nbsp;ms
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@void
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
extern&amp;nbsp;void
network_main&amp;nbsp;(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;send_len;
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;err;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nt_timer_run&amp;nbsp;(TIMER_N_CR)&amp;nbsp;&amp;lt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_len,&amp;nbsp;N_TIMEOUT_Cr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nt_timer_run&amp;nbsp;(TIMER_N_BS)&amp;nbsp;&amp;lt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.confirm&amp;nbsp;(N_TIMEOUT_Bs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

	if&amp;nbsp;(nt_timer_run&amp;nbsp;(TIMER_STmin)&amp;nbsp;&amp;lt;&amp;nbsp;0)
	{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_sn++;
		if&amp;nbsp;(g_xcf_sn&amp;nbsp;&amp;gt;&amp;nbsp;0x0f)
		&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_sn&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSMutexPend(UdsMutex,0,&amp;amp;err);
		send_len&amp;nbsp;=&amp;nbsp;send_consecutiveframe&amp;nbsp;(&amp;amp;remain_buf[remain_pos],&amp;nbsp;remain_len,&amp;nbsp;g_xcf_sn);
		remain_pos&amp;nbsp;+=&amp;nbsp;send_len;
		remain_len&amp;nbsp;-=&amp;nbsp;send_len;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(remain_len&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(g_rfc_bs&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_xcf_bc++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(g_xcf_bc&amp;nbsp;&amp;lt;&amp;nbsp;g_rfc_bs)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start&amp;nbsp;(TIMER_STmin);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;start&amp;nbsp;N_Bs&amp;nbsp;and&amp;nbsp;wait&amp;nbsp;for&amp;nbsp;a&amp;nbsp;fc.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_wait_fc&amp;nbsp;=&amp;nbsp;TRUE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start&amp;nbsp;(TIMER_N_BS);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nt_timer_start&amp;nbsp;(TIMER_STmin);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSMutexPost(UdsMutex);
	}
}
/**
&amp;nbsp;*&amp;nbsp;network_recv_frame&amp;nbsp;-&amp;nbsp;recieved&amp;nbsp;uds&amp;nbsp;network&amp;nbsp;can&amp;nbsp;frame
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@func_addr&amp;nbsp;:&amp;nbsp;0&amp;nbsp;-&amp;nbsp;physical&amp;nbsp;addr,&amp;nbsp;1&amp;nbsp;-&amp;nbsp;functional&amp;nbsp;addr
&amp;nbsp;*&amp;nbsp;@frame_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@frame_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;can&amp;nbsp;frame&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
extern&amp;nbsp;void
network_recv_frame&amp;nbsp;(uint8_t&amp;nbsp;func_addr,&amp;nbsp;uint8_t&amp;nbsp;frame_buf[],&amp;nbsp;uint8_t&amp;nbsp;frame_dlc)
{
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;err;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;pci_type;&amp;nbsp;/*&amp;nbsp;protocol&amp;nbsp;control&amp;nbsp;information&amp;nbsp;type&amp;nbsp;*/


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;The&amp;nbsp;reception&amp;nbsp;of&amp;nbsp;a&amp;nbsp;CAN&amp;nbsp;frame&amp;nbsp;with&amp;nbsp;a&amp;nbsp;DLC&amp;nbsp;value
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;smaller&amp;nbsp;than&amp;nbsp;expected&amp;nbsp;shall&amp;nbsp;be&amp;nbsp;ignored&amp;nbsp;by&amp;nbsp;the&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;network&amp;nbsp;layer&amp;nbsp;without&amp;nbsp;any&amp;nbsp;further&amp;nbsp;action
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(frame_dlc&amp;nbsp;!=&amp;nbsp;UDS_VALID_FRAME_LEN)&amp;nbsp;return;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(func_addr&amp;nbsp;==&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_tatype&amp;nbsp;=&amp;nbsp;N_TATYPE_PHYSICAL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;g_tatype&amp;nbsp;=&amp;nbsp;N_TATYPE_FUNCTIONAL;

&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;OSMutexPend(UdsMutex,0,&amp;amp;err);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pci_type&amp;nbsp;=&amp;nbsp;NT_GET_PCI_TYPE&amp;nbsp;(frame_buf[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch(pci_type)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;PCI_SF:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_RECV&amp;nbsp;||&amp;nbsp;nwl_st&amp;nbsp;==&amp;nbsp;NWL_IDLE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_RECV)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_len,&amp;nbsp;N_UNEXP_PDU);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;recv_singleframe&amp;nbsp;(frame_buf,&amp;nbsp;frame_dlc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;PCI_FF:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_RECV&amp;nbsp;||&amp;nbsp;nwl_st&amp;nbsp;==&amp;nbsp;NWL_IDLE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_RECV)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData.indication&amp;nbsp;(recv_buf,&amp;nbsp;recv_len,&amp;nbsp;N_UNEXP_PDU);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(recv_firstframe&amp;nbsp;(frame_buf,&amp;nbsp;frame_dlc)&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_RECV;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_IDLE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;PCI_CF:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_RECV&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;g_wait_cf&amp;nbsp;==&amp;nbsp;TRUE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(recv_consecutiveframe&amp;nbsp;(frame_buf,&amp;nbsp;frame_dlc)&amp;nbsp;&amp;lt;=&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_IDLE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;PCI_FC:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(nwl_st&amp;nbsp;==&amp;nbsp;NWL_XMIT&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;g_wait_fc&amp;nbsp;==&amp;nbsp;TRUE)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(recv_flowcontrolframe&amp;nbsp;(frame_buf,&amp;nbsp;frame_dlc)&amp;nbsp;&amp;lt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clear_network&amp;nbsp;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_IDLE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSMutexPost(UdsMutex);
}

/**
&amp;nbsp;*&amp;nbsp;network_send_udsmsg&amp;nbsp;-&amp;nbsp;send&amp;nbsp;a&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;by&amp;nbsp;can
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@msg_buf&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;buffer
&amp;nbsp;*&amp;nbsp;@msg_dlc&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;length
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void
&amp;nbsp;*/
extern&amp;nbsp;void
network_send_udsmsg&amp;nbsp;(uint8_t&amp;nbsp;msg_buf[],&amp;nbsp;uint16_t&amp;nbsp;msg_dlc)
{

	if&amp;nbsp;(msg_dlc&amp;nbsp;==&amp;nbsp;0&amp;nbsp;||&amp;nbsp;msg_dlc&amp;nbsp;&amp;gt;&amp;nbsp;UDS_FF_DL_MAX)&amp;nbsp;return;

	if&amp;nbsp;(msg_dlc&amp;nbsp;&amp;lt;=&amp;nbsp;UDS_SF_DL_MAX)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_singleframe&amp;nbsp;(msg_buf,&amp;nbsp;msg_dlc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
	else
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nwl_st&amp;nbsp;=&amp;nbsp;NWL_XMIT;
	&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;send_multipleframe&amp;nbsp;(msg_buf,&amp;nbsp;msg_dlc);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

/**
&amp;nbsp;*&amp;nbsp;network_reg_usdata&amp;nbsp;-&amp;nbsp;reg&amp;nbsp;usdata&amp;nbsp;Function
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;@usdata&amp;nbsp;:&amp;nbsp;uds&amp;nbsp;msg&amp;nbsp;data&amp;nbsp;Function&amp;nbsp;struct
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;returns:
&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;-&amp;nbsp;ok,&amp;nbsp;other&amp;nbsp;-&amp;nbsp;err
&amp;nbsp;*/
extern&amp;nbsp;int
network_reg_usdata&amp;nbsp;(nt_usdata_t&amp;nbsp;usdata)
{
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint8_t&amp;nbsp;err;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(usdata.ffindication&amp;nbsp;==&amp;nbsp;NULL&amp;nbsp;||&amp;nbsp;usdata.indication&amp;nbsp;==&amp;nbsp;NULL&amp;nbsp;||&amp;nbsp;usdata.confirm&amp;nbsp;==&amp;nbsp;NULL)&amp;nbsp;return&amp;nbsp;-1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;N_USData&amp;nbsp;=&amp;nbsp;usdata;

&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;UdsMutex&amp;nbsp;=&amp;nbsp;OSMutexCreate(5,&amp;nbsp;&amp;amp;err);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}
/****************EOF****************/&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 19 Oct 2024 15:25:25 +0800</pubDate></item><item><title>can控制器 Bootloader刷新流程，及其完整代码c写的（stm32 N32 系列MCU可用）</title><link>https://blog.qiquanji.com/post/11114.html</link><description>&lt;p style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;color: #FF0000; font-family: 微软雅黑, &amp;quot;Microsoft Yahei&amp;quot;, PingFangSC-Regular, &amp;quot;Helvetica Neue&amp;quot;; font-size: 18px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;可以帮忙调试，QQ：778292363&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409231727080450639708.png&quot; title=&quot;html.png&quot; alt=&quot;html.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;Bootloader是在ECU上电初始化时运行的一段代码，它通过can线接收来自上位机的命令，将数据写进ECU的指定Flash区段中。 本文件主要约束控制器(以下简称ECU)的Bootloader数据刷写流程。该项目中BT刷新流程采用UDS统一诊断服务来实现。&lt;/p&gt;&lt;p&gt;该项目需要将ECU待刷写的区域划分成逻辑块，并对每个块进行编号，每个块的大小和起始地址一经确定，后续不允许修改，需要供应商根据功能类别进行准确定位。本项目对ECU的块的个数有限制要求，根据待刷写程序的类别，要求擦除程序、引导程序、应用程序、应用数据各自只能有1个逻辑块。如果同种类型有多个块，请与陕汽刷写工程师联系确定最终状态。&amp;nbsp;&lt;/p&gt;&lt;p&gt;待刷写的ECU内部不需要内置擦除程序，擦除程序的块号编号为0，每次刷写时都需要从数据管理平台上下载；引导程序的块编号为1，应用程序的块编号为2，应用数据的块编号为3。&amp;nbsp;&lt;/p&gt;&lt;p&gt;块的使用体现34服务和31服务上，在34服务中表示即将传输的程序的块编号，31服务中表示需要对某个块进行编程完整性和兼容性检查。BT中使用的34服务的数据格式定义和UDS国际标准定义完全不一样，详细的定义见服务描述。&lt;/p&gt;&lt;p&gt;&amp;nbsp;ECU供应商提供给OEM生产线或者售后服务处的应用程序与应用数据文件使用.bin格式。需要ECU供应商反馈bin文件的基本信息，&lt;/p&gt;&lt;p&gt;整个项目完整代码已经在前装车载设备上使用：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;#include&amp;nbsp;&amp;quot;main.h&amp;quot;
#include&amp;nbsp;&amp;quot;bt_define.h&amp;quot;


uint8_t&amp;nbsp;flash_driver_arr[FLASH_DRIVER_LENGTH]&amp;nbsp;__attribute__((at(0x20007000)))&amp;nbsp;=&amp;nbsp;{0};

typedef&amp;nbsp;void&amp;nbsp;(*pFunction)(void);
pFunction&amp;nbsp;Jump_To_Application;
uint32_t&amp;nbsp;JumpAddress;

void&amp;nbsp;Jump_To_App(uint32_t&amp;nbsp;address)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Judge&amp;nbsp;whether&amp;nbsp;the&amp;nbsp;top&amp;nbsp;of&amp;nbsp;stack&amp;nbsp;address&amp;nbsp;is&amp;nbsp;legal&amp;nbsp;or&amp;nbsp;not&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(((*(__IO&amp;nbsp;uint32_t*)address)&amp;nbsp;&amp;amp;&amp;nbsp;0x2FFE0000)&amp;nbsp;==&amp;nbsp;0x20000000)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
				/*&amp;nbsp;屏蔽所有中断，防止在跳转过程中，中断干扰出现异常&amp;nbsp;*/
				__disable_irq();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Jump&amp;nbsp;to&amp;nbsp;user&amp;nbsp;application&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;JumpAddress&amp;nbsp;=&amp;nbsp;*(__IO&amp;nbsp;uint32_t*)&amp;nbsp;(address&amp;nbsp;+&amp;nbsp;4);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Jump_To_Application&amp;nbsp;=&amp;nbsp;(pFunction)&amp;nbsp;JumpAddress;
			
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;Initialize&amp;nbsp;user&amp;nbsp;application&amp;#39;s&amp;nbsp;Stack&amp;nbsp;Pointer&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;__set_MSP(*(__IO&amp;nbsp;uint32_t*)&amp;nbsp;address);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Jump_To_Application();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

//#include&amp;nbsp;&amp;quot;n32g43x_crc.h&amp;quot;

int&amp;nbsp;main(void)
{
		Systick_MS_Config();&amp;nbsp;//Setup&amp;nbsp;SysTick&amp;nbsp;Timer&amp;nbsp;for&amp;nbsp;1&amp;nbsp;msec&amp;nbsp;interrupts
		tim6_7_init();
		can0_init();

		earse_flash_4_page();
		
		uds_init();

		if(flash_read(REQ_PROGRAM_UPDATE_FLAG_ADDR)&amp;nbsp;==&amp;nbsp;0x1)
		{
						
				//如果ECU在正确的条件下收到“$10&amp;nbsp;$02”指令，ECU将重编程请求标志状态位设为有效，并执行ECU重启。
				flash_write(REQ_PROGRAM_UPDATE_FLAG_ADDR,&amp;nbsp;0x0);
			
				m_SecurityLevel&amp;nbsp;=&amp;nbsp;UDS_SA_NON;
				uds_session&amp;nbsp;=&amp;nbsp;(uds_session_t)UDS_SESSION_PROG;
				uds_timer_start&amp;nbsp;(UDS_TIMER_S3server);

		}
		else
		{
				sys_delay_ms(15);
				if(is_force_update&amp;nbsp;==&amp;nbsp;0x1)
				{
						is_force_update&amp;nbsp;=&amp;nbsp;0x0;
					
						m_SecurityLevel&amp;nbsp;=&amp;nbsp;UDS_SA_NON;
						uds_session&amp;nbsp;=&amp;nbsp;(uds_session_t)UDS_SESSION_PROG;
						uds_timer_start&amp;nbsp;(UDS_TIMER_S3server);
				}
				else
				{
					
						RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_CRC,&amp;nbsp;ENABLE);
						__IO&amp;nbsp;uint32_t&amp;nbsp;CRCValue&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;0;
						/*&amp;nbsp;Compute&amp;nbsp;the&amp;nbsp;32bit&amp;nbsp;CRC&amp;nbsp;of&amp;nbsp;&amp;quot;DataBuffer&amp;quot;&amp;nbsp;*/
						CRC32_ResetCrc();
						CRCValue&amp;nbsp;=&amp;nbsp;CRC32_CalcBufCrc((uint32_t*)FLASH_APP1_ADDR,&amp;nbsp;FLASH_APP1_CRC_LENGTH/0x4);
						CRC32_ResetCrc();
						if(CRCValue&amp;nbsp;==&amp;nbsp;(*(__IO&amp;nbsp;uint32_t*)(FLASH_APP1_CRC_ADRR))&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;0x2&amp;nbsp;==&amp;nbsp;(*(__IO&amp;nbsp;uint32_t*)(FLASH_APP1_LOGIC_BLOCK_ADRR)))
						{
								flash_write(FLASH_APP1_VALID_ADRR,&amp;nbsp;0x1);
							
								CRC32_ResetCrc();
								CRCValue&amp;nbsp;=&amp;nbsp;CRC32_CalcBufCrc((uint32_t*)(FLASH_APP1_ADDR+0xC800),&amp;nbsp;FLASH_APP1_CRC_LENGTH/0x4);
								CRC32_ResetCrc();
								if(CRCValue&amp;nbsp;!=&amp;nbsp;(*(__IO&amp;nbsp;uint32_t*)(FLASH_APP1_CRC_ADRR+0xC800)))
								{
										bt_flash_erase(FLASH_APP2_ADDR,&amp;nbsp;FLASH_APP2_LENGTH);
										bt_flash_write(FLASH_APP2_ADDR,&amp;nbsp;(u8&amp;nbsp;*)FLASH_APP1_ADDR,&amp;nbsp;FLASH_APP2_LENGTH);
								}
						}
						else
						{
								flash_write(FLASH_APP1_VALID_ADRR,&amp;nbsp;0x0);
								bt_flash_erase(FLASH_APP1_ADDR,&amp;nbsp;FLASH_APP1_LENGTH);
								bt_flash_write(FLASH_APP1_ADDR,&amp;nbsp;(u8&amp;nbsp;*)FLASH_APP2_ADDR,&amp;nbsp;FLASH_APP1_LENGTH);
								/*&amp;nbsp;Compute&amp;nbsp;the&amp;nbsp;32bit&amp;nbsp;CRC&amp;nbsp;of&amp;nbsp;&amp;quot;DataBuffer&amp;quot;&amp;nbsp;*/
								CRC32_ResetCrc();
								CRCValue&amp;nbsp;=&amp;nbsp;CRC32_CalcBufCrc((uint32_t*)FLASH_APP1_ADDR,&amp;nbsp;FLASH_APP1_CRC_LENGTH/0x4);
								CRC32_ResetCrc();
								if(CRCValue&amp;nbsp;==&amp;nbsp;(*(__IO&amp;nbsp;uint32_t*)(FLASH_APP1_CRC_ADRR))&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;0x2&amp;nbsp;==&amp;nbsp;(*(__IO&amp;nbsp;uint32_t*)(FLASH_APP1_LOGIC_BLOCK_ADRR)))
								{
										flash_write(FLASH_APP1_VALID_ADRR,&amp;nbsp;0x1);
								}
								else
								{
										flash_write(FLASH_APP1_VALID_ADRR,&amp;nbsp;0x0);
								}
						}
						
						if(flash_read(FLASH_APP1_VALID_ADRR)&amp;nbsp;==&amp;nbsp;0x1)
						{
								if(((*(vu32*)(FLASH_APP1_ADDR+4))&amp;amp;0xFF000000)==0x08000000)
								{
										Jump_To_App(FLASH_APP1_ADDR);				//跳转到APP起始地址，期间不能被其他中断打断，否则会跳转失败
								}
						}

				}
		}

		while(1)
		{
			
//				u8&amp;nbsp;send_buf[8]&amp;nbsp;=&amp;nbsp;{0x0};
//				can_send_mess(0x222,&amp;nbsp;send_buf,&amp;nbsp;8);
				sys_delay_ms(1);

		}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409231727079302341425.png&quot; style=&quot;&quot; title=&quot;222.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409231727079302765847.png&quot; style=&quot;&quot; title=&quot;111.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 23 Sep 2024 16:40:30 +0800</pubDate></item><item><title>xs5013模拟视频编码，bt1120转ahd tvi cvi格式，调试资料和教程</title><link>https://blog.qiquanji.com/post/11113.html</link><description>&lt;p&gt;&lt;span style=&quot;font-size: 18px; color: #FF0000;&quot;&gt;可以帮忙调试，QQ：778292363&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409021725256788521698.png&quot; title=&quot;未命名码 (1).png&quot; alt=&quot;未命名码 (1).png&quot;/&gt;&lt;/p&gt;&lt;p&gt;XS5013 芯片是一款应用于专业安防摄像机的图像信号处理芯片，主要应用在模拟摄像机产 品，高度集成外围器件，简化产品设计。内置高性能 ISP 处理器，最高支持 5M ，标清模拟输出 支持 960H ，高清模拟输出支持多标准协议，支持 720P/1080P/4M/5M ，其中 HDCVI 高清编码在 TX 模式下可支持到 720P/1080P/4M/5M/4K 。内嵌 CPU 处理器，可以实现灵活的软件应用。&lt;/p&gt;&lt;p&gt;XS5013 是面向中低端模拟摄像机产品的一款SOC 芯片。XS5013 既可以作为ISP+TX 单芯 片解决方案，也可以只当做TX 模块进行模拟视频编码。&lt;/p&gt;&lt;p&gt;此文章主要讲解&lt;span style=&quot;text-wrap: wrap;&quot;&gt;TX 模块进行模拟视频编码，bt1120转ahd tvi cvi格式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409021725254798462566.png&quot; alt=&quot;SIN2O%W9]UT)7N2G$9VU$1P.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&lt;img src=&quot;https://www.qiquanji.com/zb_users/upload/2024/09/202409021725254902777256.png&quot; alt=&quot;SYFOSGYKATW8{9P{YB2B2SH.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;#include&amp;nbsp;&amp;lt;stdio.h&amp;gt;
#include&amp;nbsp;&amp;lt;string.h&amp;gt;
#include&amp;nbsp;&amp;lt;stdlib.h&amp;gt;
#include&amp;nbsp;&amp;lt;assert.h&amp;gt;
#include&amp;nbsp;&amp;lt;ctype.h&amp;gt;
#include&amp;nbsp;&amp;lt;fcntl.h&amp;gt;
#include&amp;nbsp;&amp;lt;unistd.h&amp;gt;

#include&amp;nbsp;&amp;lt;termios.h&amp;gt;&amp;nbsp;//set&amp;nbsp;baud&amp;nbsp;rate

#include&amp;nbsp;&amp;lt;sys/select.h&amp;gt;
#include&amp;nbsp;&amp;lt;sys/time.h&amp;gt;
#include&amp;nbsp;&amp;lt;sys/types.h&amp;gt;
#include&amp;nbsp;&amp;lt;errno.h&amp;gt;
#include&amp;nbsp;&amp;lt;sys/stat.h&amp;gt;

/*&amp;nbsp;cvi&amp;nbsp;720P60&amp;nbsp;pattern
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11003400&amp;nbsp;0x0&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11000060&amp;nbsp;0x0011&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11000060&amp;nbsp;0x1003&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11001010&amp;nbsp;0x0&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11001010&amp;nbsp;0xffffffff&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11048080&amp;nbsp;0x03&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11008188&amp;nbsp;0xff&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11008188&amp;nbsp;0x0&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x1104805c&amp;nbsp;0x1&amp;quot;
xs5013&amp;nbsp;&amp;quot;mem&amp;nbsp;w&amp;nbsp;0x11003400&amp;nbsp;0x1&amp;quot;
*/

#define&amp;nbsp;TTY_NAME&amp;nbsp;&amp;quot;/dev/ttyS3&amp;quot;
#define&amp;nbsp;BAUDRATE&amp;nbsp;B115200

#define&amp;nbsp;XS_SUCCESS&amp;nbsp;0
#define&amp;nbsp;XS_FAIL&amp;nbsp;1

//
#define&amp;nbsp;PKG_HEAD&amp;nbsp;0x02
#define&amp;nbsp;PKG_TAIL&amp;nbsp;0x03

#define&amp;nbsp;IMG_ADDRESS&amp;nbsp;(0x00010000)
#define&amp;nbsp;XS_ADDRESS_LEN&amp;nbsp;(4)
#define&amp;nbsp;XS_COUNT_LEN&amp;nbsp;(4)
#define&amp;nbsp;XS_PERDATA_LEN&amp;nbsp;(4)

//&amp;nbsp;command
#define&amp;nbsp;BM_CMD_NOTIFY&amp;nbsp;36
#define&amp;nbsp;BM_CMD_DEBUG&amp;nbsp;20
#define&amp;nbsp;BM_CMD_DLOAD&amp;nbsp;24
#define&amp;nbsp;BM_CMD_WRITE&amp;nbsp;25
#define&amp;nbsp;BM_CMD_READ&amp;nbsp;26
#define&amp;nbsp;BM_CMD_RUN&amp;nbsp;27
#define&amp;nbsp;BM_CMD_EXIT&amp;nbsp;101
#define&amp;nbsp;BM_CMD_SHAKE&amp;nbsp;85
#define&amp;nbsp;BM_CMD_ACK&amp;nbsp;170
#define&amp;nbsp;BM_CMD_OK&amp;nbsp;5
#define&amp;nbsp;BM_CMD_ERR&amp;nbsp;10
#define&amp;nbsp;MB_CMD_MINIBOOT&amp;nbsp;117
#define&amp;nbsp;MB_CMD_ERASE&amp;nbsp;69

enum&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STX&amp;nbsp;=&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CMD,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CHKSUM,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ETX,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HEADLEN,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extDATA&amp;nbsp;=&amp;nbsp;HEADLEN
};

typedef&amp;nbsp;struct&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;stx;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;cmd;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;chksum;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;etx;
}NoDataCmd;

static&amp;nbsp;NoDataCmd&amp;nbsp;NoDataCmdPkg&amp;nbsp;=&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.stx&amp;nbsp;=&amp;nbsp;PKG_HEAD,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.cmd&amp;nbsp;=&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.chksum&amp;nbsp;=&amp;nbsp;0,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.etx&amp;nbsp;=&amp;nbsp;PKG_TAIL
};

//&amp;nbsp;hexdump&amp;nbsp;-v&amp;nbsp;-e&amp;nbsp;&amp;#39;4/1&amp;nbsp;&amp;quot;0x%02x,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;\n&amp;quot;&amp;#39;&amp;nbsp;miniboot_reload_xs5013_ahd.img&amp;nbsp;&amp;gt;&amp;nbsp;ahdData
static&amp;nbsp;const&amp;nbsp;char&amp;nbsp;ahdData[]&amp;nbsp;=&amp;nbsp;{
#include&amp;nbsp;&amp;quot;ahdData&amp;quot;
};

//&amp;nbsp;hexdump&amp;nbsp;-v&amp;nbsp;-e&amp;nbsp;&amp;#39;4/1&amp;nbsp;&amp;quot;0x%02x,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;\n&amp;quot;&amp;#39;&amp;nbsp;miniboot_reload_xs5013_cvi.img&amp;nbsp;&amp;gt;&amp;nbsp;cviData
static&amp;nbsp;const&amp;nbsp;char&amp;nbsp;cviData[]&amp;nbsp;=&amp;nbsp;{
#include&amp;nbsp;&amp;quot;cviData&amp;quot;
};

//&amp;nbsp;hexdump&amp;nbsp;-v&amp;nbsp;-e&amp;nbsp;&amp;#39;4/1&amp;nbsp;&amp;quot;0x%02x,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;\n&amp;quot;&amp;#39;&amp;nbsp;miniboot_reload_xs5013_tvi.img&amp;nbsp;&amp;gt;&amp;nbsp;tviData
static&amp;nbsp;const&amp;nbsp;char&amp;nbsp;tviData[]&amp;nbsp;=&amp;nbsp;{
#include&amp;nbsp;&amp;quot;tviData&amp;quot;
};

//&amp;nbsp;hexdump&amp;nbsp;-v&amp;nbsp;-e&amp;nbsp;&amp;#39;4/1&amp;nbsp;&amp;quot;0x%02x,&amp;nbsp;&amp;quot;&amp;nbsp;&amp;quot;\n&amp;quot;&amp;#39;&amp;nbsp;pattern.img&amp;nbsp;&amp;gt;&amp;nbsp;patternData
static&amp;nbsp;const&amp;nbsp;char&amp;nbsp;patternData[]&amp;nbsp;=&amp;nbsp;{
#include&amp;nbsp;&amp;quot;patternData&amp;quot;
};


static&amp;nbsp;inline&amp;nbsp;int&amp;nbsp;bytes2int(char&amp;nbsp;*buf)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;buf[3]&amp;nbsp;|(buf[2]&amp;lt;&amp;lt;24)&amp;nbsp;|&amp;nbsp;(buf[1]&amp;lt;&amp;lt;16)&amp;nbsp;|&amp;nbsp;(buf[0]);
}

static&amp;nbsp;inline&amp;nbsp;void&amp;nbsp;int2bytes(int&amp;nbsp;i,&amp;nbsp;char&amp;nbsp;*buf)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0]&amp;nbsp;=&amp;nbsp;(i&amp;gt;&amp;gt;24)&amp;amp;0xff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[1]&amp;nbsp;=&amp;nbsp;(i&amp;gt;&amp;gt;16)&amp;amp;0xff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[2]&amp;nbsp;=&amp;nbsp;(i&amp;gt;&amp;gt;8)&amp;amp;0xff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[3]&amp;nbsp;=&amp;nbsp;i&amp;amp;0xff;
}

int&amp;nbsp;setOpt(int&amp;nbsp;fd)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;termios&amp;nbsp;newtio,&amp;nbsp;oldtio;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(tcgetattr(fd,&amp;nbsp;&amp;amp;oldtio)&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&amp;quot;SetupSerial&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bzero(&amp;amp;newtio,&amp;nbsp;sizeof(newtio));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_lflag&amp;nbsp;&amp;amp;=&amp;nbsp;~ECHO;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cfsetispeed(&amp;amp;newtio,&amp;nbsp;BAUDRATE);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cfsetospeed(&amp;amp;newtio,&amp;nbsp;BAUDRATE);

#if&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cflag&amp;nbsp;|=&amp;nbsp;CLOCAL&amp;nbsp;|&amp;nbsp;CREAD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cflag&amp;nbsp;&amp;amp;=&amp;nbsp;~CSIZE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cflag&amp;nbsp;|=&amp;nbsp;CS8;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cflag&amp;nbsp;&amp;amp;=&amp;nbsp;~PARENB;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cflag&amp;nbsp;&amp;amp;=&amp;nbsp;~CSTOPB;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cc[VTIME]&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newtio.c_cc[VMIN]&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tcflush(fd,&amp;nbsp;TCIFLUSH);
#endif

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;((tcsetattr(fd,&amp;nbsp;TCSANOW,&amp;nbsp;&amp;amp;newtio))&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&amp;quot;com&amp;nbsp;set&amp;nbsp;error&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}

int&amp;nbsp;readbytes(int&amp;nbsp;fd,&amp;nbsp;char&amp;nbsp;*rcv_buf,&amp;nbsp;int&amp;nbsp;Len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;ret=0,&amp;nbsp;pos,&amp;nbsp;time=0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd_set&amp;nbsp;rfds;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct&amp;nbsp;timeval&amp;nbsp;tv;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(pos&amp;nbsp;&amp;lt;&amp;nbsp;Len&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;time&amp;nbsp;&amp;lt;3*Len)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_ZERO(&amp;amp;rfds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FD_SET(fd,&amp;nbsp;&amp;amp;rfds);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tv.tv_sec&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;//set&amp;nbsp;the&amp;nbsp;rcv&amp;nbsp;wait&amp;nbsp;time
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tv.tv_usec&amp;nbsp;=&amp;nbsp;100*1000;&amp;nbsp;&amp;nbsp;//100000us&amp;nbsp;=&amp;nbsp;0.1s

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;select(fd&amp;nbsp;+&amp;nbsp;1,&amp;nbsp;&amp;amp;rfds,&amp;nbsp;NULL,&amp;nbsp;NULL,&amp;nbsp;&amp;amp;tv);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;time&amp;nbsp;++;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ret&amp;nbsp;==&amp;nbsp;-1){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&amp;quot;select()&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(ret)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;read(fd,&amp;nbsp;rcv_buf+pos,&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;[hardy]&amp;nbsp;ret:%d&amp;nbsp;0x%02x\n&amp;quot;,&amp;nbsp;ret,&amp;nbsp;*(rcv_buf&amp;nbsp;+&amp;nbsp;pos));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;[hardy]:&amp;nbsp;timeout\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;pos;
}

int&amp;nbsp;readPckHead(int&amp;nbsp;fd,&amp;nbsp;char&amp;nbsp;*rcv_buf)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;ret,&amp;nbsp;trytimes=3;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset(rcv_buf,&amp;nbsp;0,&amp;nbsp;HEADLEN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(trytimes&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;trytimes--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PKG_HEAD&amp;nbsp;!=&amp;nbsp;rcv_buf[STX])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;readbytes(fd,&amp;nbsp;rcv_buf,&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ret&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PKG_HEAD&amp;nbsp;==&amp;nbsp;rcv_buf[STX])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;read&amp;nbsp;package&amp;nbsp;head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;readbytes(fd,&amp;nbsp;&amp;amp;rcv_buf[CMD],&amp;nbsp;HEADLEN-1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ret&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(PKG_TAIL&amp;nbsp;==&amp;nbsp;rcv_buf[ETX])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;recv&amp;nbsp;package&amp;nbsp;head&amp;nbsp;[0x%02x%02x%02x%02x]\n&amp;quot;,&amp;nbsp;rcv_buf[STX],&amp;nbsp;rcv_buf[CMD],&amp;nbsp;rcv_buf[CHKSUM],&amp;nbsp;rcv_buf[ETX]);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(PKG_HEAD&amp;nbsp;!=&amp;nbsp;rcv_buf[STX]&amp;nbsp;||&amp;nbsp;PKG_TAIL&amp;nbsp;!=&amp;nbsp;rcv_buf[ETX]);
}

int&amp;nbsp;sendDataTty(int&amp;nbsp;fd,&amp;nbsp;char&amp;nbsp;*send_buf,&amp;nbsp;int&amp;nbsp;Len)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ssize_t&amp;nbsp;ret;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;write(fd,&amp;nbsp;send_buf,&amp;nbsp;Len);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(ret&amp;nbsp;==&amp;nbsp;-1)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;write&amp;nbsp;device&amp;nbsp;error\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;XS_FAIL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;XS_SUCCESS;
}

static&amp;nbsp;inline&amp;nbsp;int&amp;nbsp;sendNoDataCmd(int&amp;nbsp;fd,&amp;nbsp;char&amp;nbsp;cmd)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NoDataCmdPkg.cmd&amp;nbsp;=&amp;nbsp;cmd;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendDataTty(fd,&amp;nbsp;(char*)&amp;amp;NoDataCmdPkg,&amp;nbsp;sizeof(NoDataCmdPkg));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;send&amp;nbsp;[0x%02x%02x%02x%02x]\n&amp;quot;,&amp;nbsp;NoDataCmdPkg.stx,&amp;nbsp;NoDataCmdPkg.cmd,&amp;nbsp;NoDataCmdPkg.chksum,&amp;nbsp;NoDataCmdPkg.etx);
}

int&amp;nbsp;exeCmdDLoad(int&amp;nbsp;fd,&amp;nbsp;const&amp;nbsp;char&amp;nbsp;*mode)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#define&amp;nbsp;DATA_NUM&amp;nbsp;(0x200)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;snd_buf[HEADLEN+XS_ADDRESS_LEN+XS_COUNT_LEN+DATA_NUM*XS_PERDATA_LEN]&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{PKG_HEAD,&amp;nbsp;BM_CMD_DLOAD,&amp;nbsp;0,&amp;nbsp;PKG_TAIL};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;sentlen&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;//
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;sendlen&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;//&amp;nbsp;data&amp;nbsp;lenght&amp;nbsp;will&amp;nbsp;be&amp;nbsp;sent
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;char*&amp;nbsp;imgData&amp;nbsp;=&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;datasize&amp;nbsp;=&amp;nbsp;0;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;i,&amp;nbsp;tryTimes,&amp;nbsp;allDataLen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;rcv_buf[HEADLEN]&amp;nbsp;=&amp;nbsp;{0};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;strcmp(mode,&amp;nbsp;&amp;quot;cvi&amp;quot;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgData&amp;nbsp;=&amp;nbsp;cviData;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasize&amp;nbsp;=&amp;nbsp;sizeof(cviData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;strcmp(mode,&amp;nbsp;&amp;quot;tvi&amp;quot;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgData&amp;nbsp;=&amp;nbsp;tviData;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasize&amp;nbsp;=&amp;nbsp;sizeof(tviData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;strcmp(mode,&amp;nbsp;&amp;quot;ahd&amp;quot;))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgData&amp;nbsp;=&amp;nbsp;ahdData;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasize&amp;nbsp;=&amp;nbsp;sizeof(ahdData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgData&amp;nbsp;=&amp;nbsp;patternData;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;datasize&amp;nbsp;=&amp;nbsp;sizeof(patternData);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(sentlen&amp;nbsp;&amp;lt;&amp;nbsp;datasize)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(DATA_NUM*XS_PERDATA_LEN&amp;nbsp;&amp;lt;&amp;nbsp;(datasize-sentlen))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendlen&amp;nbsp;=&amp;nbsp;DATA_NUM*XS_PERDATA_LEN;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendlen&amp;nbsp;=&amp;nbsp;datasize-sentlen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;will&amp;nbsp;send&amp;nbsp;len:0x%x\n&amp;quot;,&amp;nbsp;sendlen);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;address
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int2bytes(IMG_ADDRESS+sentlen,&amp;nbsp;snd_buf+HEADLEN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;count
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int2bytes(sendlen/XS_PERDATA_LEN,&amp;nbsp;snd_buf+HEADLEN+XS_ADDRESS_LEN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy(snd_buf+HEADLEN+XS_ADDRESS_LEN+XS_COUNT_LEN,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgData+sentlen,&amp;nbsp;sendlen);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;chksum
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allDataLen&amp;nbsp;=&amp;nbsp;HEADLEN+XS_ADDRESS_LEN+XS_COUNT_LEN+sendlen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[CHKSUM]&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i=HEADLEN;&amp;nbsp;i&amp;lt;allDataLen;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[CHKSUM]&amp;nbsp;+=&amp;nbsp;snd_buf[i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;chksum:0x%02x&amp;nbsp;data:0x%02x\n&amp;quot;,&amp;nbsp;snd_buf[CHKSUM],&amp;nbsp;snd_buf[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;send&amp;nbsp;[0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x\n&amp;quot;,
//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;send&amp;nbsp;[0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x\n&amp;quot;,
&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[0],&amp;nbsp;snd_buf[1],&amp;nbsp;snd_buf[2],&amp;nbsp;snd_buf[3],&amp;nbsp;//&amp;nbsp;head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[4],&amp;nbsp;snd_buf[5],&amp;nbsp;snd_buf[6],&amp;nbsp;snd_buf[7],&amp;nbsp;//&amp;nbsp;address
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[8],&amp;nbsp;snd_buf[9],&amp;nbsp;snd_buf[10],&amp;nbsp;snd_buf[11]);&amp;nbsp;//&amp;nbsp;count
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//snd_buf[12],&amp;nbsp;snd_buf[13],&amp;nbsp;snd_buf[14],&amp;nbsp;snd_buf[15]);&amp;nbsp;//&amp;nbsp;data

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes&amp;nbsp;=&amp;nbsp;3;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(tryTimes&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XS_SUCCESS&amp;nbsp;==&amp;nbsp;sendDataTty(fd,&amp;nbsp;snd_buf,&amp;nbsp;allDataLen))&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;tryTimes)&amp;nbsp;assert(0);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes&amp;nbsp;=&amp;nbsp;5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(XS_SUCCESS&amp;nbsp;==&amp;nbsp;readPckHead(fd,&amp;nbsp;rcv_buf)&amp;nbsp;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(BM_CMD_OK&amp;nbsp;==&amp;nbsp;rcv_buf[CMD])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sentlen&amp;nbsp;+=&amp;nbsp;sendlen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(BM_CMD_ERR&amp;nbsp;==&amp;nbsp;rcv_buf[CMD])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;send&amp;nbsp;img&amp;nbsp;error!&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}

static&amp;nbsp;int&amp;nbsp;sendRunCmd(int&amp;nbsp;fd)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;snd_buf[HEADLEN+XS_ADDRESS_LEN]&amp;nbsp;=&amp;nbsp;{PKG_HEAD,&amp;nbsp;BM_CMD_RUN,&amp;nbsp;0,&amp;nbsp;PKG_TAIL};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;i,&amp;nbsp;tryTimes,&amp;nbsp;allDataLen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;rcv_buf[HEADLEN]&amp;nbsp;=&amp;nbsp;{0};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;address
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int2bytes(IMG_ADDRESS,&amp;nbsp;snd_buf+HEADLEN);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;chksum
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allDataLen&amp;nbsp;=&amp;nbsp;HEADLEN+XS_ADDRESS_LEN;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[CHKSUM]&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(i=HEADLEN;&amp;nbsp;i&amp;lt;allDataLen;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[CHKSUM]&amp;nbsp;+=&amp;nbsp;snd_buf[i];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;chksum:0x%02x&amp;nbsp;data:0x%02x\n&amp;quot;,&amp;nbsp;snd_buf[CHKSUM],&amp;nbsp;snd_buf[i]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;send&amp;nbsp;[0x%02x%02x%02x%02x&amp;nbsp;0x%02x%02x%02x%02x]\n&amp;quot;,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[0],&amp;nbsp;snd_buf[1],&amp;nbsp;snd_buf[2],&amp;nbsp;snd_buf[3],&amp;nbsp;//&amp;nbsp;head
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;snd_buf[4],&amp;nbsp;snd_buf[5],&amp;nbsp;snd_buf[6],&amp;nbsp;snd_buf[7]);&amp;nbsp;//&amp;nbsp;address

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes&amp;nbsp;=&amp;nbsp;3;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(tryTimes&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XS_SUCCESS&amp;nbsp;==&amp;nbsp;sendDataTty(fd,&amp;nbsp;snd_buf,&amp;nbsp;allDataLen))&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;tryTimes)&amp;nbsp;assert(0);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes&amp;nbsp;=&amp;nbsp;5;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(XS_SUCCESS&amp;nbsp;==&amp;nbsp;readPckHead(fd,&amp;nbsp;rcv_buf)&amp;nbsp;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(BM_CMD_OK&amp;nbsp;==&amp;nbsp;rcv_buf[CMD])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(BM_CMD_ERR&amp;nbsp;==&amp;nbsp;rcv_buf[CMD])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;XS_FAIL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;XS_SUCCESS;
}

int&amp;nbsp;initXs5013(int&amp;nbsp;fd,&amp;nbsp;const&amp;nbsp;char&amp;nbsp;*mode)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;ret;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;rcv_buf[HEADLEN];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(1)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(XS_SUCCESS&amp;nbsp;==&amp;nbsp;readPckHead(fd,&amp;nbsp;rcv_buf)&amp;nbsp;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;recv&amp;nbsp;package&amp;nbsp;head&amp;nbsp;[0x%02x%02x%02x%02x]\n&amp;quot;,&amp;nbsp;rcv_buf[STX],&amp;nbsp;rcv_buf[CMD],&amp;nbsp;rcv_buf[CHKSUM],&amp;nbsp;rcv_buf[ETX]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(BM_CMD_NOTIFY&amp;nbsp;!=&amp;nbsp;rcv_buf[CMD])&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;incorrect&amp;nbsp;command&amp;nbsp;%d\n&amp;quot;,&amp;nbsp;rcv_buf[CMD]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendNoDataCmd(fd,&amp;nbsp;BM_CMD_DEBUG);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep(100*1000);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exeCmdDLoad(fd,&amp;nbsp;mode);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendRunCmd(fd);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//printf(&amp;quot;xs5013&amp;nbsp;is&amp;nbsp;ready\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}

int&amp;nbsp;main(int&amp;nbsp;argc,&amp;nbsp;char**&amp;nbsp;argv)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;*format&amp;nbsp;=&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;fd&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;buf[100]&amp;nbsp;=&amp;nbsp;{0};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;tryTimes;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char&amp;nbsp;c;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(argc&amp;nbsp;&amp;lt;&amp;nbsp;2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;no&amp;nbsp;parameter&amp;nbsp;--&amp;nbsp;read&amp;nbsp;serial\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;para1:&amp;nbsp;command\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ahd/cvi/tvi/pattern&amp;nbsp;--&amp;nbsp;download&amp;nbsp;img\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720p25&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720p30&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720p50&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720p60&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1080p25&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1080p30&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1080p50&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format,&amp;nbsp;only&amp;nbsp;for&amp;nbsp;cvi\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1080p60&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format,&amp;nbsp;only&amp;nbsp;for&amp;nbsp;cvi\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720pal&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format,&amp;nbsp;720x576-50\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;720n&amp;nbsp;--&amp;nbsp;switch&amp;nbsp;video&amp;nbsp;format,&amp;nbsp;720x480-60\n\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex:&amp;nbsp;xs5013&amp;nbsp;ahd\n\n&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fd&amp;nbsp;=&amp;nbsp;open(TTY_NAME,&amp;nbsp;O_RDWR&amp;nbsp;|&amp;nbsp;O_NOCTTY&amp;nbsp;|&amp;nbsp;O_NDELAY);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(-1&amp;nbsp;==&amp;nbsp;fd)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;perror(&amp;quot;Can&amp;#39;t&amp;nbsp;Open&amp;nbsp;Serial&amp;nbsp;Port&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(-1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setOpt(fd);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(argc&amp;nbsp;&amp;gt;=&amp;nbsp;2&amp;nbsp;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;==&amp;nbsp;strcmp(&amp;quot;ahd&amp;quot;,&amp;nbsp;argv[1])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||0&amp;nbsp;==&amp;nbsp;strcmp(&amp;quot;cvi&amp;quot;,&amp;nbsp;argv[1])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;0&amp;nbsp;==&amp;nbsp;strcmp(&amp;quot;tvi&amp;quot;,&amp;nbsp;argv[1])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;0&amp;nbsp;==&amp;nbsp;strcmp(&amp;quot;pattern&amp;quot;,&amp;nbsp;argv[1])&amp;nbsp;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;initXs5013(fd,&amp;nbsp;argv[1]);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(argc&amp;nbsp;==&amp;nbsp;2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(0&amp;nbsp;!=&amp;nbsp;ret)&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;init&amp;nbsp;%s\n&amp;quot;,&amp;nbsp;argv[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(buf,&amp;nbsp;&amp;quot;%s\r&amp;quot;,&amp;nbsp;argv[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendDataTty(fd,&amp;nbsp;buf,&amp;nbsp;strlen(buf));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;init&amp;nbsp;%s&amp;nbsp;end\n&amp;quot;,&amp;nbsp;argv[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;switch&amp;nbsp;%s\n&amp;quot;,&amp;nbsp;argv[1]);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sprintf(buf,&amp;nbsp;&amp;quot;%s\r&amp;quot;,&amp;nbsp;argv[1]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sendDataTty(fd,&amp;nbsp;buf,&amp;nbsp;strlen(buf));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tryTimes&amp;nbsp;=&amp;nbsp;1024;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(tryTimes--)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(1&amp;nbsp;==&amp;nbsp;readbytes(fd,&amp;nbsp;&amp;amp;c,&amp;nbsp;1))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isprint(c)&amp;nbsp;||&amp;nbsp;iscntrl(c))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;putchar(c);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&amp;quot;0x%02x\n&amp;quot;,&amp;nbsp;c);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(&amp;#39;#&amp;#39;&amp;nbsp;==&amp;nbsp;c&amp;nbsp;||&amp;nbsp;&amp;#39;$&amp;#39;&amp;nbsp;==&amp;nbsp;c)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;putchar(&amp;#39;\n&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close&amp;nbsp;(fd);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;版本包说明：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.版本名称：miniboot_reload_xs5013.tgz，linux环境下解压后使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2.版本包的组成&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;release&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;|-miniboot_reload_xs5013_ahd.img&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;|-miniboot_reload_xs5013_cvi.img&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;|-miniboot_reload_xs5013_tvi.img&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;3.每个镜像文件包含的分辨率以及启动命令如下：（分辨率描述说明：宽x高-帧率）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1）ahd （对应的镜像：miniboot_reload_xs5013_ahd.img）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.分辨率：1280x720-25&amp;nbsp; &amp;nbsp; 串口启动命令：720p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2.分辨率：1280x720-30&amp;nbsp; &amp;nbsp; 串口启动命令：720p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;3.分辨率：1280x720-50&amp;nbsp; &amp;nbsp; 串口启动命令：720p50 （未验证）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;4.分辨率：1280x720-60&amp;nbsp; &amp;nbsp; 串口启动命令：720p60&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;5.分辨率：1920x1080-25&amp;nbsp; &amp;nbsp;串口启动命令：1080p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;6.分辨率：1920x1080-30&amp;nbsp; &amp;nbsp;串口启动命令：1080p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2）cvi （对应的镜像：miniboot_reload_xs5013_cvi.img）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.分辨率：1280x720-25&amp;nbsp; &amp;nbsp; 串口启动命令：720p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2.分辨率：1280x720-30&amp;nbsp; &amp;nbsp; 串口启动命令：720p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;3.分辨率：1280x720-50&amp;nbsp; &amp;nbsp; 串口启动命令：720p50&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;4.分辨率：1280x720-60&amp;nbsp; &amp;nbsp; 串口启动命令：720p60&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;5.分辨率：1920x1080-25&amp;nbsp; &amp;nbsp;串口启动命令：1080p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;6.分辨率：1920x1080-30&amp;nbsp; &amp;nbsp;串口启动命令：1080p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;7.分辨率：1920x1080-50&amp;nbsp; &amp;nbsp;串口启动命令：1080p50 （未验证）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;8.分辨率：1920x1080-60&amp;nbsp; &amp;nbsp;串口启动命令：1080p60 （未验证）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;3）tvi （对应的镜像：miniboot_reload_xs5013_tvi.img）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.分辨率：1280x720-25&amp;nbsp; &amp;nbsp; 串口启动命令：720p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2.分辨率：1280x720-30&amp;nbsp; &amp;nbsp; 串口启动命令：720p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;3.分辨率：1280x720-50&amp;nbsp; &amp;nbsp; 串口启动命令：720p50&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;4.分辨率：1280x720-60&amp;nbsp; &amp;nbsp; 串口启动命令：720p60&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;5.分辨率：1920x1080-25&amp;nbsp; &amp;nbsp;串口启动命令：1080p25&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;6.分辨率：1920x1080-30&amp;nbsp; &amp;nbsp;串口启动命令：1080p30&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;4）cvbs	（该模式没有单独的镜像文件，在ahd/cvi/tvi三个镜像中均存在）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.分辨率：720x576-50&amp;nbsp; &amp;nbsp; &amp;nbsp;串口启动命令：720pal&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;2.分辨率：720x480-60&amp;nbsp; &amp;nbsp; &amp;nbsp;串口启动命令：720n&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;5）系统复位	（该模式没有单独的镜像文件，在ahd/cvi/tvi三个镜像中均存在）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.分辨率：支持所有分辨率 串口启动命令：reset&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;烧写说明&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.烧写工具包：XS_CHIP_TOOLS_V1.4.8.rar，解压后使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space-collapse: collapse;&quot;&gt;&lt;span style=&quot;white-space: pre;&quot;&gt;&lt;/span&gt;2.使用说明，该工具适用于通过串口直接给xs5013进行烧写程序，如果是通过主控芯片来控制xs5013进行程序的烧写，需要客户按照《串口协议.pdf》中的介绍，自己开发主控的烧写程序。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1920*1080@60(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing0 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;148500000&amp;gt;;&amp;nbsp; &amp;nbsp;// 148.5MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1920&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;1080&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;148&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;88&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;36&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;4&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;44&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1920*1080@25(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing1 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1920&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;1080&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;148&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;528&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;36&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;4&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;44&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1920*1080@30(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing2 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1920&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;1080&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;148&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;88&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;36&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;4&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;44&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1280*720@60(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing3 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1280&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;220&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;110&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;20&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;40&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1280*720@50(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing4 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1280&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;220&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;440&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;20&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;40&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1280*720@30(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing5 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1280&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;220&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;1760&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;20&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;40&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//1280*720@25(16:9)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing6 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;74250000&amp;gt;;&amp;nbsp; &amp;nbsp;// 74.25MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;1280&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;220&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;2420&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;20&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;40&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//CVBS 720*480@60(4:3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing7 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;27000000&amp;gt;;&amp;nbsp; &amp;nbsp;// 27MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;480&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;60&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;16&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;30&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;9&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;62&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;6&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;//CVBS 720*576@50(4:3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;rgb_timing0: timing8 {&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; clock-frequency = &amp;lt;27000000&amp;gt;;&amp;nbsp; &amp;nbsp;// 27MHz&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hactive = &amp;lt;720&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vactive = &amp;lt;576&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hback-porch = &amp;lt;68&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hfront-porch = &amp;lt;12&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vback-porch = &amp;lt;39&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vfront-porch = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-len = &amp;lt;64&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-len = &amp;lt;5&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; hsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; vsync-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; de-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; pixelclk-active = &amp;lt;0&amp;gt;;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;};&lt;/span&gt;&lt;/p&gt;</description><pubDate>Mon, 02 Sep 2024 14:03:40 +0800</pubDate></item><item><title>Altium Designer软件破解版</title><link>https://blog.qiquanji.com/post/11112.html</link><description>&lt;p&gt;&lt;img src=&quot;https://blog.qiquanji.com/zb_users/upload/2025/06/202506151749994850260731.jpg&quot; title=&quot;Snipaste_2025-06-15_21-39-58.jpg&quot; alt=&quot;Snipaste_2025-06-15_21-39-58.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</description><pubDate>Sun, 05 May 2024 14:39:55 +0800</pubDate></item></channel></rss><!--32.81 ms , 5 query , -663kb memory , 0 error-->