一、简介

现象:本实验在使用ADC+DMA+EEPOM实验室,在eeprom写入数据的时候单片机死机,我在写eerpom时关闭adc和关闭dma,写完之后开启adc和dma单片机就不死机了,然后就出现adc数据错位的问题,经过一天的修改实验,现已没有死机和数据错位现象。本实验采用iar平台所做,参考手册为RM0031手册,采用寄存器方式。

二、stm8L的adc和dma寄存器:

1、时钟寄存器-adc和dma

相关代码:

CLK_PCKENR2_PCKEN20 = 1;      /* 开启adc时钟 */
CLK_PCKENR2_PCKEN24 = 1;     /* 开启DMA时钟 */

2、adc其他相关寄存器

相关代码:

ADC1_CR1_ADON = 1;            /* 使能adc ADCON wake up from power down mode */
  ADC1_CR1_CONT = 1;            /* 0:单次转换 1:连续转换 */

ADC1_CR1_EOCIE = 0;           /* 关闭adc中断 */

相关代码:

ADC1_CR2_PRESC = 0;           /* select a sample time of 10 us f(ADC_CLK)=CK */

ADC1_CR2_SMTP1 = 0x06;        /* 外部0-23通道采样时间24 */

相关代码:

ADC1_CR3_SMTP2 = 0x06;        /* 内部参考电压通道采样时间为24  */

相关代码:(我这里使用通道7、8 、9)

/* 选择ADC通道 */
  ADC1_SQR4_CHSEL_S7 = 1;       //打开adc通道7
  ADC1_TRIGR4_TRIG7 = 1;        //关闭通道7的施密特触发器
  ADC1_SQR3_CHSEL_S8 = 1;       //选择通道8
  ADC1_TRIGR3_TRIG8 = 1;        //关闭通道8的施密特触发器
  ADC1_SQR3_CHSEL_S9 = 1;       //选择通道9
  ADC1_TRIGR3_TRIG9 = 1;        //关闭通道9的施密特触发器

相关代码:

ADC1_SQR1_DMAOFF = 0;         /* 使能DMA */

3、dma相关寄存器

相关代码:
  SYSCFG_RMPCR1_ADC1DMA_REMAP = 1;       /* 设置DMA通道 */

相关代码:
  DMA1_C1CR_CIRC = 1;     /* 设置模式 */
  DMA1_C1CR_MINCDEC = 1;  /* 设置增还是减去地址 */
  DMA1_C1CR_TCIE = 1;  /* 使能传送完一组数据中断 */
  DMA1_C1CR_EN = 1;   /* 使能DMA1通道 */

相关代码:
  DMA1_C1SPR_PL0 = 0;    /* 设置通道优先级 */
  DMA1_C1SPR_PL1 = 1;
 
  DMA1_C1SPR_TSIZE = 1;     /* 设置传送位数 */

相关代码:
  DMA1_C1NDTR = 12;    /* 设置传送字节 */

相关代码:
  DMA1_GCSR_GEN = 1;   /* DMA全局使能 */

三、部分实验代码:

1、adc配置

void ADC_Init(void)
{
  CLK_PCKENR2_PCKEN20 = 1;      /* 开启adc时钟 */
  
  ADC1_CR1_ADON = 1;            /* 使能adc ADCON wake up from power down mode */
  
  ADC1_CR1_CONT = 1;            /* 0:单次转换 1:连续转换 */

ADC1_CR2_PRESC = 0;           /* select a sample time of 10 us f(ADC_CLK)=CK */
  //   0: f(ADC_CLK) = CK
  
  //   1: f(ADC_CLK) = CK/2  //系统时钟此时为默认的16M/8=2M,这里分频后,fadc=2M/2=1M
  
  
  //ADC1_SQR1_DMAOFF = 1;         /* 关闭DMA */
  ADC1_SQR1_DMAOFF = 0;         /* 使能DMA */
  
  
  ADC1_CR3_SMTP2 = 0x06;        /* 内部参考电压通道采样时间为24  */
  //000: 4 ADC clock cycles
    
  //001: 9 ADC clock cycles
    
  //010: 16 ADC clock cycles
    
  //011: 24 ADC clock cycles
    
  //100: 48 ADC clock cycles
    
  //101: 96 ADC clock cycles
    
  //110: 192 ADC clock cycles
    
  //111: 384 ADC clock cycles
  
  ADC1_CR2_SMTP1 = 0x06;        /* 外部0-23通道采样时间24 */
  
  /* 选择ADC通道 */
  ADC1_SQR4_CHSEL_S7 = 1;       //打开adc通道7
  ADC1_TRIGR4_TRIG7 = 1;        //关闭通道7的施密特触发器
  
  ADC1_SQR3_CHSEL_S8 = 1;       //选择通道8
  ADC1_TRIGR3_TRIG8 = 1;        //关闭通道8的施密特触发器
  
  ADC1_SQR3_CHSEL_S9 = 1;       //选择通道9
  ADC1_TRIGR3_TRIG9 = 1;        //关闭通道9的施密特触发器
   
  //ADC1_CR1_EOCIE = 1;           /* 开启adc中断 */
}

