HAL SPI initialization and configuration functions migration ¶
The goal of this page is to show how to migrate the initialization sequence using STM32CubeMX2 :
Open STM32CubeMX2 SPI configuration panel.
Configure the SW layer HAL.
Configure the SPI main features.
Configure the advanced SPI features if needed.
Configure the SPI GPIO pins.
Configure the SPI DMA(s) if the application requires the SPI to be used in DMA mode.
Configure the NVIC if the application requires the SPI to be used in IT mode.
Generate the code
HAL SPI configuration panel ¶
Create a new project with the STM32CubeMX2, then start the initialization and the main configuration.
HAL SPI main features configuration ¶
Configure the SPI main features.
HAL SPI advanced features configuration ¶
Configure the advanced SPI features if needed.
GPIO configuration ¶
Configure GPIO pins.
DMA configuration ¶
Configure the DMA for data reception as needed.
NVIC configuration ¶
Configure the NVIC in case of an interrupt.
Generated SPI initialization and de-initialization sequences ¶
The SPI initialization sequence is generated in the
mx_spi1_init
function in
mx_spi1.c
file under
$YOUR_PROJECT_NAME$/$YOUR_PROJECT_NAME$_SW/generated/STM32Cube_CodeGen.
Related concepts:
|
Topic |
HAL1 Code Snippet |
HAL2 Code Snippet |
|---|---|---|
|
Handle declaration |
SPI_HandleTypeDef* hspi
|
hal_spi_config_t spi_config;
|
|
Initialization and configuration sequence |
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_4BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 0x7;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE;
hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY;
hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(hspi->Instance==SPI1)
{
/** Initializes the peripherals clock
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SPI1;
PeriphClkInit.Spi1ClockSelection = RCC_SPI1CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
/* Peripheral clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
|
hal_spi_handle_t *mx_spi1_init(void)
{
if (HAL_SPI_Init(&hSPI1, HAL_SPI1) != HAL_OK)
{
return NULL;
}
HAL_RCC_SPI1_EnableClock();
if (HAL_RCC_SPI1_SetKernelClkSource(HAL_RCC_SPI1_CLK_SRC_PCLK2) != HAL_OK)
{
return NULL;
}
spi_config.mode = HAL_SPI_MODE_MASTER;
spi_config.direction = HAL_SPI_DIRECTION_FULL_DUPLEX;
spi_config.data_width = HAL_SPI_DATA_WIDTH_8_BIT;
spi_config.clock_polarity = HAL_SPI_CLOCK_POLARITY_LOW;
spi_config.clock_phase = HAL_SPI_CLOCK_PHASE_1_EDGE;
spi_config.baud_rate_prescaler = HAL_SPI_BAUD_RATE_PRESCALER_2;
spi_config.first_bit = HAL_SPI_MSB_FIRST;
spi_config.nss_pin_management = HAL_SPI_NSS_PIN_MGMT_INTERNAL;
if (HAL_SPI_SetConfig(&hSPI1, &spi_config) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_EnableReadyPin(&hSPI1) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_MASTER_EnableReceiverAutoSuspend(&hSPI1) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_MASTER_EnableKeepIOState(&hSPI1) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_EnableMosiMisoSwap(&hSPI1) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_LockIOConfig(&hSPI1) != HAL_OK)
{
return NULL;
}
if (HAL_SPI_EnableDelayReadDataSampling(&hSPI1) != HAL_OK)
{
return NULL;
}
HAL_RCC_GPIOA_EnableClock();
hal_gpio_config_t gpio_config;
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_HIGH;
gpio_config.alternate = HAL_GPIO_AF_5;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_5 | HAL_GPIO_PIN_6, &gpio_config);
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_HIGH;
gpio_config.alternate = HAL_GPIO_AF_4;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_4, &gpio_config);
gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
gpio_config.pull = HAL_GPIO_PULL_NO;
gpio_config.speed = HAL_GPIO_SPEED_FREQ_HIGH;
gpio_config.alternate = HAL_GPIO_AF_6;
HAL_GPIO_Init(HAL_GPIOA, HAL_GPIO_PIN_0, &gpio_config);
return &hSPI1;
}
|
|
Deinitialization sequence |
static void MX_SPI1_DeInit(void)
{
HAL_SPI_DeInit(&hspi);
}
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{
if(hspi->Instance==SPI1)
{
__HAL_RCC_SPI1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_11);
}
}
|
void mx_spi1_deinit(void)
{
(void)HAL_SPI_DeInit(&hSPI1);
HAL_RCC_SPI1_Reset();
HAL_RCC_SPI1_DisableClock();
/* De-initialize all GPIO pins associated with SPI1 */
HAL_GPIO_DeInit(HAL_GPIOA, HAL_GPIO_PIN_0 | HAL_GPIO_PIN_4 | HAL_GPIO_PIN_5 | HAL_GPIO_PIN_6);
}
|
|
IRQ handle function |
void GPDMA1_Channel1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel1);
}
void GPDMA1_Channel0_IRQHandler(void)
{
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel0);
}
void SPI1_IRQHandler(void)
{
HAL_SPI_IRQHandler(&hspi1);
}
|
void LPDMA1_CH1_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hLPDMA1_CH1);
}
void LPDMA1_CH0_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hLPDMA1_CH0);
}
void SPI1_IRQHandler(void)
{
HAL_SPI_IRQHandler(&hSPI1);
}
|