OGBoy
OGBoy
这家伙很懒,什么也没写!

注册于 2年前

回答
2
文章
0
关注者
0

发布于1年前

  1. #include <stdbool.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include "rtdbg.h"
  5. #include "adc_sample.h"
  6. #include "main.h"
  7. /* 设置数据缓存大小,当SAADC采样完此大小数据时产生一次采样完成事件,采样过程中不需要CPU参与(所有通道均采集完成) */
  8. #define SAMPLE_IN_BUFFER (ADC_CHANNEL_NUMS * 1) //数据缓存大小
  9. static int16_t adc_buffer[SAMPLE_IN_BUFFER]; //数据缓存地址
  10. static adc_sample_t adc_sample = {RT_NULL};
  11. static saadc_cplt_cb_t saadc_callback_list[ADC_CHANNEL_NUMS] = {NULL};
  12. static bool m_status = false;
  13. static bool m_int_status = false;
  14. DMA_HandleTypeDef hdma_adc3;
  15. #if 1
  16. TIM_HandleTypeDef htim3;
  17. ADC_HandleTypeDef hadc3;
  18. /****************** weak callback ******************/
  19. void DMA2_Stream0_IRQHandler(void)
  20. {
  21. if(m_int_status == true) return;
  22. HAL_ADC_Stop_DMA(&hadc3);
  23. for(int i = 0; i < ADC_CHANNEL_NUMS; i++)
  24. {
  25. if(saadc_callback_list[i] != NULL)
  26. {
  27. float sample_value = adc_buffer[i] * 3.3 / 4096;
  28. saadc_callback_list[i](sample_value);
  29. //LOG_D("p_buffer[%d] :%f", i, sample_value);
  30. }
  31. }
  32. HAL_DMA_IRQHandler(&hdma_adc3);
  33. HAL_ADC_Start_DMA(&hadc3, (uint32_t*)adc_buffer, sizeof(adc_buffer));
  34. m_int_status = false;
  35. }
  36. void TIM3_IRQHandler(void)
  37. {
  38. HAL_TIM_IRQHandler(&htim3);
  39. }
  40. /* 定时器3初始化 */
  41. static uint8_t MX_TIM3_Init(void)
  42. {
  43. uint8_t err_ret = RT_ERROR;
  44. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  45. TIM_MasterConfigTypeDef sMasterConfig = {0};
  46. htim3.Instance = TIM3;
  47. htim3.Init.Prescaler = 8400;
  48. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  49. htim3.Init.Period = 10 * SAMPLE_TIME_INTERVAL; //设置采样周期
  50. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  51. htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  52. do{
  53. if (HAL_TIM_Base_Init(&htim3) != HAL_OK) break;
  54. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  55. if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) break;
  56. sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  57. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  58. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) break;
  59. err_ret = RT_EOK;
  60. LOG_D("MX_TIM3_Init success!");
  61. }while(0);
  62. return err_ret;
  63. }
  64. /**
  65. * Enable DMA controller clock
  66. */
  67. static void MX_DMA_Init(void)
  68. {
  69. /* DMA controller clock enable */
  70. __HAL_RCC_DMA2_CLK_ENABLE();
  71. /* DMA interrupt init */
  72. /* DMA2_Stream0_IRQn interrupt configuration */
  73. HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
  74. HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);
  75. LOG_D("MX_DMA_Init success!");
  76. }
  77. static void MX_DMA_DeInit(void)
  78. {
  79. /* DMA controller clock enable */
  80. __HAL_RCC_DMA2_CLK_DISABLE();
  81. /* DMA interrupt init */
  82. /* DMA2_Stream0_IRQn interrupt configuration */
  83. HAL_NVIC_DisableIRQ(DMA2_Stream0_IRQn);
  84. LOG_D("MX_DMA_DeInit success!");
  85. }
  86. /**
  87. * @brief ADC3 Initialization Function
  88. * @param None
  89. * @retval None
  90. */
  91. static uint8_t MX_ADC3_Init(void)
  92. {
  93. uint8_t err_ret = RT_ERROR;
  94. ADC_ChannelConfTypeDef sConfig = {0};
  95. /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */
  96. hadc3.Instance = ADC3;
  97. hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  98. hadc3.Init.Resolution = ADC_RESOLUTION_12B;
  99. hadc3.Init.ScanConvMode = ENABLE;
  100. hadc3.Init.ContinuousConvMode = DISABLE;
  101. hadc3.Init.DiscontinuousConvMode = DISABLE;
  102. hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  103. hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
  104. hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  105. hadc3.Init.NbrOfConversion = ADC_CHANNEL_NUMS;
  106. hadc3.Init.DMAContinuousRequests = ENABLE;
  107. hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  108. do
  109. {
  110. if (HAL_ADC_Init(&hadc3) != HAL_OK) break;
  111. /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.*/
  112. sConfig.Channel = ADC_CHANNEL_3;
  113. sConfig.Rank = 1;
  114. sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  115. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) break;
  116. /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */
  117. sConfig.Channel = ADC_CHANNEL_6;
  118. sConfig.Rank = 2;
  119. if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) break;
  120. err_ret = RT_EOK;
  121. LOG_D("MX_ADC3_Init success!");
  122. }while(0);
  123. return err_ret;
  124. }
  125. static void saadc_sample_start(void)
  126. {
  127. do{
  128. if (HAL_ADC_Start_DMA(&hadc3, (uint32_t*)adc_buffer, sizeof(adc_buffer)) != HAL_OK) {
  129. LOG_D("HAL_ADC_Start_DMA error!");
  130. break;
  131. }
  132. if (HAL_TIM_Base_Start_IT(&htim3) != HAL_OK) {
  133. LOG_D("HAL_TIM_Base_Start_IT error!");
  134. break;
  135. }
  136. m_int_status = false;
  137. }while(0);
  138. }
  139. static void saadc_init(void)
  140. {
  141. MX_TIM3_Init();
  142. MX_DMA_Init();
  143. MX_ADC3_Init();
  144. }
  145. static void saadc_unint(void)
  146. {
  147. HAL_TIM_Base_Stop_IT(&htim3); //关闭采集定时器
  148. HAL_ADC_Stop_DMA(&hadc3); //关闭ADC DMA采集
  149. /* 初始化定时器为默认配置 */
  150. HAL_TIM_Base_DeInit(&htim3);
  151. /* 初始化DMA为默认配置 */
  152. MX_DMA_DeInit();
  153. /* 初始化SAADC为默认配置 */
  154. HAL_ADC_DeInit(&hadc3);
  155. }
  156. #endif
  157. static void saadc_sample(uint8_t channel, saadc_cplt_cb_t callback)
  158. {
  159. int i = 1;
  160. i = i;
  161. //assert(channel < ADC_CHANNEL_NUMS);
  162. saadc_callback_list[channel] = callback;
  163. if(m_status == true) return;
  164. saadc_init();
  165. saadc_sample_start();
  166. m_status = true;
  167. LOG_D("saadc_sample is ernter!");
  168. }
  169. static void saadc_sample_cplt(uint8_t channel)
  170. {
  171. assert(channel < ADC_CHANNEL_NUMS);
  172. saadc_callback_list[channel] = NULL;
  173. int idx = 0;
  174. for(; idx < ADC_CHANNEL_NUMS; idx++)
  175. if(saadc_callback_list[idx] != NULL) break;
  176. if(m_status == false || idx < ADC_CHANNEL_NUMS) return;
  177. saadc_unint();
  178. m_status = false;
  179. LOG_D("saadc_sample_cplt is ernter!");
  180. }
  181. static int adc_sample_init(void)
  182. {
  183. assert(ADC_CHANNEL_NUMS < 8);
  184. adc_sample.sample = saadc_sample;
  185. adc_sample.sample_cplt = saadc_sample_cplt;
  186. return 0;
  187. }
  188. INIT_PREV_EXPORT(adc_sample_init);
  189. adc_sample_t* adc_sample_get(void)
  190. {
  191. return &adc_sample;
  192. }

发布于2年前

screenshot_image.png

回到
顶部

发布
问题

投诉
建议