2017-08-03 15 views
0

この例では、データを送信するためにモードマスター(NSSピン制御)で実行するSPI2を使用します。 モードスレーブ(ハーベイウェアによるNSSピン制御)で実行されるSPI3は、DMAを使用してデータを受信します。keilシミュレータを使用しているときのSystemClock_config()タイムアウト

PC2(SPI3 MISO)はPC11(SPI3 MISO)に接続します。 PC3(SPI2 MOSI)はPC12(SPI3 MOSI)に接続します。 PB10(SPI2 SCK)はPC10(SPI3 SCK)に接続します。 PC6(ハードウェアによるSPI2 NSSピン制御)はPA4(ハードウェアによるSPI3 NSSピン制御)に接続します。デバッグ中

main.cの

#include "stm32f4xx_hal.h" 



#define spi_enable  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET) 
#define spi_disable HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET) 

SPI_HandleTypeDef hspi2; 
SPI_HandleTypeDef hspi3; 
DMA_HandleTypeDef hdma_spi3_rx; 





void SystemClock_Config(void); 
void Error_Handler(void); 
static void MX_GPIO_Init(void); 
static void MX_DMA_Init(void); 
static void MX_SPI2_Init(void); 
static void MX_SPI3_Init(void); 



uint8_t send_data=32,receive_data=0; 



int main(void) 
{ 



    HAL_Init(); 
    SystemClock_Config(); 
    MX_GPIO_Init(); 
    MX_DMA_Init(); 
    MX_SPI2_Init(); 
    MX_SPI3_Init(); 

    HAL_SPI_Receive_DMA(&hspi3,&receive_data,1); 




    while (1) 
    { 

     spi_enable; 
     HAL_SPI_Transmit_IT(&hspi2,&send_data,1); 
     HAL_Delay(1000); 
     send_data++; 
    } 



} 

void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) 
{ 
    if(hspi->Instance==hspi2.Instance) 
    { 
     spi_disable; 
    } 
} 

