0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于APM32F411 DMA_ADC Handler模式分析及解决

Geehy极海半导体 ? 来源:21ic论坛极海半导体专区 ? 2025-06-24 14:30 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

来源:转载自21ic论坛极海半导体专区

最近在编写DMA_ADC例程的过程中出现了一个中断配置的问题,在ADC采集过程中,结合手册进行ADC连续转换模式配置采集,手册上给出需要进行中断配置的信息,但是真实情况不需要进行中断配置也可以进行ADC连续转换采集,因此,我没过滤掉ADC采集中开启中断配置的信息,开启了ADC中断采集,因此这次以APM32F411官方例程中的DMA_ADC例程,复刻了此次出现的问题。

2、基于APM32F411 DMA_ADC例程问题复刻

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] ADC Init

*

* @param None

*

* @retval None

*/

void ADC_Init(void)

{

GPIO_Config_T gpioConfig;

ADC_Config_T adcConfig;

/* RCM Enable*/

RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);

/* GPIO Configuration */

GPIO_ConfigStructInit(&gpioConfig);

gpioConfig.pin = GPIO_PIN_0;

gpioConfig.mode = GPIO_MODE_AN;

gpioConfig.pupd = GPIO_PUPD_NOPULL;

GPIO_Config(GPIOA, &gpioConfig);

RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);

/* ADC Configuration */

ADC_Reset();

ADC_ConfigStructInit(&adcConfig);

/* Set resolution*/

adcConfig.resolution = ADC_RESOLUTION_12BIT;

/* Set dataAlign*/

adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;

/* Set scanDir*/

adcConfig.scanConvMode = DISABLE;

/* Set convMode continous*/

adcConfig.continuousConvMode = ENABLE;

/* Set extTrigEdge*/

adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;

/* Set nbrOfConversion*/

ADC_Config(ADC1, &adcConfig);

ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_112CYCLES);

NVIC_EnableIRQRequest(ADC_IRQn,0x00,0x00);

ADC_EnableInterrupt(ADC1,ADC_INT_EOC);

ADC_EnableDMA(ADC1);

ADC_EnableDMARequest(ADC1);

/* Enable ADC*/

ADC_Enable(ADC1);

ADC_SoftwareStartConv(ADC1);

}

根据上述复刻代码,在ADC_Init()代码配置中,使用NVIC申请中断号,使能中断,但是在中断服务函数中,我并没有进行内容处理。

3、问题定位及疑惑

当出现问题时,因为首先Debug进行单步调试,程序卡死时,出现以下的信息定位:

cf5494d0-4cec-11f0-b715-92fbcf53809c.jpg

当程序出现问题时,我首先定位的信息便是Internal:Mode->Handler,Stack->MSP->0x20000400,同时Debug Faults中,SCB->DFSR寄存器的值为0x00000001。首先,模式由Thread变成Handler,这个变化可以说明当前程序由普通用户运行的代码变成了异常程序处理的代码。其次,看到SCB寄存器的内容,结合内核手册中的一些信息,如下:

cf5f95d8-4cec-11f0-b715-92fbcf53809c.jpg

DFSR->HALTED寄存器位置为1,从手册内容表示,CPU被调试器喊停,但被调停是因为什么原因呢?这个需要进一步分析,如下:

cf6e5e88-4cec-11f0-b715-92fbcf53809c.jpg

DFSR寄存器中HALTED寄存器被置位是因为在NVIC中进行了HALT的请求,然后我回顾了以下程序,在ADC初始化中进行了NVIC的请求,因为程序在ADC进行采集时,会一直跳进中断程序。记录到这里,我已经对问题进行了确认。因为在ADC配置中开启了中断,当中断开启后,请求了HALT,并且CPU响应了这次请求对ADC的中断服务函数进行处理,但我并没有对ADC的中断服务函数进行处理与ADC采集为连续配置模式,因此程序一直处在Handler模式与线程模式下的切换。并且结合.s启动文件可知,如下:

Default_Handler PROC

EXPORT ADC_IRQHandler [WEAK]

当我通过申请使能中断后,MCU会通过传入的中断号,并计算出偏移量,加载到中断向量表中(这个后面计划出一个启动文件分析,到时在细讲)。当MCU相应中断使能时,程序切换至Handler模式时,PC便将这个地址当做入口,跳入中断服务函数并执行。如下图形式(仅举例):

cf7cdd1e-4cec-11f0-b715-92fbcf53809c.jpg

同时,因为我初始的程序并没有对ADC_Handler模式进行定义处理,同时导致MCU在响应中断后进不了中断服务函数,从而一致卡死在汇编语言B.处,类似C语言中的while(1);,从而产生死循环。

注:文章作者在原帖中提供了例程文件,有需要请至原文21ic论坛下载

原文地址:https://bbs.21ic.com/icview-3329454-1-1.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    99

    文章

    6729

    浏览量

    549610
  • 中断
    +关注

    关注

    5

    文章

    906

    浏览量

    42905
  • 函数
    +关注

    关注

    3

    文章

    4384

    浏览量

    65121
  • dma
    dma
    +关注

    关注

    3

    文章

    576

    浏览量

    103463

原文标题:APM32芯得 EP.57 | 基于APM32F411 DMA_ADC Handler模式分析及解决

