rtc_battery.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "rtc_battery.h"
  2. #include "FreeRTOS.h"
  3. #include "task.h"
  4. #include <stdio.h>
  5. #define ADV_FACTOR 0.000805
  6. float bat_voltage;
  7. //
  8. void adc_battery_gpio_init(void)
  9. {
  10. gpio_init_type gpio_initstructure;
  11. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  12. crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
  13. gpio_default_para_init(&gpio_initstructure);
  14. // VBAT RTC
  15. gpio_initstructure.gpio_mode = GPIO_MODE_ANALOG;
  16. gpio_initstructure.gpio_pins = GPIO_PINS_4;
  17. gpio_init(GPIOA, &gpio_initstructure);
  18. // EN_MEAS_V_BAT
  19. gpio_initstructure.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  20. gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
  21. gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  22. gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  23. gpio_initstructure.gpio_pins = GPIO_PINS_6;
  24. gpio_init(GPIOC, &gpio_initstructure);
  25. }
  26. //
  27. void adc_battery_init(void)
  28. {
  29. adc_base_config_type adc_base_struct;
  30. adc_battery_gpio_init();
  31. crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  32. crm_adc_clock_div_set(CRM_ADC_DIV_2);
  33. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  34. nvic_irq_enable(ADC1_2_IRQn, 5, 0);
  35. adc_combine_mode_select(ADC_INDEPENDENT_MODE);
  36. adc_base_default_para_init(&adc_base_struct);
  37. adc_base_struct.sequence_mode = TRUE;
  38. adc_base_struct.repeat_mode = FALSE;
  39. adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  40. adc_base_struct.ordinary_channel_length = 1;
  41. adc_base_config(ADC1, &adc_base_struct);
  42. adc_ordinary_channel_set(ADC1, ADC_CHANNEL_4, 1, ADC_SAMPLETIME_239_5);
  43. adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);
  44. adc_dma_mode_enable(ADC1, FALSE);
  45. adc_tempersensor_vintrv_enable(FALSE);
  46. adc_flag_clear(ADC1, ADC_CCE_FLAG);
  47. adc_interrupt_enable(ADC1, ADC_CCE_INT, TRUE);
  48. adc_enable(ADC1, TRUE);
  49. adc_calibration_init(ADC1);
  50. while(adc_calibration_init_status_get(ADC1));
  51. adc_calibration_start(ADC1);
  52. while(adc_calibration_status_get(ADC1));
  53. }
  54. //
  55. void adc_battery_task(void *params)
  56. {
  57. for (;;)
  58. {
  59. MEAS_VBAT_ENABLE;
  60. vTaskDelay(100);
  61. adc_ordinary_software_trigger_enable(ADC1, TRUE);
  62. vTaskDelay(360000);
  63. }
  64. }
  65. //
  66. void ADC1_2_IRQHandler(void)
  67. {
  68. adc_flag_clear(ADC1, ADC_CCE_FLAG);
  69. bat_voltage = (float)adc_combine_ordinary_conversion_data_get()*ADV_FACTOR;
  70. //printf("ADC: %f\r\n", bat_voltage);
  71. MEAS_VBAT_DISABLE;
  72. }