简介
在本章节中我们将在BLE_p2pServer的基础上配置ADC,并且采集电池电压。 这里有一点比较坑的就是WPAN在默认的配置中使用了内部的ADC的温度通道作为校准使用。 因此一旦你直接使用ADC进行采集的话,那么会出现在调用HAL_ADC_Start的时候便会出现无限延时或者是其他的错误。总之就是无法触发采集和ADC转换。 同时CUBEMX在对这个工程编辑的时候总会出现一些库找不到的情况。那么本篇文章将会对上面出现的问题进行讨论和解决。
1 - 配置STM32CUBEMX
注意,上述需要在中间件的STM32_WPAN中关闭掉这个温度校准的功能, 如上图所示.
2- 配置ADC通道
上述我开启了ADC4的2通道, 注意这里最好不要关闭这个内置的温度通道。 其他的ADC配置等保持默认即可。 然后生成项目。
3-编译项目和缺失文件补全。
在编译项目的时候很有可能会出现某些库文件没有被STM32CUBEMX正确拷贝的情况。 最多出现问题的就是adc_ctrl_conf.c 和 adc_ctrl_conf.h。 如果没有这两个文件将会出现编译不通过的情况。
但是这个文件在你本地应当是存在的, 可以使用everything软件来搜索这两个文件,将这两个文件放到上述文件夹中即可。 如果文件夹不存在的话需要新建处理。
4- 编码ADC采集
在STM32CUBEMX生成代码之后按道理来讲它会将初始化的工作都做好,但是CUBEMX有时候并不会帮你来主动调用那些初始化方法。所以我们需要检查在main函数中是否已经正确的调用了MX_ADC_init()。 然后我们便可以编写我们的ADC采样的代码。代码如下所示。
int main(void) { HAL_Init(); MX_APPE_Config(); SystemClock_Config(); PeriphCommonClock_Config(); MX_GPIO_Init(); MX_GPDMA1_Init(); MX_RAMCFG_Init(); MX_RTC_Init(); MX_RNG_Init(); MX_ICACHE_Init(); MX_ADC4_Init(); MX_APPE_Init(NULL); uint32_t adcValue; uint32_t channel = 0; while (1) { MX_APPE_Process(); // // 配置通道 1(示例为温度传感器) // sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; // sConfig.Rank = ADC_REGULAR_RANK_1; // sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; // if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK) { // Error_Handler(); // } // // // 启动并获取通道 1 的值 // if (HAL_ADC_Start(&hadc4) != HAL_OK) { // Error_Handler(); // } // if (HAL_ADC_PollForConversion(&hadc4, 1000) == HAL_OK) { // adcValue = HAL_ADC_GetValue(&hadc4); // LOG_INFO_APP("Channel: 1, TEMPSENSOR, ADC Value: %lu\r\n", adcValue); // LOG_INFO_APP("\r\n"); // } // HAL_ADC_Stop(&hadc4); // 配置通道 2 sConfig.Channel = ADC_CHANNEL_2; if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK) { Error_Handler(); } // 启动并获取通道 2 的值 if (HAL_ADC_Start(&hadc4) != HAL_OK) { Error_Handler(); } if (HAL_ADC_PollForConversion(&hadc4, 1000) == HAL_OK) { adcValue = HAL_ADC_GetValue(&hadc4); LOG_INFO_APP("Channel: 2, ADC Value: %lu\r\n", adcValue); LOG_INFO_APP("\r\n"); } HAL_ADC_Stop(&hadc4); } }
如果你需要采集温度通道的话,可以自行取消上述的代码注释。 此时便可以完成ADC的采集。 上述代码并不需要担心在While中影响到蓝牙协议。实际上在我的测试中,延时100毫秒左右蓝牙协议还是可以正常的运行。 如果需要配置中断相关等可以在上述代码上自行拓展。
效果如下所示
心得体会
虽然上述文章的内容并不是很多,但是在这个demo上增加ADC的功能已经折腾了我来来回回将近三天时间。 主要的原因就是WPAN的温度通道和ADC的采集冲突以及CUBEMX的代码生成的时候出现各种各样的库文件丢失或者是方法生成不完整不正常调用等。 幸亏看到论坛里某位大佬的帖子明确的指出了是因为WPAN中的温度校准相关的影响到了ADC的采集。否则的话今天也是不可能完成这个任务。也非常感谢群友的热情帮助和管理员的协调解决!谢谢大家!
附件: