我正在尝试使 HAL 的 SDMMC1 工作,但在寄存器中没有得到任何响应(在 KEIL 的调试模式下查看它,寄存器甚至不切换任何位),也看不到在示波器中初始化 MMC 的任何尝试(时钟、cmd 和数据线也不会切换)。
我正在初始化 MMC:
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SDMMC1_MMC_Init(void)
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USB_DEVICE_Init();
while (1)
{
if (UserRxBufferFS[0] == 0x97) // GOT command for emmc
{
UserRxBufferFS[0] = 0;
SDMMC1->POWER = 1; //check the power register( doesnt change in debug mode, why?)
MX_SDMMC1_MMC_Init();
SDMMC_PowerState_ON(&hmmc2); // check the power register with HAL( doesnt change aswell)
SDMMC_SendCommand(&hmmc2, 0); // checking cmd line, nothing happens in oscillo
}
}
static void MX_SDMMC1_MMC_Init(void)
{
hmmc1.Instance = SDMMC1;
hmmc1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
hmmc1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
hmmc1.Init.BusWide = SDMMC_BUS_WIDE_1B;
hmmc1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
hmmc1.Init.ClockDiv = 0;
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Supply configuration update enable
*/
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** Configure the main internal regulator output voltage
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 80;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 4;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
我知道要使mmc/sd卡(它们的协议几乎相同)工作,我们需要发送大量的cmd序列,我之前已经通过软mmc(sdio)实现完成了它,现在我需要读取mmc的速度,并且硬件可以帮我解决这个问题,但我从一开始就陷入困境,HAL 实现和直接寄存器访问根本对任何事情都没有反应
更新2。 stm32h7xx_hal_rcc.h HAL 生成(__HAL_RCC_C1_SDMMC1_CLK_ENABLE() 未激活):
我认为可能导致初始化问题的三件事。
hmmc1
和 hmmc2
之间切换。我认为它一次只尝试使用一个 SDMMC 实例,对吗?之后,我认为你的SDMMC初始化代码应该看起来像这样。
// Enable the clock to the peripheral. I'm not sure if this is the right RCC macro though
__HAL_RCC_SDMMC1_CLK_ENABLE();
// initializes hmmc1 structure with configuration from STM32Cube
MX_SDMMC1_MMC_Init();
// initializes the SMMC1 hardware peripheral with the config set above
SDMMC_Init(&hmmc1.Instance, &hmmc1.Init);
// Try the rest of your code here that works with the SDMMC registers
SDMMC_PowerState_ON(&hmmc1)
//....
我主要从 HAL 驱动程序中的文档获取此信息:https://github.com/STMicroelectronics/stm32h7xx_hal_driver/blob/6dd7f0e35c80b6e46ab7b77c972d2e785054d7c6/Src/stm32h7xx_ll_sdmmc.c#L59-L71。我没有硬件所以不知道能不能用。祝你好运