文章出处:【微信号:geehysemi,微信公众号:Geehy极海半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    极海APM32F411微控制器硬件FPU使用指南

    APM32F411是一款基于32位Arm Cortex-M4F内核的微控制器。硬件FPU是Arm Cortex-M4F的一大优势。合理应用硬件FPU可以大大缩短运算时间。
    的头像 发表于 06-28 11:23 ?900次阅读
    极海<b class='flag-5'>APM32F411</b>微控制器硬件FPU使用指南

    APM32F411打造可自动化的命令行工作流

    拿到APM32F411的TINY板卡后,在打开官方提供的SDK发现,他们提供的MDK、IAR、Eclipse的工程示例。非常不错,但是我想着有一些场景下在没有安装IDE的情况下怎么编译程序呢?
    的头像 发表于 07-11 10:00 ?1169次阅读
    为<b class='flag-5'>APM32F411</b>打造可自动化的命令行工作流

    正式发布 | 极海APM32F411系列高适配型MCU,均衡功耗、性能与成本

    APM32F411系列高性能高适配型MCU,该系列新品基于Arm? Cortex? -M4F内核,采用55nm工艺制程,拥有大容量Flash、SRAM以及丰富的片内外设,具有优秀的方案适用性和可靠性。 ? 该产品可广泛应用于仪器仪表、工控设备、智能家电、基站电源、网关设备
    发表于 08-08 17:51 ?1077次阅读
    正式发布 | 极海<b class='flag-5'>APM32F411</b>系列高适配型MCU,均衡功耗、性能与成本

    充能新时代 | 基于APM32F411的EV交流充电桩应用方案

    将推动全球充电桩市场的快速发展,预计该市场年复合增长率可达36.0%,于2030年增长至1410.8亿美元规模。 ? ? 面向EV交流充电桩市场需求,极海采用基于Cortex-M4F内核的高适配型APM32F411系列MCU实现应用。该芯片具有高速运算能力,可满足系统精确
    发表于 05-20 17:24 ?1444次阅读
    充能新时代 | 基于<b class='flag-5'>APM32F411</b>的EV交流充电桩应用方案

    TinyMaix框架的内存需求超过了APM32F411的可用内存,导致运行失败,怎么能成功优化?

    TinyMaix框架的内存需求超过了APM32F411的可用内存,导致运行失败。怎么能成功优化?
    发表于 09-27 09:44

    【极海APM32F030R8 MINI开发板试用体验】+官方dma接收usart程序软件

    接【极海APM32F030R8 MINI开发板免费试用】+官方adc程序由于极海APM32F030R8 MINI开发板的外设资源极为丰富,准备使用计算机com口通讯来交流控制及数据信息。安装
    发表于 12-24 12:34

    STM32F030 ADC DMA乱序问题

    也是放在ADC_DR中的,它也会触发DMA请求。可以参照F0的ADC-DMA例程,先做ADC校准、然后再设置
    发表于 06-09 15:18 ?1693次阅读

    APM32F103XC_TMR_关闭DMA进入睡眠模式出现故障

    APM32F103XC_TMR_关闭DMA进入睡眠模式出现故障
    发表于 11-09 21:03 ?0次下载
    <b class='flag-5'>APM32F</b>103XC_TMR_关闭<b class='flag-5'>DMA</b>进入睡眠<b class='flag-5'>模式</b>出现故障

    AN1083_APM32F4xx_ADC应用笔记

    AN1083_APM32F4xx_ADC应用笔记
    发表于 11-09 21:03 ?3次下载
    AN1083_<b class='flag-5'>APM32F4xx_ADC</b>应用笔记

    APM32F030C8T6_ADC_ADC连续转换后DMA只传输一次

    APM32F030C8T6_ADC_ADC连续转换后DMA只传输一次
    发表于 11-09 21:03 ?6次下载
    <b class='flag-5'>APM32F030C8T6_ADC_ADC</b>连续转换后<b class='flag-5'>DMA</b>只传输一次

    APM32F072CBT6_ADC_DMA采样不连续

    APM32F072CBT6_ADC_DMA采样不连续
    发表于 11-09 21:03 ?0次下载
    <b class='flag-5'>APM32F072CBT6_ADC_DMA</b>采样不连续

    APM32F072RBT6_ADC_经过调压后的ADC采样不精确

    APM32F072RBT6_ADC_经过调压后的ADC采样不精确
    发表于 11-09 21:04 ?6次下载
    <b class='flag-5'>APM32F072RBT6_ADC</b>_经过调压后的<b class='flag-5'>ADC</b>采样不精确

    APM32F030C8T6_ADC_ADC Vref参考电压数值读取出错

    APM32F030C8T6_ADC_ADC Vref参考电压数值读取出错
    发表于 11-09 21:04 ?2次下载
    <b class='flag-5'>APM32F030C8T6_ADC_ADC</b> Vref参考电压数值读取出错

    极海半导体推出APM32F411系列高性能高适配型MCU

    面向能耗与成本敏感的中高端工业应用市场,不仅对芯片性能与功耗有更高要求,复杂的功能需求也考量着芯片的适配性与稳定性。极海为平衡客户对产品低功耗、高性能与高性价比等综合需求,正式推出APM32F411
    发表于 08-06 10:32 ?850次阅读
    极海半导体推出<b class='flag-5'>APM32F411</b>系列高性能高适配型MCU

    APM32F411板的python+pyocd命令行操作

    前段时间学习了一下如何使用pyocd配合APM32F411VCTINY板在命令行下给它进行各种骚操作,在使用一段时间后就想着:pyocd是基于python的,那是不是也可以使用python脚本+pyocd使用起来呢?
    的头像 发表于 10-18 16:21 ?1076次阅读
    <b class='flag-5'>APM32F411</b>板的python+pyocd命令行操作