⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcuprogrammerdlg.cpp

📁 Sliicon Lab C8051F 系列MCU 燒錄程式碼
💻 CPP
📖 第 1 页 / 共 2 页
字号:

void CMCUProgrammerDlg::UpdateWindowProgramSettings()
{
	// This takes all displayed settings from the program settings
	// structure and displays them in the window
	m_PartNumber		= m_ProgramSettings.partNumber;
	m_DebugAdapter		= m_ProgramSettings.debugAdapter;
	m_HexFileNotBanked	= m_ProgramSettings.hexFileNotBanked;
	m_HexFileBank1		= m_ProgramSettings.hexFileBank1;
	m_HexFileBank2		= m_ProgramSettings.hexFileBank2;
	m_HexFileBank3		= m_ProgramSettings.hexFileBank3;
	m_SerializeParts	= m_ProgramSettings.serializeParts;
	m_EraseCodeSpace	= m_ProgramSettings.eraseCodeSpace;
	m_FlashPersist		= m_ProgramSettings.flashPersist;
	m_LockCodeSpace		= m_ProgramSettings.lockCodeMemory;

	// Determine if serial numbers are used, if not display an N/A in the window
	if (m_ProgramSettings.serializeParts)
	{
		m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
		m_CurrentSerialNumberString.Format("%u", m_ProgramSettings.startingSerialNumber);
		m_SerialNumberIncrement.Format("%u", m_ProgramSettings.serialNumberIncrement);
	}
	else
	{
		m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
		m_CurrentSerialNumberString = "N/A";
		m_SerialNumberIncrement = "N/A";
	}

	UpdateData(FALSE);
}

void CMCUProgrammerDlg::OnProgrammenuExit() 
{
	OnOK();
}

