stm8L ADC多通通DMA采集和EEPROM一起使用解决死机和数据错位问题——寄存器
一、简介
现象:本实验在使用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一起使用解决死机和数据错位问题——寄存器相关推荐
- 硬盘错误计数 计算机内存不足,硬盘问题!Ultra DMA CRC错误计数 电脑死机
最近电脑经常出现卡机状态,此状态出现前先是硬盘嗡嗡响,就像汽车油门一样,一加一松,但声音不是很大,然后硬盘紧接着还有嘎吱的响声,这样重复几次,出现这种声音的时候,电脑出现死机状态,但停上几分钟后,一切 ...
- 在实现反射内存卡驱动程序DMA完成中断死机蓝屏纠结N天的一个低级BUG
本人负责软件从应用层一直到驱动层的全部研发任务,通过对GE产品的公开的资料反复研究,一共近70个函数接口,现在都搞明白了,由于GE产品光盘手册开源了Linux和VxWorks平台的全部软件代码,唯独不 ...
- 第六届“温度记录器”—数据类型(u8、u16、u32)+EEPROM存储16位、32位数据方法+EEPROM_Write()的延时
1.数据类型(u8.u16.u32) 在编写程序时,尤其要注意温度数值与255的关系,设置的边界值能不能有效地超过255! 2.EEPROM存储16位.32位数据方法 假设一个16位的数据需要存储-- ...
- STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)...
此文转载自:https://blog.csdn.net/qq_45620831/article/details/110819495 写在前面的婆婆妈妈的话 本人大三,参加过数次电赛,来CSDN好久, ...
- STM32F4时钟触发ADC双通道采样DMA传输进行FFT+测频率+采样频率可变+显示波形(详细解读)
写在前面的婆婆妈妈的话(代码链接在最下方) 本人大三,参加过数次电赛,来CSDN好久, 每次都是在绝望中从这里找到了希望,每次都仿佛一个即将被怪兽打翻的小船突然被危险流浪者救起来.是众多前辈的智慧,让 ...
- 【STM32】定时器TIM触发ADC采样,DMA搬运到内存(超详细讲解)
TIM+ADC+DMA原理 一般情况下,当我们需要进行采样的时候,需要用到ADC.例如:需要对某个信号进行定时采样(也就是隔一段时间,比如说2ms). 本文提供的解决方案是:使用ADC的定时器触发AD ...
- STM32CubeIDE STM32H743实现软件触发ADC实现多通道DMA方式、过采样方式采集数据
在STM32CubeIDE 1.4.0环境下测试通过. 1. ADC设置 设置CPU频率:400MHz ADC输入时钟自动设置为:150MHz 2. DMA设置 3. NVIC设置 4. 代码 //d ...
- STM32F030 使用CUBEMX配置ADC多通道采集 DMA传输
STM32CubeMX的配置 以下为测试代码 //usart重定向,注意使用前需要包含头文件<stdio.h> int fputc(int ch, FILE *f) {HAL_UART_T ...
- STM32F103三路ADC同步转换带有DMA功能
//保证ADC检测出来的值是稳定 #include "adc.h" _detection sampling; _detection display; /ADC,DMA模式/ /PC ...
最新文章
- 批量提取出apk文件中的classes.dex文件
- [wikioi 1307][poj 2054]欧少堆(乱搞)
- php 工厂模式 使用场景,PHP设计模式之工厂模式
- html5响应式网站建设网络类织梦模板
- jQuery:插入,复制,替换和删除节点
- 34岁程序员面试被拒:混得好的年轻人都有这3个特质
- LeetCode(883)——三维形体投影面积(JavaScript)
- Intellij IDEA基本配置
- 台式机安装黑苹果-新手教程
- android计时器代码百度网盘下载,计时器flash_求几个简单Flash计时器,可以自己设定时间的,百度云...
- 从零基础到高级软件测试工程师学习路线规划
- 4135: [FJOI2015]世界树
- jBPM4的PVM实现解析
- Kail教程(三)—私人订制(设置字体、netspeed流量监控 、文件目录)
- 『Less』学习笔记
- Openstack Train版搭建
- 助力全球抗疫,腾讯加入Linux基金会公共卫生计划
- 用php建设一个简单的网站,PHP_PHP新手上路(六),建设一个简单交互的网站(二) 5 - phpStudy...
- cocos creator尝试使用tween的几种新实现方案
- “交通·未来”第5期:面向交通数据的多情景空间选址优化及强化学习实践
热门文章
- [cnblogs镜像]Unity 移动键Q的三种用法 For Mac,Windows类同
- 计算机插上u盘就无法点亮,u盘启动电脑无反应,小编教你电脑插上U盘后无法启动解决方法...
- kali linux教程:配置 Kali 的 apt 命令在线安装包的源为阿里云
- 煤矿用计算机,煤矿安全生产中计算机的运用
- 一点资讯推出“长风计划” 内容分发平台进入拉人大战
- Linux命令学习之一
- 大一寒假训练九(map,set,vector)【更新完成】
- 逆时针旋转坐标系的转换
- Anaconda自用安装
- golang 枚举 iota