Код: Выделить всё
#define __O volatile /*!< Defines 'write only' permissions */Код: Выделить всё
#define __O volatile /*!< Defines 'write only' permissions */Код: Выделить всё
int main(void)
{
FRESULT res;
FATFS fileSystem;
FIL testFile;
uint8_t testBuffer[16] = "SD write success";
UINT testBytes;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_SDIO_SD_Init();
MX_FATFS_Init();
if(f_mount(&fileSystem, SDPath, 1) != FR_OK)
{
Error_Handler();
}
uint8_t path[13] = "testfile.txt";
path[12] = '\0';
res = f_open(&testFile, (char*)path, FA_WRITE | FA_CREATE_ALWAYS);
res = f_write(&testFile, testBuffer, 16, &testBytes);
res = f_close(&testFile);
while (1)
{
temp++;
}
}
void MX_SDIO_SD_Init(void)
{
hsd.Instance = SDIO;
hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
hsd.Init.ClockDiv = 3;
}
Код: Выделить всё
#define __I
#define __IO
#define __O
...
__I volatile uint16_t *FOO_register;
__IO volatile uint16_t *BAR_register;Код: Выделить всё
I2C1->CR1 |= I2C_CR1_SWRST;
I2C1->CR2 &= ~I2C_CR2_FREQ;
I2C1->TRISE =3;
I2C1->CR2 |= 2;
I2C1->CCR = 80; //Clock_Speed 100 000
I2C1->CR1 |= I2C_CR1_PE;
I2C1->CR1 |= I2C_CR1_ACK;
//I2C1->CR1 |= I2C_CR1_SMBTYPE; //
//I2C1->CR1 |= I2C_CR1_SMBUS; //
Код: Выделить всё
FLASH_Erase_Sector(FLASH_SECTOR_4, VOLTAGE_RANGE_3);
HAL_Delay(100);
Код: Выделить всё
HAL_StatusTypeDef STM32_FlashWrite(void *src,void *dst,size_t n)
{
HAL_StatusTypeDef status;
//HAL_FLASH_Unlock();
//if(status != HAL_OK)
// goto error;
for(size_t addr = 0; addr<n; addr++) {
if(HAL_FLASH_Program(TYPEPROGRAM_BYTE, dst,*(uint8_t *) src) != HAL_OK) {
goto error;
}
dst++;
src++;
}
error:
//HAL_FLASH_Lock();
return status;
}
HAL_StatusTypeDef STM32_FlashErase1(uint32_t begin,uint32_t count)
{
HAL_StatusTypeDef status = HAL_FLASH_Unlock();
if(status != HAL_OK) {
printf_dbg("STM32_FlashErase Unlock error\n");
goto error;
}
uint32_t PageError = 0;
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct.Sector = FLASH_SECTOR_5;
EraseInitStruct.NbSectors = 1;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_4;
status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
FLASH_Erase_Sector(FLASH_SECTOR_5, VOLTAGE_RANGE_3);
HAL_Delay(100);
void *addr = (void*)0x08020000;
char text[] = "Test Write MEM\n";
STM32_FlashWrite(text,addr,strlen(text));
error:
HAL_FLASH_Lock();
return status;
}
(char*)0x08000000
00|00|03|20|b5|53|00|08|39|53|
(char*)0x08004000
c1|e7|20|46|01|aa|21|49|ff|f7|
(char*)0x08008000
00|00|00|00|00|00|00|00|00|00|
(char*)0x0800C000
6d|65|2f|69|76|61|6e|2f|53|54|
(char*)0x08010000
54|65|73|74|20|57|72|69|74|65|
(char*)0x08020000
54|65|73|74|20|57|72|69|74|65|
(char*)0x08040000
ff|ff|ff|ff|ff|ff|ff|ff|ff|ff|
(char*)0x08060000
ff|ff|ff|ff|ff|ff|ff|ff|ff|ff|
Не кеил, но может наведет на какие-то мысли. http://purebasic.mybb.ru/viewtopic.php?id=564#p7600uk8amk писал(а):Обычно запуск процесса отладки кода включает в себя прошивку памяти, сброс, пуск программы. Таким образом программа всегда начинается с Startup или функции main. Бывают моменты когда желательно подключиться к странно работающему устройству и посмотреть что там не так. То есть присоединиться без сброса программы.
http://www.keil.com/support/docs/3697.htmµVISION DEBUGGER: Connect to a running target without hardware reset