2、dma初始化

void ADC1_DMA_Init(void)
{
  /* 开启DMA时钟 */
  CLK_PCKENR2_PCKEN24 = 1;
  
  /* 设置DMA通道 */
  SYSCFG_RMPCR1_ADC1DMA_REMAP = 1;
  
  /* 设置传送字节 */
  DMA1_C1NDTR = 12;
  
  /* 设置通道优先级 */
  DMA1_C1SPR_PL0 = 0;
  DMA1_C1SPR_PL1 = 1;
  
  /* 设置传送方向 */
  DMA1_C1CR_DIR = 0;
  
  /* 设置模式 */
  DMA1_C1CR_CIRC = 1;
  
  /* 设置增还是减去地址 */
  DMA1_C1CR_MINCDEC = 1;
  
  /* 设置传送位数 */
  DMA1_C1SPR_TSIZE = 1;
  
  /* 使能传送完一组数据中断 */
  //DMA1_C1CR_HTIE = 1;
  DMA1_C1CR_TCIE = 1;
  
  /* 设置DMA通道1外设地址 */
  DMA1_C1PARH=(uint8_t)((uint16_t)ADC_DRH_ADRESS >> (uint8_t)8);
  DMA1_C1PARL=(uint8_t)ADC_DRH_ADRESS;
  
  /* 设置DMA通道1内存地址 */
  DMA1_C1M0ARH=(uint8_t)((uint16_t)&adc_dmaval >> (uint8_t)8);
  DMA1_C1M0ARL=(uint8_t)&adc_dmaval;
  
  
  /* 使能DMA1通道 */
  DMA1_C1CR_EN = 1;
  
  /* DMA全局使能 */
  DMA1_GCSR_GEN = 1;
}

3、中断函数

#pragma vector=DMA1_CH1_TC_vector
__interrupt void DMA1_CH1_TC_ISR(void)

{

if(DMA1_C1SPR_TCIF == 1)
  {
    DMA1_C1SPR_TCIF = 0;

/* 直接从变量中读取数据 */

}

}

4、暂时关闭adc

本实验采用关闭adc时钟的方式关闭adc,在写入eeprom数据前,关闭adc,在写入eeprom数据后开启adc时钟。

void ADC1_Close(void)
{
  CLK_PCKENR2_PCKEN20 = 0;      /* 开启adc时钟 */
}

5、开启adc

在写完eeprom数据后,开启adc时钟。

void ADC1_ReStart(void)
{  
  CLK_PCKENR2_PCKEN20 = 1;      /* 开启adc时钟 */
}