void CMCUProgrammerDlg::OnButtonProgramdevice()
{
	BOOL error = FALSE;
	int comPort = -1;
	CString partNumber;
	CString errorMessage;

	BeginWaitCursor();

	// If settings have not been programmed, then prompt the user
	if (!m_SettingsHaveBeenProgrammed)
	{
		errorMessage.Format("Settings have not been initialized");
		LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
		error = TRUE;
	}
	
	// If we are flash erasing the part, then
	// do it before connecting (so that we can erase
	// flash locked JTAG parts)
	if (m_ProgramSettings.eraseCodeSpace)
	{
		if (!error)
		{
			if (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER)
			{
				// If using a serial adapter, remove the "COM" from the string, and get the
				// port number value
				comPort = atoi(m_DebugAdapter.Right(m_DebugAdapter.GetLength() - 3));

				if (FAILED(FLASHErase(comPort, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol)))
				{
					errorMessage.Format("Cannot Erase Code Space on Debug Adapter: %s", m_DebugAdapter);
					LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
					error = TRUE;
				}
			}
			else if (m_ProgramSettings.debugAdapterType == USB_ADAPTER)
			{
				if (FAILED(FLASHEraseUSB(m_DebugAdapter, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol)))
				{
					errorMessage.Format("Cannot Erase Code Space on Debug Adapter: %s", m_DebugAdapter);
					LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
					error = TRUE;
				}
			}
		}
	}

	// Connect to the EC, log error if it cannot connect
	if (!error)
	{
		if (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER)
		{
			// If using a serial adapter, remove the "COM" from the string, and get the
			// port number value
			comPort = atoi(m_DebugAdapter.Right(m_DebugAdapter.GetLength() - 3));

			if (FAILED(Connect(comPort, DISABLE_DIALOGS, m_ProgramSettings.ecProtocol, 0)))
			{
				errorMessage.Format("Cannot Connect to Debug Adapter: %s", m_DebugAdapter);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
		else if (m_ProgramSettings.debugAdapterType == USB_ADAPTER)
		{
			if (FAILED(ConnectUSB(m_DebugAdapter, m_ProgramSettings.ecProtocol, 1, DISABLE_DIALOGS)))
			{
				errorMessage.Format("Cannot Connect to Debug Adapter: %s", m_DebugAdapter);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Check that partnum matches, log error if not
	if (!error && Connected())
	{
		// Pointer that will point to the part number string
		const char* pPartNumber;

		// Get the part number
		if (SUCCEEDED(GetDeviceName(&pPartNumber)))
		{
			// Check the part number to see if it matches, if not give an error
			if (m_ProgramSettings.partNumber.Compare(pPartNumber) != 0)
			{
				errorMessage.Format("Connected Device (%s) does not match Specified Device (%s)", partNumber, m_ProgramSettings.partNumber);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
		else
		{
			errorMessage.Format("Cannot obtain Connected Device Part Number");
			LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
			error = TRUE;
		}
	}

	// Download first hex image (not banked)
	// log error if it fails
	if (!m_ProgramSettings.hexFileNotBanked.IsEmpty())
	{
		if (!error && Connected())
		{
			if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileNotBanked), 0, DISABLE_DIALOGS, 0, -1, 0, m_ProgramSettings.flashPersist)))
			{
				errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileNotBanked);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Download second hex image (bank1)
	// log error if it fails
	if (!m_ProgramSettings.hexFileBank1.IsEmpty())
	{
		if (!error && Connected())
		{
			if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank1), 0, DISABLE_DIALOGS, 0, 1, 0, m_ProgramSettings.flashPersist)))
			{
				errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank1);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Download third hex image (bank2)
	// log error if it fails
	if (!m_ProgramSettings.hexFileBank2.IsEmpty())
	{
		if (!error && Connected())
		{
			if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank2), 0, DISABLE_DIALOGS, 0, 2, 0, m_ProgramSettings.flashPersist)))
			{
				errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank2);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Download fourth hex image (bank3)
	// log error if it fails
	if (!m_ProgramSettings.hexFileBank3.IsEmpty())
	{
		if (!error && Connected())
		{
			if (FAILED(Download(const_cast<char*>((const char*)m_ProgramSettings.hexFileBank3), 0, DISABLE_DIALOGS, 0, 3, 0, m_ProgramSettings.flashPersist)))
			{
				errorMessage.Format("Error Downloading Hex File (%s)", m_ProgramSettings.hexFileBank3);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Wait for device to finish any last minute routines after the download
	Sleep(500);

	// If we are serializing, write the serial number to the part, then check it
	// and log an error if it doesn't match or fails
	if (m_ProgramSettings.serializeParts)
	{
		BYTE serialNumber[4] = {0x00, 0x00, 0x00, 0x00};

		if (!error && Connected())
		{
			// Since a DWORD is reverse on PC memory, flip all the bytes before writing to flash
			serialNumber[0] = (m_CurrentSerialNumber & 0xFF000000) >> 24;
			serialNumber[1] = (m_CurrentSerialNumber & 0x00FF0000) >> 16;
			serialNumber[2] = (m_CurrentSerialNumber & 0x0000FF00) >> 8;
			serialNumber[3] = m_CurrentSerialNumber & 0x000000FF;

			if (FAILED(SetCodeMemory(&(serialNumber[4-m_ProgramSettings.serialNumberSize]), m_ProgramSettings.serialNumberCodeLocation, m_ProgramSettings.serialNumberSize, DISABLE_DIALOGS)))
			{
				errorMessage.Format("Error Setting Serial Number (%u)", m_CurrentSerialNumber);
				LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}

		if (!error && Connected())
		{
			*(DWORD*)serialNumber = 0x00000000;

			if (SUCCEEDED(GetCodeMemory(&(serialNumber[4-m_ProgramSettings.serialNumberSize]), m_ProgramSettings.serialNumberCodeLocation, m_ProgramSettings.serialNumberSize)))
			{
				// Compare in reverse to the current serial number since bytes will be read in reverse order
				// of what we will see on the PC memory
				if ((DWORD)((serialNumber[0] << 24) + (serialNumber[1] << 16) + (serialNumber[2] << 8) + serialNumber[3]) != m_CurrentSerialNumber)
				{
					errorMessage.Format("Serial Number in Device (%u) does not match Current Serial Number (%u)", serialNumber, m_CurrentSerialNumber);
					LogMessage(&m_Log, FALSE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
					error = TRUE;
				}
			}
			else
			{
				LogMessage(&m_Log, FALSE, "Cannot obtain Serial Number from Device", m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// If we are locking code space
	if (m_ProgramSettings.lockCodeMemory)
	{
		if (!error && Connected())
		{
			BYTE bytesToWrite;
			BYTE lockByte[2];

			lockByte[0] = m_ProgramSettings.writeLockValue;
			lockByte[1] = m_ProgramSettings.readLockValue;

			// If the lock byte addresses are the same, then we only need to write
			// one byte
			if (m_ProgramSettings.writeLockAddress == m_ProgramSettings.readLockAddress)
			{
				bytesToWrite = 1;
			}
			else
			{
				bytesToWrite = 2;
			}
			
			// Write one or two bytes to the lock byte address
			if (FAILED(SetCodeMemory(lockByte, m_ProgramSettings.writeLockAddress, bytesToWrite, DISABLE_DIALOGS)))
			{
				LogMessage(&m_Log, FALSE, "Error setting the lock byte", m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				error = TRUE;
			}
		}
	}

	// Disconnect from EC if connected
	if (Connected() && (m_ProgramSettings.debugAdapterType == SERIAL_ADAPTER))
	{
		Disconnect(comPort);
	}
	else if (Connected() && (m_ProgramSettings.debugAdapterType == USB_ADAPTER))
	{
		DisconnectUSB();
	}

	// Log Success and increment Serial Number
	if (!error)
	{
		CString serialString;
		serialString.Format("with Serial %u", m_CurrentSerialNumber);
		errorMessage.Format("Device %sProgrammed%s and Verified %s", (m_ProgramSettings.eraseCodeSpace ? "Erased, " : ""), (m_ProgramSettings.lockCodeMemory ? ", Locked" : ""), (m_ProgramSettings.serializeParts ? serialString : ""));
		LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);

		// Increment serial number, log error if overflow
		if (m_ProgramSettings.serializeParts)
		{
			if (m_CurrentSerialNumber != 0xFFFFFFFF)
			{
				m_CurrentSerialNumber += m_ProgramSettings.serialNumberIncrement;
			}
			else
			{
				errorMessage.Format("WARNING: Max Serial Number reached, overflowing Current Serial Number to %u", m_ProgramSettings.startingSerialNumber);
				LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
			}

			if (m_CurrentSerialNumber > m_ProgramSettings.maxSerialNumber)
			{
				errorMessage.Format("WARNING: Max Serial Number reached, overflowing Current Serial Number to %u", m_ProgramSettings.startingSerialNumber);
				LogMessage(&m_Log, TRUE, errorMessage, m_ProgramSettings.logToFile, m_ProgramSettings.logFilename);
				m_CurrentSerialNumber = m_ProgramSettings.startingSerialNumber;
			}

			m_CurrentSerialNumberString.Format("%u", m_CurrentSerialNumber);
		}
	}

	UpdateData(FALSE);

	EndWaitCursor();
}

void CMCUProgrammerDlg::OnDestroy() 
{
	CDialog::OnDestroy();
}

void CMCUProgrammerDlg::SetCurrentApplicationDirectory()
{
	char szAppPath[MAX_PATH] = "";
	CString strAppDirectory;

	GetCurrentDirectory(MAX_PATH, szAppPath);
	GetModuleFileName(0, szAppPath, sizeof(szAppPath) - 1);

	// Extract directory
	strAppDirectory = szAppPath;
	strAppDirectory = strAppDirectory.Left(strAppDirectory.ReverseFind('\\') + 1);

	// Set working directory to the current application directory for the log file
	SetCurrentDirectory(strAppDirectory);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -