Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ADC
DMA
中断
STM32F4 ADC+DMA 怎么设置DMA转换完一次后中断?
发布于 2021-11-04 22:57:41 浏览:2724
订阅该版
改写了drv_adc.c 加入了DMA功能,采集ADC一切正常,现在想在一轮DMA转换完以后进中断,但是咋设置都进不去 ``` #ifdef BSP_USING_ADC1 #ifndef ADC1_CONFIG #ifdef BSP_USING_ADC_DMA #define ADC1_CONFIG \ { \ .Instance = ADC1, \ .Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4, \ .Init.Resolution = ADC_RESOLUTION_12B, \ .Init.DataAlign = ADC_DATAALIGN_RIGHT, \ .Init.ScanConvMode = DISABLE, \ .Init.EOCSelection = ADC_EOC_SEQ_CONV, \ .Init.ContinuousConvMode = ENABLE, \ .Init.NbrOfConversion = BSP_ADC_TOTAL_CHANNELS, \ .Init.DiscontinuousConvMode = DISABLE, \ .Init.NbrOfDiscConversion = 0, \ .Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE, \ .Init.DMAContinuousRequests = ENABLE, \ } #define ADC1_DMA_CONFIG \ { \ .Instance = DMA2_Stream0, \ .Init.Direction = DMA_PERIPH_TO_MEMORY, \ .Init.PeriphInc = DMA_PINC_DISABLE, \ .Init.MemInc = DMA_MINC_ENABLE, \ .Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD, \ .Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD, \ .Init.Mode = DMA_CIRCULAR, \ .Init.Priority = DMA_PRIORITY_HIGH, \ .Init.FIFOMode = DMA_FIFOMODE_DISABLE, \ .Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL, \ .Init.MemBurst = DMA_MBURST_SINGLE, \ .Init.PeriphBurst = DMA_PBURST_SINGLE, \ .Init.Channel = DMA_CHANNEL_0, \ } ``` ``` static rt_err_t stm32_adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) { ADC_HandleTypeDef *stm32_adc_handler; ADC_ChannelConfTypeDef adc_channel_config = {0}; DMA_HandleTypeDef dma_init_handler = {0}; HAL_DMA_CallbackIDTypeDef callback_id; RT_ASSERT(device != RT_NULL); stm32_adc_handler = device->parent.user_data; if (enabled) { #ifdef BSP_USING_ADC_DMA if (device->dma_buf != RT_NULL) { if (stm32_adc_handler->Instance == ADC1) { dma_config[0].XferCpltCallback = HAL_ADC_DMA_ConvCpltCallback; dma_init_handler = dma_config[0]; HAL_DMA_Init(&dma_init_handler); HAL_DMA_RegisterCallback(&dma_init_handler, callback_id, HAL_ADC_DMA_ConvCpltCallback); HAL_DMA_Start_IT(&dma_init_handler, ((rt_uint32_t)ADC1 + 0x4c), (rt_uint32_t)device->dma_buf, BSP_ADC_TOTAL_CHANNELS * BSP_DMA_BUF_COUNT); } adc_channel_config.Channel = stm32_adc_get_channel(channel); adc_channel_config.Rank = 1; adc_channel_config.SamplingTime = ADC_SAMPLETIME_112CYCLES; adc_channel_config.Offset = 0; HAL_ADC_ConfigChannel(stm32_adc_handler, &adc_channel_config); HAL_ADC_Start_DMA(stm32_adc_handler, (rt_uint32_t *)device->dma_buf, BSP_ADC_TOTAL_CHANNELS * BSP_DMA_BUF_COUNT); } #else __HAL_ADC_ENABLE(stm32_adc_handler); #endif } else { __HAL_ADC_DISABLE(stm32_adc_handler); } return RT_EOK; } ``` ``` void HAL_ADC_DMA_ConvCpltCallback(DMA_HandleTypeDef *hdma) { if (hdma->Instance == DMA2_Stream0) { //conv_complete_flg = 1; rt_kprintf("conv completa\n"); } } ``` ``` void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if (hadc->Instance == ADC1) { /* Peripheral clock enable */ __HAL_RCC_ADC1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); #ifdef BSP_USING_ADC_DMA __HAL_RCC_DMA2_CLK_ENABLE(); HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 3, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); #endif } } ``` ``` rt_adc_device_t adc1_dev; rt_uint16_t convert_value[128]; static int rt_adc1_init(void) { adc1_dev = (rt_adc_device_t)rt_device_find("adc1"); if (adc1_dev == RT_NULL) { rt_kprintf("adc sample run failed! can't find %s device!\n", "adc1"); } adc1_dev->dma_buf = convert_value; rt_adc_enable(adc1_dev, 5); return RT_EOK; } INIT_APP_EXPORT(rt_adc1_init); ```
查看更多
4
个回答
默认排序
按发布时间排序
Tourist
2021-11-04
这家伙很懒,什么也没写!
```c static ADC_HandleTypeDef adc_config[] = { #ifdef BSP_USING_ADC1 ADC1_CONFIG, #endif #ifdef BSP_USING_ADC2 ADC2_CONFIG, #endif #ifdef BSP_USING_ADC3 ADC3_CONFIG, #endif }; static DMA_HandleTypeDef dma_config[] = { #ifdef BSP_USING_ADC_DMA #ifdef BSP_USING_ADC1 ADC1_DMA_CONFIG, #endif #ifdef BSP_USING_ADC2 ADC2_DMA_CONFIG, #endif #ifdef BSP_USING_ADC3 ADC3_DMA_CONFIG, #endif #endif }; ```
出出啊
2021-11-05
恃人不如自恃,人之为己者不如己之自为也
检查一下配置寄存器,中断使能配置和中断标识是否置位了
小王001
2021-11-05
这家伙很懒,什么也没写!
你好,你这个是adc+dma多通道采集吗?
李肯陪你玩赚嵌入式
认证专家
2021-11-05
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
最近论坛里好几个问题文ADC+DMA相关的问题,保持关注此问题,希望后面可以挖掘到一些有用的信息,学习学习。
撰写答案
登录
注册新账号
关注者
1
被浏览
2.7k
关于作者
Tourist
这家伙很懒,什么也没写!
提问
4
回答
3
被采纳
0
关注TA
发私信
相关问题
1
请大神帮忙看下风格 还是哪里有问题 照着串口驱动写的ADC驱动
2
ADC config
3
rt_thread_delay()和ADC采样之间的冲突
4
请教在官方BSP中的STM32F40X程序中加入ADC,串口没输出。
5
给RT-Thread添加ADC驱动框架
6
求助:ADC采样被干扰
7
【内核和外设学习营】十里 ADC光敏电阻电压采集实验
8
<内核学习营>+坦然+探索者stm32f407板子的ADC测试光传感器实验
9
【内核学习营】+青春+ADC读取光敏传感器实验
10
《内核学习营》+水一方+项目中应用的ADC实现电压采集
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
HC32F4A0 SD卡挂载及热插拔的实现
2
vscode插件 - RT-Thread Studio项目助手 | 跨平台开发
3
Console串口使用说明
4
WATCHDOG设备驱动开发
5
【NXP-MCXA153】eFlexPWM驱动移植
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部