stm8L ADC多通通DMA采集和EEPROM一起使用解决死机和数据错位问题——寄存器相关推荐

  1. 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机

    最近电脑经常出现卡机状态,此状态出现前先是硬盘嗡嗡响,就像汽车油门一样,一加一松,但声音不是很大,然后硬盘紧接着还有嘎吱的响声,这样重复几次,出现这种声音的时候,电脑出现死机状态,但停上几分钟后,一切 ...

  2. 在实现反射内存卡驱动程序DMA完成中断死机蓝屏纠结N天的一个低级BUG

    本人负责软件从应用层一直到驱动层的全部研发任务,通过对GE产品的公开的资料反复研究,一共近70个函数接口,现在都搞明白了,由于GE产品光盘手册开源了Linux和VxWorks平台的全部软件代码,唯独不 ...

  3. 第六届“温度记录器”—数据类型(u8、u16、u32)+EEPROM存储16位、32位数据方法+EEPROM_Write()的延时

    1.数据类型(u8.u16.u32) 在编写程序时,尤其要注意温度数值与255的关系,设置的边界值能不能有效地超过255! 2.EEPROM存储16位.32位数据方法 假设一个16位的数据需要存储-- ...

  4. STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...

    此文转载自:https://blog.csdn.net/qq_45620831/article/details/110819495 写在前面的婆婆妈妈的话 本人大三,参加过数次电赛,来CSDN好久, ...

  5. STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)

    写在前面的婆婆妈妈的话(代码链接在最下方) 本人大三,参加过数次电赛,来CSDN好久, 每次都是在绝望中从这里找到了希望,每次都仿佛一个即将被怪兽打翻的小船突然被危险流浪者救起来.是众多前辈的智慧,让 ...

  6. 【STM32】定时器TIM触发ADC采样,DMA搬运到内存(超详细讲解)

    TIM+ADC+DMA原理 一般情况下,当我们需要进行采样的时候,需要用到ADC.例如:需要对某个信号进行定时采样(也就是隔一段时间,比如说2ms). 本文提供的解决方案是:使用ADC的定时器触发AD ...

  7. STM32CubeIDE STM32H743实现软件触发ADC实现多通道DMA方式、过采样方式采集数据

    在STM32CubeIDE 1.4.0环境下测试通过. 1. ADC设置 设置CPU频率:400MHz ADC输入时钟自动设置为:150MHz 2. DMA设置 3. NVIC设置 4. 代码 //d ...

  8. STM32F030 使用CUBEMX配置ADC多通道采集 DMA传输

    STM32CubeMX的配置 以下为测试代码 //usart重定向,注意使用前需要包含头文件<stdio.h> int fputc(int ch, FILE *f) {HAL_UART_T ...

  9. STM32F103三路ADC同步转换带有DMA功能

    //保证ADC检测出来的值是稳定 #include "adc.h" _detection sampling; _detection display; /ADC,DMA模式/ /PC ...

最新文章

  1. 批量提取出apk文件中的classes.dex文件
  2. [wikioi 1307][poj 2054]欧少堆(乱搞)
  3. php 工厂模式 使用场景,PHP设计模式之工厂模式
  4. html5响应式网站建设网络类织梦模板
  5. jQuery:插入,复制,替换和删除节点
  6. 34岁程序员面试被拒:混得好的年轻人都有这3个特质
  7. LeetCode(883)——三维形体投影面积(JavaScript)
  8. Intellij IDEA基本配置
  9. 台式机安装黑苹果-新手教程
  10. android计时器代码百度网盘下载,计时器flash_求几个简单Flash计时器,可以自己设定时间的,百度云...
  11. 从零基础到高级软件测试工程师学习路线规划
  12. 4135: [FJOI2015]世界树
  13. jBPM4的PVM实现解析
  14. Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
  15. 『Less』学习笔记
  16. Openstack Train版搭建
  17. 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
  18. 用php建设一个简单的网站,PHP_PHP新手上路(六),建设一个简单交互的网站(二) 5 - phpStudy...
  19. cocos creator尝试使用tween的几种新实现方案
  20. “交通·未来”第5期:面向交通数据的多情景空间选址优化及强化学习实践

热门文章

  1. [cnblogs镜像]Unity 移动键Q的三种用法 For Mac,Windows类同
  2. 计算机插上u盘就无法点亮,u盘启动电脑无反应,小编教你电脑插上U盘后无法启动解决方法...
  3. kali linux教程:配置 Kali 的 apt 命令在线安装包的源为阿里云
  4. 煤矿用计算机,煤矿安全生产中计算机的运用
  5. 一点资讯推出“长风计划” 内容分发平台进入拉人大战
  6. Linux命令学习之一
  7. 大一寒假训练九(map,set,vector)【更新完成】
  8. 逆时针旋转坐标系的转换
  9. Anaconda自用安装
  10. golang 枚举 iota