芯片型号是STM32F401RET 我在cubeMx生成的代码,设置如下图,file:///C:\Users\windows8\AppData\Roaming\Tencent\Users\344055076\QQ\WinTemp\RichOle\GSHE0%AQER0BJHLRI_T}LFI.png我是想在串口中看ADC的值但是我开启这个语句HAL_ADC_Start_DMA(&hadc1,temp,2);,串口就打印不出来了,在线调试,发现应该卡在这个函数里面了。 我的读取程序如下: HAL_ADC_Start_DMA(&hadc1,temp,2); tempHigh = temp[0]>>8; tempLow = temp[0]; HAL_UART_Transmit(&huart1,&tempHigh,1,10); HAL_UART_Transmit(&huart1,&tempLow,1,10); tempHigh = temp[1]>>8; tempLow = temp[1]; HAL_UART_Transmit(&huart1,&tempHigh,1,10); HAL_UART_Transmit(&huart1,&tempLow,1,10); 求助啊!!!! file:///C:\Users\windows8\AppData\Roaming\Tencent\Users\344055076\QQ\WinTemp\RichOle\GSHE0%AQER0BJHLRI_T}LFI.png |
刚好有这个板子。。。做了个工程,开了4个ADC 通道, PA0 PA1 内部温度和内部参考电压通道。。
测试结果
整个工程。。
adc.c 代码:
main.c 代码:
dma.c 代码:
stm32l4xx_it.c 代码:
大致的代码就是上面,采用ADC1,PA0通道5,PC2通道3;PA0口直接接3.3V,PC2口直接接地。MCU是stm32l476RC,不能直接下载你的例程到板子上。
问题:
使用上面的代码,转出来的电压值都是0.4~0.45V,理论上应该分别采集到的是3.3V和0V的,不知道为什么?我是新手,是不是我哪里配置不对啊,求大神帮忙~
我昨天晚上刚刚用过,只是没有读取标志的话,你读到的是上一次转换的值。
具体为什么会卡住,你可以在temp的定义前面加一个volatile试一下。
我是加了这个key word的,是不是这个原因你可以试一下。
当然temp必须是一个全局变量,这一点你也要确认一下。
一般ADC读进来的都是双字节的半字,我看你的cubemx设置中设的是全字,也可能是卡住的原因。
通常ADC读入一个half word,也就是uint16_t,你设为Word,那么会去读一个uint32_t是4个字节。
STM32F4我没用过,不太清楚,难道F4系列的ADC精度已经超过16位了吗?
我不知道cube的ADC是怎么样的,但是我来分析的话,有以下几点:
1、你是怎么触发ADC采集的,定时器触发ADC采集,还是软件触发ADC采集,如果只开启ADC的DMA功能,而没有开始转换的话,值是不会保存到temp中的.
2、cube库中有个函数叫CALLBACK函数,你必须要等到dma接收完成后,才开始串口打印吧,可以在串口接收callback函数中,定义一个标志位,当置位,才开始串口传输。
非常感谢你,试用你的工程,的确可以,参考你的程序,发现是回调函数标志问题,只不过这个为什么这么添加就不太有头绪,刚学用STM32。
正如你所说的,的确要在HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)增加标志,当标志位满足,默认为转换完毕,串口才开始发送转换数据。否则的话会卡在HAL_ADC_Start_DMA这个函数中。
如果不是楼上DEMO有比较,自己真不知道为什么还要再那里加个标志位。。。
你应该多看看,HAL库里例程。。。
cubeMx的确有好多地方需要注意...
你好,截图中的调试工具看着很不错,能分享一下吗?谢谢。
多谢啦
mark, 好好参考学习~