/** System Clock Configuration 
*/ 
void SystemClock_Config(void) 
{ 

    RCC_OscInitTypeDef RCC_OscInitStruct; 
    RCC_ClkInitTypeDef RCC_ClkInitStruct; 

    __HAL_RCC_PWR_CLK_ENABLE(); 

    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); 

    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 = 8; 
    RCC_OscInitStruct.PLL.PLLN = 336; 
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; 
    RCC_OscInitStruct.PLL.PLLQ = 4; 
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 
           |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4; 
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

    /* SysTick_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 
} 

/* SPI2 init function */ 
static void MX_SPI2_Init(void) 
{ 

    hspi2.Instance = SPI2; 
    hspi2.Init.Mode = SPI_MODE_MASTER; 
    hspi2.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi2.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi2.Init.NSS = SPI_NSS_SOFT; 
    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; 
    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi2.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi2.Init.CRCPolynomial = 10; 
    if (HAL_SPI_Init(&hspi2) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

/* SPI3 init function */ 
static void MX_SPI3_Init(void) 
{ 

    hspi3.Instance = SPI3; 
    hspi3.Init.Mode = SPI_MODE_SLAVE; 
    hspi3.Init.Direction = SPI_DIRECTION_2LINES; 
    hspi3.Init.DataSize = SPI_DATASIZE_8BIT; 
    hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; 
    hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; 
    hspi3.Init.NSS = SPI_NSS_HARD_INPUT; 
    hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; 
    hspi3.Init.TIMode = SPI_TIMODE_DISABLE; 
    hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; 
    hspi3.Init.CRCPolynomial = 10; 
    if (HAL_SPI_Init(&hspi3) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

/** 
    * Enable DMA controller clock 
    */ 
static void MX_DMA_Init(void) 
{ 
    /* DMA controller clock enable */ 
    __HAL_RCC_DMA1_CLK_ENABLE(); 

    /* DMA interrupt init */ 
    /* DMA1_Stream0_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0); 
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); 

} 

/** Configure pins as 
     * Analog 
     * Input 
     * Output 
     * EVENT_OUT 
     * EXTI 
*/ 
static void MX_GPIO_Init(void) 
{ 

    GPIO_InitTypeDef GPIO_InitStruct; 

    /* GPIO Ports Clock Enable */ 
    __HAL_RCC_GPIOH_CLK_ENABLE(); 
    __HAL_RCC_GPIOC_CLK_ENABLE(); 
    __HAL_RCC_GPIOA_CLK_ENABLE(); 
    __HAL_RCC_GPIOB_CLK_ENABLE(); 

    /*Configure GPIO pin Output Level */ 
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); 

    /*Configure GPIO pin : PC6 */ 
    GPIO_InitStruct.Pin = GPIO_PIN_6; 
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; 
    GPIO_InitStruct.Pull = GPIO_NOPULL; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; 
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); 

} 

/* USER CODE BEGIN 4 */ 

/* USER CODE END 4 */ 

/** 
    * @brief This function is executed in case of error occurrence. 
    * @param None 
    * @retval None 
    */ 
void Error_Handler(void) 
{ 
    /* USER CODE BEGIN Error_Handler */ 
    /* User can add his own implementation to report the HAL error return state */ 
    while(1) 
    { 
    } 
    /* USER CODE END Error_Handler */ 
} 

#ifdef USE_FULL_ASSERT 

/** 
    * @brief Reports the name of the source file and the source line number 
    * where the assert_param error has occurred. 
    * @param file: pointer to the source file name 
    * @param line: assert_param error line source number 
    * @retval None 
    */ 
void assert_failed(uint8_t* file, uint32_t line) 
{ 
    /* USER CODE BEGIN 6 */ 
    /* User can add his own implementation to report the file name and line number, 
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ 
    /* USER CODE END 6 */ 

} 

#endif 

/** 
    * @} 
    */ 

/** 
    * @} 
*/ 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 

、IはSystemClock_config()関数は連続コード下記実行することを見出しました。

/* Wait till HSE is ready */ 
    while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) 
    { 
     if((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) 
     { 
     return HAL_TIMEOUT; 
     } 

これ以上機能しないのはなぜですか?

+0

私はこのような複雑なマイクロのシミュレータは完全に役に立たないと恐れています。彼らは期待どおりに新しい作品。しかし、この場合、HSEオシレータを使用するようにシミュレータを設定していない可能性があります。私のアドバイス - 安価なSTM32F4ニューロボードを購入して(シガレットパックよりも安い)、シミュレータの使用をやめてください。 –

+0

貴重な回答をいただきありがとうございます。!!!!! @PeterJ – Akash

答えて

0

あなたはこれが助けることができるRTOSを使用している場合: http://www.keil.com/support/docs/3931.htm

したがってCMSIS RTOSは、すでにいくつかの割り込みの優先順位を設定します。説明に加えて()SystemClock_Configから、次のコードのコメントを解除するようにしてください:

//HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

//HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

/* SysTick_IRQn interrupt configuration */ 
//HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

私はそれが役に立てば幸い。

+0

以下の条件が満たされた後、このステップがあるかもしれません。 if(HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK) { Error_Handler(); }この機能は継続的に実行されています – Akash

+0

あなたのシステムは動作していません。 main.cにHAL_GetTick(void)を手動で実装してみてください。uint32_t HAL_GetTick(void){ static uint32_t ticks = 0U; uint32_t i; if(osKernelGetState()== osKernelRunning){ return((uint32_t)osKernelGetTickCount()); */} /*カーネルが約1ミリ秒間待機していない場合は、補助ティックカウンタの値を増分して返す*/ \t for(i =(SystemCoreClock >> 14U); i> 0U; i--){__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP(); } \t return ++ ticks; } – Stefan

関連する問題