2021-09-28 14:24:41 +08:00
|
|
|
|
//ϵͳ<CFB5><CDB3><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
|
|
|
|
|
#include "sys.h"
|
|
|
|
|
|
|
2021-08-10 15:01:54 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> MPU
|
|
|
|
|
|
*/
|
|
|
|
|
|
void MPU_Config(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
MPU_Region_InitTypeDef MPU_InitStruct;
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><>ֹ MPU */
|
|
|
|
|
|
HAL_MPU_Disable();
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>AXI SRAM<41><4D>MPU<50><55><EFBFBD><EFBFBD>ΪWrite through, read allocate<74><65>no write allocate */
|
|
|
|
|
|
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
|
|
|
|
|
|
MPU_InitStruct.BaseAddress = 0x24000000;
|
|
|
|
|
|
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
|
|
|
|
|
|
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
|
|
|
|
|
|
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
|
|
|
|
|
|
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
|
|
|
|
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
|
|
|
|
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
|
|
|
|
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
|
|
|
|
|
|
MPU_InitStruct.SubRegionDisable = 0x00;
|
|
|
|
|
|
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
|
|
|
|
|
|
|
|
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>FMC<4D><43>չIO<49><4F>MPU<50><55><EFBFBD><EFBFBD>ΪDevice<63><65><EFBFBD><EFBFBD>Strongly Ordered */
|
|
|
|
|
|
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
|
|
|
|
|
|
MPU_InitStruct.BaseAddress = 0x60000000;
|
|
|
|
|
|
MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
|
|
|
|
|
|
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
|
|
|
|
|
|
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
|
|
|
|
|
|
MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MPU_ACCESS_CACHEABLE;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>CS<43><53>WE<57>ź<EFBFBD> */
|
|
|
|
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
|
|
|
|
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER1;
|
|
|
|
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
|
|
|
|
|
|
MPU_InitStruct.SubRegionDisable = 0x00;
|
|
|
|
|
|
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
|
|
|
|
|
|
|
|
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>SRAM4<4D><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪWrite through, read allocate<74><65>no write allocate */
|
|
|
|
|
|
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
|
|
|
|
|
|
MPU_InitStruct.BaseAddress = 0x38000000;
|
|
|
|
|
|
MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
|
|
|
|
|
|
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
|
|
|
|
|
|
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
|
|
|
|
|
|
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
|
|
|
|
|
|
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
|
|
|
|
|
|
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
|
|
|
|
|
|
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
|
|
|
|
|
|
MPU_InitStruct.SubRegionDisable = 0x00;
|
|
|
|
|
|
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
|
|
|
|
|
|
|
|
|
|
|
|
HAL_MPU_ConfigRegion(&MPU_InitStruct);
|
|
|
|
|
|
|
|
|
|
|
|
/*ʹ<><CAB9> MPU */
|
|
|
|
|
|
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-08-04 10:46:24 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief ʹ<EFBFBD><EFBFBD> L1-Cache
|
|
|
|
|
|
*/
|
|
|
|
|
|
void Cache_Enable(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
SCB_EnableICache(); //ʹ<><CAB9> I-Cache
|
|
|
|
|
|
SCB_EnableDCache(); //ʹ<><CAB9> D-Cache
|
|
|
|
|
|
SCB->CACR |= 1 << 2; //ǿ<><C7BF> D-Cacheд
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ϵͳʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
2021-09-28 14:24:41 +08:00
|
|
|
|
void SystemClock_Init(void)
|
2021-08-04 10:46:24 +08:00
|
|
|
|
{
|
|
|
|
|
|
RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
|
|
|
|
|
RCC_OscInitTypeDef RCC_OscInitStruct;
|
2021-09-28 14:24:41 +08:00
|
|
|
|
HAL_StatusTypeDef ret = HAL_OK;
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
//<2F><>סSCU (Supply configuration update)
|
2021-08-04 10:46:24 +08:00
|
|
|
|
MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0);
|
2021-09-28 14:24:41 +08:00
|
|
|
|
|
2021-08-04 10:46:24 +08:00
|
|
|
|
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY))
|
2021-08-04 10:46:24 +08:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
//ʹ<><CAB9> HSE<53><45><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> HSE <20><>Ϊ PLL ʱ<><CAB1>Դ
|
2021-08-04 10:46:24 +08:00
|
|
|
|
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
|
|
|
|
|
|
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
|
|
|
|
|
RCC_OscInitStruct.HSIState = RCC_HSI_OFF;
|
|
|
|
|
|
RCC_OscInitStruct.CSIState = RCC_CSI_OFF;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
RCC_OscInitStruct.PLL.PLLM = 5;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLN = 160;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLP = 2;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLR = 2;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLQ = 4;
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
|
|
|
|
|
|
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
|
|
|
|
|
|
ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
/*
|
|
|
|
|
|
ѡ<EFBFBD><EFBFBD> PLL <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊϵͳʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_SYSCLK ϵͳʱ<EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_HCLK ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>Ӧ AHB1 AHB2 AHB3 AHB4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_PCLK1 ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>Ӧ APB1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_PCLK2 ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>Ӧ APB2 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_D1PCLK1 ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>Ӧ APB3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> RCC_CLOCKTYPE_D3PCLK1 ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD>Ӧ APB4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
*/
|
|
|
|
|
|
RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 |
|
|
|
|
|
|
RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1);
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
|
|
|
|
|
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
|
|
|
|
|
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
|
|
|
|
|
|
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
|
2021-09-28 14:24:41 +08:00
|
|
|
|
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
|
2021-08-04 10:46:24 +08:00
|
|
|
|
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
|
|
|
|
|
|
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
|
2021-09-28 14:24:41 +08:00
|
|
|
|
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
|
|
|
|
|
|
|
|
|
|
|
|
ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
|
|
|
|
|
__HAL_RCC_CSI_ENABLE();
|
2021-09-28 14:24:41 +08:00
|
|
|
|
|
2021-08-04 10:46:24 +08:00
|
|
|
|
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
2021-09-28 14:24:41 +08:00
|
|
|
|
|
2021-08-04 10:46:24 +08:00
|
|
|
|
HAL_EnableCompensationCell();
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
__HAL_RCC_D2SRAM1_CLK_ENABLE();
|
|
|
|
|
|
__HAL_RCC_D2SRAM2_CLK_ENABLE();
|
|
|
|
|
|
__HAL_RCC_D2SRAM3_CLK_ENABLE();
|
2021-08-04 10:46:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD>ж<EFBFBD> I_Cache <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @retval <EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t Get_ICacheSta(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t sta;
|
|
|
|
|
|
sta = ((SCB->CCR) >> 17) & 0X01;
|
|
|
|
|
|
return sta;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief <EFBFBD>ж<EFBFBD> I_Dache <EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @retval <EFBFBD>رշ<EFBFBD><EFBFBD><EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1
|
|
|
|
|
|
*/
|
|
|
|
|
|
uint8_t Get_DCacheSta(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
uint8_t sta;
|
|
|
|
|
|
sta = ((SCB->CCR) >> 16) & 0X01;
|
|
|
|
|
|
return sta;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
void Error_Handler(char *file, uint32_t line)
|
2021-08-04 10:46:24 +08:00
|
|
|
|
{
|
2021-09-28 14:24:41 +08:00
|
|
|
|
printf("Wrong parameters value: file %s on line %d\r\n", file, line);
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
if (line == 0)
|
|
|
|
|
|
return;
|
2021-08-04 10:46:24 +08:00
|
|
|
|
|
2021-09-28 14:24:41 +08:00
|
|
|
|
while (1)
|
|
|
|
|
|
;
|
2021-08-04 10:46:24 +08:00
|
|
|
|
}
|