你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

多路ADC使用DMA模式有没有教程呀,芯片STM32L151

[复制链接]
Zona 提问时间:2024-5-10 18:02 / 未解决

最近用CubeMX(版本到6.11.1了)调试ADC ,有4路,希望能用DMA模式,OS是FreeRTOS

HAL_ADC_ConvCpltCallback函数里面写标记位,

大致代码情况是

task里调用HAL_ADC_Start_DMA

然后判断标记位来确定DMA完成后在处理dma给出来的数据

调了半天都没法完成DMA判断。。。

代码改的乱七八糟的。。。

所以问下有没有相关的教程或者例程可以研究下。。。

先谢谢~!

收藏 评论11 发布时间:2024-5-10 18:02

举报

11个回答
butterflyspring 回答时间:2024-5-11 09:17:19
库中有个关于ADC+DMA的例程可以研究一下

STM32Cube_FW_L1_V1.8.1\Projects\STM32L152RE-Nucleo\Examples\ADC\ADC_Sequencer\
xmshao 回答时间:2024-5-11 10:28:28
可以到www.st.com搜索下载STM32CubeL1,里面有很多基于各种开发板的例程。


不知你说DMA判断是什么?


如果ADC触发了DMA,DMA完成传输后可以触发传输完成中断,然后可以在相应


的回调函数里设置你需要的标志位或做信号量释放。
Zona 回答时间:2024-5-14 00:25:23

xmshao 发表于 2024-5-11 10:28
可以到www.st.com搜索下载STM32CubeL1,里面有很多基于各种开发板的例程。</p>
<p>

对,就是想这样,但是好像就是不成功。

Zona 回答时间:2024-5-14 00:30:45

xmshao 发表于 2024-5-11 10:28
可以到www.st.com搜索下载STM32CubeL1,里面有很多基于各种开发板的例程。</p>
<p>

为啥我登录后显示 This software is not available for download.?

还有请教下,STM32CubeL1和Stm32CubeMX 是啥关系,互相并列,还是一个包含另一个?

先谢谢各位前辈的时间

Zona 回答时间:2024-5-14 00:39:31

butterflyspring 发表于 2024-5-11 09:17
库中有个关于ADC+DMA的例程可以研究一下</p>
<p>STM32Cube_FW_L1_V1.8.1\Projects\STM32L152RE-Nucleo\Examples\A ...

你好,谢谢你的回复

请问 STM32Cube_FW_L1_V1.8.1 这个是在哪里有?我在st.com上搜索了一下没结果。

butterflyspring 回答时间:2024-5-14 10:03:41
Zona 发表于 2024-5-14 00:39
[md]

你好,谢谢你的回复


这里有最新版的。
建议你还是系统看看STM32CUBEMX 这个软件,包含了下面这个响应的库。 网上有很多资料。


STM32CubeL1 - STM32Cube MCU Package for STM32L1 series (HAL, Low-Layer APIs and CMSIS, USB, File system, RTOS, Touch Sensing, Graphic - and examples running on ST boards) - STMicroelectronics


Zona 回答时间:2024-5-14 12:48:32

butterflyspring 发表于 2024-5-14 10:03
这里有最新版的。
建议你还是系统看看STM32CUBEMX 这个软件,包含了下面这个响应的库。 网上有很多资料 ...

链接打开后就是这样的

微信截图_20240514124758.png

算了,我在研究研究mx吧

哦我知道了,这个库是mx里面下载的,我早就有了,。。。我看看sample都在哪个位置

Zona 回答时间:2024-5-14 14:55:15

xmshao 发表于 2024-5-11 10:28
可以到www.st.com搜索下载STM32CubeL1,里面有很多基于各种开发板的例程。</p>
<p>

我写了 HAL_ADC_ConvCpltCallback 函数

里面置了标志位

然后主循环里面进行了标志位的判断

Zona 回答时间:2024-5-14 15:01:25

xmshao 发表于 2024-5-11 10:28
可以到www.st.com搜索下载STM32CubeL1,里面有很多基于各种开发板的例程。</p>
<p>

你好,这里是我的main.c文件中我增加/修改的部分(其他都是CubeMX生成的):

unsigned char flagAdcDMADone;

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {

/ Prevent unused argument(s) compilation warning / UNUSED(hadc);

flagAdcDMADone++; }

int main(void) {

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. / HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock / SystemClock_Config();

/ USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals / MX_GPIO_Init(); MX_DMA_Init(); MX_ADC_Init(); / USER CODE BEGIN 2 / flagAdcDMADone=0;

/ USER CODE END 2 /

/ Infinite loop / / USER CODE BEGIN WHILE / while (1) { HAL_ADC_Start_DMA(&hadc,ADC_Resulte,ADCBUFLENG-1); HAL_ADC_Start(&hadc) ; //备注 无论本行注释与否,都无法获得flagAdcDMADone非零值 while(flagAdcDMADone==0) { HAL_Delay(1); }

delay(1000); / USER CODE END WHILE /

/ USER CODE BEGIN 3 / } / USER CODE END 3 / }

Zona 回答时间:2024-5-14 15:36:53

Zona 发表于 2024-5-14 15:01
你好,这里是我的main.c文件中我增加/修改的部分(其他都是CubeMX生成的):</p>
<p>unsigned char flagAdcDM ...

[md]研究来研究去

发现这样可以完成:

.....前部初始化代码略

while (1) { HAL_ADC_Start_DMA(&hadc,ADC_Resulte,5);

HAL_ADC_Start(&hadc) ;

while(flagAdcDMADone==0) //flagAdcDMADone在HAL_ADC_ConvCpltCallback中置1

{ HAL_Delay(1);

}

//进过中断了,看下结果数组 //然后delay个长时间

flagAdcDMADone=0;

HAL_ADC_Stop_DMA(&hadc);

HAL_Delay(1000);

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 / }

后续代码略

和库代码里面写得不一样啊:(以下部分节选自STM32L1XX_HAL_ADC.c,第185行起)

(++) ADC conversion with transfer by DMA:

(+++) Activate the ADC peripheral and start conversions using function HAL_ADC_Start_DMA()

(+++) Wait for ADC conversion completion by call of function HAL_ADC_ConvCpltCallback() or HAL_ADC_ConvHalfCpltCallback() (these functions must be implemented in user program)

(+++) Conversion results are automatically transferred by DMA into destination variable address.

(+++) Stop conversion and disable the ADC peripheral using function HAL_ADC_Stop_DMA()

xmshao 回答时间:2024-5-29 14:48:34

Zona 发表于 2024-5-14 00:39</p>
<p>你好,谢谢你的回复

[md]stm32cubemx是个针对stm32全系列的图形化配置工具,可以基于它做芯片的初始并创建基于不同IDE的工程。至于STM32CubeL1是针对STM32L1的外设驱动库 。 多操作几次慢慢就熟了。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版