Implement a secure ICS protocol targeting LoRa Node151 microcontroller for controlling irrigation.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

102 lines
2.8 KiB

  1. /*!
  2. * \file adc-board.c
  3. *
  4. * \brief Target board ADC driver implementation
  5. *
  6. * \copyright Revised BSD License, see section \ref LICENSE.
  7. *
  8. * \code
  9. * ______ _
  10. * / _____) _ | |
  11. * ( (____ _____ ____ _| |_ _____ ____| |__
  12. * \____ \| ___ | (_ _) ___ |/ ___) _ \
  13. * _____) ) ____| | | || |_| ____( (___| | | |
  14. * (______/|_____)_|_|_| \__)_____)\____)_| |_|
  15. * (C)2013-2017 Semtech
  16. *
  17. * \endcode
  18. *
  19. * \author Miguel Luis ( Semtech )
  20. *
  21. * \author Gregory Cristian ( Semtech )
  22. */
  23. #include "stm32l1xx.h"
  24. #include "board-config.h"
  25. #include "adc-board.h"
  26. ADC_HandleTypeDef AdcHandle;
  27. void AdcMcuInit( Adc_t *obj, PinNames adcInput )
  28. {
  29. AdcHandle.Instance = ADC1;
  30. __HAL_RCC_ADC1_CLK_ENABLE( );
  31. HAL_ADC_DeInit( &AdcHandle );
  32. if( adcInput != NC )
  33. {
  34. GpioInit( &obj->AdcInput, adcInput, PIN_ANALOGIC, PIN_PUSH_PULL, PIN_NO_PULL, 0 );
  35. }
  36. }
  37. void AdcMcuConfig( void )
  38. {
  39. // Configure ADC
  40. AdcHandle.Init.Resolution = ADC_RESOLUTION_12B;
  41. AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  42. AdcHandle.Init.ContinuousConvMode = DISABLE;
  43. AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  44. AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  45. AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T6_TRGO;
  46. AdcHandle.Init.DMAContinuousRequests = DISABLE;
  47. AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  48. AdcHandle.Init.NbrOfConversion = 1;
  49. AdcHandle.Init.LowPowerAutoWait = DISABLE;
  50. AdcHandle.Init.LowPowerAutoPowerOff = DISABLE;
  51. HAL_ADC_Init( &AdcHandle );
  52. }
  53. uint16_t AdcMcuReadChannel( Adc_t *obj, uint32_t channel )
  54. {
  55. ADC_ChannelConfTypeDef adcConf = { 0 };
  56. uint16_t adcData = 0;
  57. // Enable HSI
  58. __HAL_RCC_HSI_ENABLE( );
  59. // Wait till HSI is ready
  60. while( __HAL_RCC_GET_FLAG( RCC_FLAG_HSIRDY ) == RESET )
  61. {
  62. }
  63. // Wait the the Vrefint used by adc is set
  64. while( __HAL_PWR_GET_FLAG( PWR_FLAG_VREFINTRDY ) == RESET )
  65. {
  66. }
  67. __HAL_RCC_ADC1_CLK_ENABLE( );
  68. adcConf.Channel = channel;
  69. adcConf.Rank = ADC_REGULAR_RANK_1;
  70. adcConf.SamplingTime = ADC_SAMPLETIME_192CYCLES;
  71. HAL_ADC_ConfigChannel( &AdcHandle, &adcConf );
  72. // Start ADC Software Conversion
  73. HAL_ADC_Start( &AdcHandle );
  74. HAL_ADC_PollForConversion( &AdcHandle, HAL_MAX_DELAY );
  75. adcData = HAL_ADC_GetValue( &AdcHandle );
  76. __HAL_ADC_DISABLE( &AdcHandle );
  77. __HAL_RCC_ADC1_CLK_DISABLE( );
  78. // Disable HSI
  79. __HAL_RCC_HSI_DISABLE( );
  80. return adcData;
  81. }