JLINK脚本初始化外部SDRAM STM32H7
STM32H723 外部时钟8M,接了SDRAM1(因为有两个SDRAM区域,我用了第一个), 容量64M,JLINK脚本初始化PLL和SDRAM控制器,然后使得IDE可以把程序下载到SDRAM能跑起来
引脚配置如下:
/** FMC GPIO ConfigurationPF0 ------> FMC_A0PF1 ------> FMC_A1PF2 ------> FMC_A2PF3 ------> FMC_A3PF4 ------> FMC_A4PF5 ------> FMC_A5PA4 ------> FMC_D8PA7 ------> FMC_SDNWEPC4 ------> FMC_SDNE0PC5 ------> FMC_SDCKE0PF11 ------> FMC_SDNRASPF12 ------> FMC_A6PF13 ------> FMC_A7PF14 ------> FMC_A8PF15 ------> FMC_A9PG0 ------> FMC_A10PG1 ------> FMC_A11PE7 ------> FMC_D4PE8 ------> FMC_D5PE9 ------> FMC_D6PE10 ------> FMC_D7PE12 ------> FMC_D9PE13 ------> FMC_D10PE14 ------> FMC_D11PE15 ------> FMC_D12PD8 ------> FMC_D13PD9 ------> FMC_D14PD10 ------> FMC_D15PD14 ------> FMC_D0PD15 ------> FMC_D1PG2 ------> FMC_A12PG4 ------> FMC_BA0PG5 ------> FMC_BA1PG8 ------> FMC_SDCLKPD0 ------> FMC_D2PD1 ------> FMC_D3PG15 ------> FMC_SDNCASPE0 ------> FMC_NBL0PE1 ------> FMC_NBL1*/
所以脚本应该如下:
int SetupHardware(void) {U32 pll_status;int pll_timeout; // 100ms超时U32 CR;JLINK_TARGET_Halt(); // 暂停目标设备// PLL配置JLINK_MEM_WriteU32(0x58024400, 0x01<<16); //使能HSEwhile(1){CR= JLINK_MEM_ReadU32(0x58024400);if(CR&(1<<17)){break;}}//pll_status=0x0F034025;//pll_status=pll_status&(~(1<<24));//pll_status=pll_status&(~(1<<26));//JLINK_MEM_WriteU32(0x58024400, pll_status); //关闭PLL1 PLL2JLINK_MEM_WriteU32(0x58024428, 0x02002042); // RCC->PLLCKSELR 对不上JLINK_MEM_WriteU32(0x5802442C, 0x01FF0095); // RCC->PLLCFGR JLINK_MEM_WriteU32(0x58024430, 0x01030112); // RCC->PLL1DIVRJLINK_MEM_WriteU32(0x58024438, 0x03040263); // RCC->PLL2DIVRJLINK_MEM_WriteU32(0x58024440, 0x01010280); // RCC->PLL3DIVRJLINK_MEM_WriteU32(0x58024400, 0x0F034025); // RCC->CR JLINK_SYS_Sleep(100);pll_status = 0;pll_timeout = 100; // 100ms超时do {pll_status = JLINK_MEM_ReadU32(0x58024400); // 读取RCC_CRJLINK_SYS_Sleep(1);pll_timeout=pll_timeout-1;} while (((pll_status & (1 << 25)) == 0) && // PLL1未锁定((pll_status & (1 << 27)) == 0) && // PLL2未锁定((pll_status & (1 << 29)) == 0) && // PLL3未锁定(pll_timeout > 0));if (pll_timeout <= 0) {JLINK_SYS_Report1("PLL锁定失败!状态寄存器值:0x%08X", pll_status); // 错误报告[6](@ref)}// ===== RCC时钟配置 =====JLINK_MEM_WriteU32(0x58024400, 0x0F034025); // RCC->CRJLINK_SYS_Sleep(100);JLINK_MEM_WriteU32(0x58024404, 0x400004F7); // RCC->ICSCRJLINK_MEM_WriteU32(0x58024410, 0x0000001B); // RCC->CFGRJLINK_MEM_WriteU32(0x58024418, 0x00000048); // RCC->D1CFGRJLINK_MEM_WriteU32(0x5802441C, 0x00000440); // RCC->D2CFGRJLINK_MEM_WriteU32(0x58024420, 0x00000040); // RCC->D3CFGR// 时钟源选择JLINK_MEM_WriteU32(0x5802444C, 0x00010001); // RCC->D1CCIPRJLINK_MEM_WriteU32(0x58024450, 0x20000000); // RCC->D2CCIP1R// 时钟使能JLINK_MEM_WriteU32(0x58024534, 0x00001000); // RCC->C1_AHB3ENRJLINK_MEM_WriteU32(0x580244D4, 0x00001000); // RCC->AHB3ENRJLINK_MEM_WriteU32(0x580244E0, 0x000000FF); // RCC->AHB4ENRJLINK_MEM_WriteU32(0x58024540, 0x000000FF); // RCC->C1_AHB4ENRJLINK_MEM_WriteU32(0x580244F4, 0x00010002); // RCC->APB4ENRJLINK_MEM_WriteU32(0x58024554, 0x00010002); // RCC->C1_APB4ENR// 低功耗时钟使能JLINK_MEM_WriteU32(0x5802455C, 0xF0E95111); // RCC->C1_AHB3LPENRJLINK_MEM_WriteU32(0x580244FC, 0xF0E95111); // RCC->AHB3LPENRJLINK_MEM_WriteU32(0x58024564, 0x60030271); // RCC->C1_AHB2LPENRJLINK_MEM_WriteU32(0x58024504, 0x60030271); // RCC->AHB2LPENRJLINK_MEM_WriteU32(0x58024508, 0x312806FF); // RCC->AHB4LPENRJLINK_MEM_WriteU32(0x58024568, 0x312806FF); // RCC->C1_AHB4LPENR// ===== GPIO配置 =====// GPIOAJLINK_MEM_WriteU32(0x58020000, 0xEBFFBEFF); // MODERJLINK_MEM_WriteU32(0x58020008, 0x0C00C300); // OSPEEDRJLINK_MEM_WriteU32(0x5802000C, 0x64000000); // PUPDRJLINK_MEM_WriteU32(0x58020020, 0xC00C0000); // AFRL// GPIOCJLINK_MEM_WriteU32(0x58020800, 0xFFFFFAFF); // MODERJLINK_MEM_WriteU32(0x58020808, 0x00000F00); // OSPEEDRJLINK_MEM_WriteU32(0x58020820, 0x00CC0000); // AFRL// GPIODJLINK_MEM_WriteU32(0x58020C00, 0xAF6AFFFA); // MODERJLINK_MEM_WriteU32(0x58020C08, 0xF0FF000F); // OSPEEDRJLINK_MEM_WriteU32(0x58020C0C, 0x00400000); // PUPDRJLINK_MEM_WriteU32(0x58020C14, 0x00000800); // ODRJLINK_MEM_WriteU32(0x58020C20, 0x000000CC); // AFRLJLINK_MEM_WriteU32(0x58020C24, 0xCC000CCC); // AFRH// GPIOEJLINK_MEM_WriteU32(0x58021000, 0xAAEABFFA); // MODERJLINK_MEM_WriteU32(0x58021008, 0xFF3FC00F); // OSPEEDRJLINK_MEM_WriteU32(0x58021020, 0xC00000CC); // AFRLJLINK_MEM_WriteU32(0x58021024, 0xCCCC0CCC); // AFRH// GPIOFJLINK_MEM_WriteU32(0x58021400, 0xAABDFAAA); // MODERJLINK_MEM_WriteU32(0x58021408, 0xFFC00FFF); // OSPEEDRJLINK_MEM_WriteU32(0x58021420, 0x00CCCCCC); // AFRLJLINK_MEM_WriteU32(0x58021424, 0xCCCCC000); // AFRH// GPIOGJLINK_MEM_WriteU32(0x58021800, 0xBFFEFAEA); // MODERJLINK_MEM_WriteU32(0x58021808, 0xC0030F3F); // OSPEEDRJLINK_MEM_WriteU32(0x58021820, 0x00CC0CCC); // AFRLJLINK_MEM_WriteU32(0x58021824, 0xC000000C); // AFRHreturn 0; // 返回成功状态
}
int AfterResetTarget(void)
{return 0;//SetupHardware();
}
int ResetTarget(void)
{return SetupHardware();
}