Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/famicom-dumper-writer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-04-18 22:12:03 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-04-18 22:12:03 +0300
commit5c8b9c01f59d79ecbf2669fc5556003567483d53 (patch)
treee56000a69144ae0db8b0a7a5c21a6a4e16083b1d
parenta52f849cfca47e48b54c99a5eb95447649cbd3ac (diff)
Refactoring and fixes
-rw-r--r--STM32/Core/Src/main.c4
-rw-r--r--STM32_bootloader/Core/Src/main.c77
-rw-r--r--STM32_bootloader/FamicomDumperBootloader.ioc38
3 files changed, 84 insertions, 35 deletions
diff --git a/STM32/Core/Src/main.c b/STM32/Core/Src/main.c
index 38a8d7c..b1ed729 100644
--- a/STM32/Core/Src/main.c
+++ b/STM32/Core/Src/main.c
@@ -159,6 +159,10 @@ int main(void)
comm_send_byte((FIRMWARE_VERSION_MAJOR >> 8) & 0xFF);
comm_send_byte(FIRMWARE_VERSION_MINOR & 0xFF);
comm_send_byte((FIRMWARE_VERSION_MINOR >> 8) & 0xFF);
+ comm_send_byte(FIRMWARE_VERSION_MAJOR & 0xFF);
+ comm_send_byte((FIRMWARE_VERSION_MAJOR >> 8) & 0xFF);
+ comm_send_byte(FIRMWARE_VERSION_MINOR & 0xFF);
+ comm_send_byte((FIRMWARE_VERSION_MINOR >> 8) & 0xFF);
set_coolboy_gpio_mode(0);
break;
diff --git a/STM32_bootloader/Core/Src/main.c b/STM32_bootloader/Core/Src/main.c
index 8362825..f2e6d56 100644
--- a/STM32_bootloader/Core/Src/main.c
+++ b/STM32_bootloader/Core/Src/main.c
@@ -66,24 +66,27 @@ static void MX_TIM2_Init(void);
/* USER CODE BEGIN 0 */
static void start_app(void) {
- uint32_t appJumpAddress;
- void (*GoToApp)(void);
-
- appJumpAddress = *((volatile uint32_t*)(APP_ADDRESS + 4));
- GoToApp = (void (*)(void))appJumpAddress;
+ // App start address
+ void (*jmp_to_app)(void) = (void (*)(void))(*((volatile uint32_t*)(APP_ADDRESS + 4)));
+ // Vector table
SCB->VTOR = APP_ADDRESS;
- __set_MSP(*((volatile uint32_t*) APP_ADDRESS)); //stack pointer (to RAM) for USER app in this address
- GoToApp();
+ // Stack pointer (to RAM) for USER app in this address
+ __set_MSP(*((volatile uint32_t*) APP_ADDRESS));
+ jmp_to_app();
+ // Should not execute
while (1) {}
}
static void error(void)
{
+ // Dispose resources, show red LED and stop
f_mount(NULL, "", 1);
HAL_FLASH_Lock();
set_led_color(0xFF, 0x00, 0x00);
+ HAL_Delay(50);
+ __disable_irq();
while (1) {}
}
@@ -100,26 +103,38 @@ static void write_firmware(void)
uint32_t SECTORError = 0;
HAL_StatusTypeDef hres;
uint16_t value;
+ HAL_StatusTypeDef hr;
+ // Unlock flash
+ hr = HAL_FLASH_Unlock();
+ if (hr != HAL_OK)
+ error();
+ // Mount FAT file system
fr = f_mount(&FatFs, "", 1);
if (fr)
error();
+ // Open firmware file
fr = f_open(&fil, FIRMWARE_FILE, FA_READ);
if (fr)
error();
while (1) {
+ // Read data
fr = f_read(&fil, buff, MSD_BLOCK_SIZE, &br);
if (fr)
error();
- if (!br) break;
+ // Break if end of file
+ if (!br)
+ break;
if ((address % MSD_BLOCK_SIZE) != 0)
error();
+ // Erase flash page
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.PageAddress = address;
EraseInitStruct.NbPages = 1;
hres = HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError);
if (hres != HAL_OK)
error();
+ // Write data
for (i = 0; i < br; i += 2) {
value = *(volatile uint16_t*) &buff[i];
hres = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, value);
@@ -128,18 +143,18 @@ static void write_firmware(void)
address += 2;
}
}
+ // Close file
fr = f_close(&fil);
if (fr)
error();
-
+ // Delete file
fr = f_unlink(FIRMWARE_FILE);
- /*
- if (fr)
- error();
- */
+ // Unmount
fr = f_mount(NULL, "", 1);
if (fr)
error();
+ // Lock flash
+ HAL_FLASH_Lock();
}
/* USER CODE END 0 */
@@ -167,17 +182,29 @@ int main(void)
SystemClock_Config();
/* USER CODE BEGIN SysInit */
+ // Pre-init
MX_GPIO_Init();
MX_DMA_Init();
MX_TIM5_Init();
MX_TIM2_Init();
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
- HAL_Delay(100);
- // If IRQ not fired...
+ HAL_Delay(10);
+ // If IRQ pin not grounded - start app
+#ifndef DEBUG
if (HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin)) start_app();
+#endif
+ // Green LED
set_led_color(0x00, 0xFF, 0x00);
+ // Need to release pin during one second
HAL_Delay(1000);
- if (!HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin)) start_app();
+ // If IRQ pin not released...
+ if (!HAL_GPIO_ReadPin(IRQ_GPIO_Port, IRQ_Pin)) {
+ // Turn off LED
+ set_led_color(0x00, 0x00, 0x00);
+ HAL_Delay(50);
+ // Start app
+ start_app();
+ }
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
@@ -188,6 +215,7 @@ int main(void)
MX_FATFS_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
+ // Yellow LED
set_led_color(0xFF, 0xFF, 0x00);
/*
*/
@@ -198,19 +226,25 @@ int main(void)
/* USER CODE BEGIN WHILE */
while (1)
{
+ // Check if last write operation was long time ago
if (last_write_ts && (HAL_GetTick() - last_write_ts >= WRITE_TO_FLASH_TIME)) {
FATFS FatFs;
FRESULT fr;
+ // Mount FAT file system and check if firmware file exists
f_mount(&FatFs, "", 1);
fr = f_stat(FIRMWARE_FILE, NULL);
f_mount(NULL, "", 1);
if (fr == FR_OK) {
+ // White LED
set_led_color(0xFF, 0xFF, 0xFF);
+ // Disable USB MSD
USBD_DeInit(&hUsbDeviceFS);
+ // Write firmware
write_firmware();
+ // Turn off the LED
set_led_color(0x00, 0x00, 0x00);
- HAL_Delay(200);
- //start_app();
+ HAL_Delay(50);
+ // Stop
__disable_irq();
while (1) { }
} else {
@@ -269,6 +303,7 @@ void SystemClock_Config(void)
{
Error_Handler();
}
+ HAL_RCC_MCOConfig(RCC_MCO, RCC_MCO1SOURCE_PLLCLK, RCC_MCODIV_1);
}
/**
@@ -416,6 +451,12 @@ static void MX_GPIO_Init(void)
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(NE2_GPIO_Port, NE2_Pin, GPIO_PIN_SET);
+ /*Configure GPIO pin : PA8 */
+ GPIO_InitStruct.Pin = GPIO_PIN_8;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
/*Configure GPIO pins : NOE_Pin NWE_Pin NE1_Pin */
GPIO_InitStruct.Pin = NOE_Pin|NWE_Pin|NE1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
diff --git a/STM32_bootloader/FamicomDumperBootloader.ioc b/STM32_bootloader/FamicomDumperBootloader.ioc
index 30c9906..71a22a4 100644
--- a/STM32_bootloader/FamicomDumperBootloader.ioc
+++ b/STM32_bootloader/FamicomDumperBootloader.ioc
@@ -37,23 +37,24 @@ Mcu.Name=STM32F103Z(C-D-E)Tx
Mcu.Package=LQFP144
Mcu.Pin0=OSC_IN
Mcu.Pin1=OSC_OUT
-Mcu.Pin10=PD7
-Mcu.Pin11=PG9
-Mcu.Pin12=PB3
-Mcu.Pin13=PB7
-Mcu.Pin14=VP_FATFS_VS_Generic
-Mcu.Pin15=VP_SYS_VS_Systick
-Mcu.Pin16=VP_TIM2_VS_ClockSourceINT
-Mcu.Pin17=VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS
+Mcu.Pin10=PD5
+Mcu.Pin11=PD7
+Mcu.Pin12=PG9
+Mcu.Pin13=PB3
+Mcu.Pin14=PB7
+Mcu.Pin15=VP_FATFS_VS_Generic
+Mcu.Pin16=VP_SYS_VS_Systick
+Mcu.Pin17=VP_TIM2_VS_ClockSourceINT
+Mcu.Pin18=VP_USB_DEVICE_VS_USB_DEVICE_MSC_FS
Mcu.Pin2=PA0-WKUP
Mcu.Pin3=PA2
-Mcu.Pin4=PA11
-Mcu.Pin5=PA12
-Mcu.Pin6=PA13
-Mcu.Pin7=PA14
-Mcu.Pin8=PD4
-Mcu.Pin9=PD5
-Mcu.PinsNb=18
+Mcu.Pin4=PA8
+Mcu.Pin5=PA11
+Mcu.Pin6=PA12
+Mcu.Pin7=PA13
+Mcu.Pin8=PA14
+Mcu.Pin9=PD4
+Mcu.PinsNb=19
Mcu.ThirdPartyNb=0
Mcu.UserConstants=MSD_ADDRESS,0x8010000;MSD_BLOCK_SIZE,2048;MSD_BLOCK_COUNT,192 * 1024 / MSD_BLOCK_SIZE
Mcu.UserName=STM32F103ZETx
@@ -92,6 +93,8 @@ PA2.GPIOParameters=GPIO_Label
PA2.GPIO_Label=WS2812
PA2.Locked=true
PA2.Signal=S_TIM5_CH3
+PA8.Mode=Clock-out
+PA8.Signal=RCC_MCO
PB3.Mode=Trace_Asynchronous_SW
PB3.Signal=SYS_JTDO-TRACESWO
PB7.GPIOParameters=GPIO_PuPd,GPIO_Label
@@ -163,11 +166,12 @@ RCC.HSEDivPLL=RCC_HSE_PREDIV_DIV2
RCC.HSE_VALUE=16000000
RCC.I2S2Freq_Value=72000000
RCC.I2S3Freq_Value=72000000
-RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FSMCFreq_Value,FamilyName,HCLKFreq_Value,HSEDivPLL,HSE_VALUE,I2S2Freq_Value,I2S3Freq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,SDIOFreq_Value,SDIOHCLKDiv2FreqValue,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,USBPrescaler,VCOOutput2Freq_Value
-RCC.MCOFreq_Value=72000000
+RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FSMCFreq_Value,FamilyName,HCLKFreq_Value,HSEDivPLL,HSE_VALUE,I2S2Freq_Value,I2S3Freq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,RCC_MCOSource,SDIOFreq_Value,SDIOHCLKDiv2FreqValue,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,USBPrescaler,VCOOutput2Freq_Value
+RCC.MCOFreq_Value=36000000
RCC.PLLCLKFreq_Value=72000000
RCC.PLLMCOFreq_Value=36000000
RCC.PLLMUL=RCC_PLL_MUL9
+RCC.RCC_MCOSource=RCC_MCO1SOURCE_PLLCLK
RCC.SDIOFreq_Value=72000000
RCC.SDIOHCLKDiv2FreqValue=36000000
RCC.SYSCLKFreq_VALUE=72000000