Im STM32F4xxを使用していて、ST-HALを使用してプログラムを学習する必要があります。 私はSPIを割り込みで送受信しようとしています。STM32 HAL SPI割り込み処理
私はINT:
Init関数を介してデータを受信するために、以下の機能を使用:
void HAL_MspInit(void)
{
/* USER CODE BEGIN MspInit 0 */
/* USER CODE END MspInit 0 */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
/* System interrupt init*/
/* MemoryManagement_IRQn interrupt configuration */
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
/* BusFault_IRQn interrupt configuration */
HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
/* UsageFault_IRQn interrupt configuration */
HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
/* SVCall_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
/* DebugMonitor_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
/* PendSV_IRQn interrupt configuration */
HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
/* USER CODE BEGIN MspInit 1 */
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(SPI1_IRQn, 1, 1); //<--------------------
HAL_NVIC_EnableIRQ(SPI1_IRQn); //<--------------------
/* USER CODE END MspInit 1 */
}
スタート機能:
void main(void)
{
HAL_SPI_Receive_IT(&hspi1, buff, size);//Start the receiving process?
while(1)
{
. . .
}
}
Interrputhandler:
void SPI1_IRQHandler(void)
{
/* USER CODE BEGIN SPI1_IRQn 0 */
/* USER CODE END SPI1_IRQn 0 */
HAL_SPI_IRQHandler(&hspi1);
/* USER CODE BEGIN SPI1_IRQn 1 */
/* USER CODE END SPI1_IRQn 1 */
}
Callb (メインファイルで定義されている)ackfunction:私の質問の前に
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
volatile uint8_t y = 5;
}
:SPI_Transmit &は受信機能を "ノーマル" を使用して、私は&が正しく受信送信します。
私の問題は、この機能をどのように使うべきか理解できていないことです。 例:現時点ではそうでコールバック関数、IはInterruptflagsをクリアする必要がありますか、と...
を来るとき、私はスタート「機能」と呼ぶべきではどこに 『HAL_SPI_Transmit_IT』 & 『HAL_SPI_Receive_IT』を使用一方、(1)ループ。 RxとTxのコールバック関数には、カウンタ変数があります。私はtmpCounterRxがカウントアップすることを知っているが、tmpCounterTx dosnt ???
例えば:
while (1)
{
HAL_SPI_Transmit_IT(&hspi1, buff, size);
HAL_Delay(500);
HAL_SPI_Receive_IT(&hspi1, buff, size);
}
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
tmpCounterTx++;
volatile uint8_t x = 5;
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
tmpCounterRx++;
volatile uint8_t y = 5;
}
牧師1:返信用
おかげで、ここに私のSPIの初期化機能:
void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
に長いコードの断片を配置することは非常に困難です。 –
私は裸の登録アプローチを提案します。 –
Hm ... StdLibで割り込み処理が動作する方法が好きでした。しかし、私はHALを使用して学ぶ必要があり、私はそれがHALと裸の登録アプローチを混ぜることを推奨するかどうかを知りません...? – TangoOne