写到前面的话,在使用RTT studio中的CUBEMX settings,打开cubemx后,配置好相关外设的时候,一定要关闭cubemx,关闭,关闭!!!这点非常重要,然后RTT studio就会提醒发生了改变,点击确定即可。
记录一下最近在RTT studio中使用ADC设备驱动时,遇见的一些问题。笔者这里使用的开发板是野火的STM32F407霸天虎。
1.创建一个标准版本新项目,选择基于芯片,选择stm32f407zg,RTT版本选择4.1.1,根据芯片的描述,这里的RTT版本必须选择4.1.0版本之后的。否则会出现各种问题,当然不建议使用最新的5.1.1的。这个也有问题。
2.RT_thread settings,组件里面打开相应的设备,这里的是ADC设备。
3.在board.h文件里面手动打开如下的宏。然后上面是官方给出是示例,如何使用这个ADC设备。
在board.h里面每一个设备官方都有说明,如何去操作这个设备。
/** if you want to use adc you can use the following instructions.
*
* STEP 1, open adc driver framework support in the RT-Thread Settings file
*
* STEP 2, define macro related to the adc
* such as #define BSP_USING_ADC1
*
* STEP 3, copy your adc init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file
* such as void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
*
* STEP 4, modify your stm32xxxx_hal_config.h file to support adc peripherals. define macro related to the peripherals
* such as #define HAL_ADC_MODULE_ENABLED
*
*/
#define BSP_USING_ADC1
/*#define BSP_USING_ADC2*/
/*#define BSP_USING_ADC3*/
4.打开cubemx,配置ADC,选择ADC1,IN1,时钟选择外部时钟,其他的选项就不重要了。生成代码后,就直接关闭cubemx。时钟选择HSE,频率随便配置,我这里配置成168,。我觉得这里有个坑就是,一旦你打开cubemx配置,那么意味着你的所以都要·重新配置,包括在创建项目的时候已经配置好的串口。这里需要你重新打开USART1,选择异步模式。(笔者刚开始的时候,选择USART1作为打印串口)
当关闭了cubemx后,这里记得一定要关闭cubemx,RTT studio中就会出现如下图所示的,提示。点击确定。
提示,一旦使用cubemx重新配置后,想要继续使用串口1打印调试信息,那么这个时候就必须在cubemx中重新配置USART1,配置为异步模式。其他的不用配置了,NVIC也不用了。
5.然后把cubemx->adc.c文件里面的HAL_ADC_MSPINIT()复制粘贴在board.c文件里面。
好了,现在可以在mian里面使用ADC设备了。并且在finsh里面使用list_device,.也能发现adc1设备是打开的。
#include <rtthread.h>
#include <rtdevice.h>
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
int main(void)
{
rt_device_t adc_demo=RT_NULL;
rt_err_t ret=RT_EOK;
rt_uint32_t value,vol;
adc_demo = (rt_adc_device_t)rt_device_find("adc1");
if(adc_demo==RT_NULL)
rt_kprintf("adc1 acn not find\n");
ret=rt_adc_enable(adc_demo,1);
value = rt_adc_read(adc_demo, 1);
rt_kprintf("the value is:%d\n",value);
vol=value * 330/(1<<12);
rt_kprintf("vol is :%d\n",vol);
ret= rt_adc_disable(adc_demo, 1);
return 0;
// int count = 1;
//
// while (count++)
// {
// LOG_D("Hello RT-Thread!");
// rt_thread_mdelay(10000);
// }
//
// return RT_EOK;
}
6.在终端里面也能看见打印的信息了,使用官方给出的adc probe adc1,也能找到设备。
最后检查stm32f4xx_hal_conf.h里面开启了#define HAL_ADC_MODULE_ENABLED。
提示:使用了cubemx后,之前的stm32f4xx_hal_conf.h就变成了stm32f4xx_hal_conf_bank.h,在drivers里面。stm32f4xx_hal_conf.h在cubemx文件里面。
附录:
如上图所示,当使用cubemx生成代码后,在src中是看不见adc.c的,如果想要打开adc,c有两种办法,一种是打开adc,h,打开MX_ADC_INIT的声明,就自然的打开adc.c了,另外一种就是在sconscript中重写一下代码。
总结:以上的虽然很简单,但是新手一不注意就会踩坑。需要注意细节的部分。官方文档里面没有这么详细的描述,但是在我们刚开始做的时候,官方的文档的确可以作为一份参考。