STM32中的一些小坑-ADC通道设置-写FLASH

发布者:Qianfeng最新更新时间:2019-10-08 来源: eefocus关键字:STM32  ADC  通道设置  写FLASH 手机看文章 扫描二维码
随时随地手机看文章

最近做项目用到STM32F051的片子,遇到了两个小坑。


我的一个项目,需要ADC采集。两路ADC输入通道。PA0-ADCIn0; PA1-ADCIn1.


一开始想使用最简单的方式,单次转换。第一次采In0, 第2次采集In1.


STM32F0 的ADC库里面提供了ADC转换的函数:如下:


ADC_StartOfConversion(ADC1);


while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);


AdcProValRig[AdcLoopId] =ADC_GetConversionValue(ADC1);


ADC_StopOfConversion(ADC1);



解释:ADC_StartOfConversion 开始连续转换,也可以配置为,不是连续转换。在ADC初始化结构体中配置。


然后等待ADC转换结束,然后读取ADC的转换结果(同时会自动清空EOC标识)。


然后停止转换。  


接下来采集In1 , 理所当然,在采集前配置ADC的通道指向In1.


ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_71_5Cycles);


但是设置完了之后,发现,根本没有鸟用啊。 采集的数据还是 之前IN0的通道。WHAT???


最后去看了一下原函数:居然是或运算!!!! 我的理解是,STM32 的ADC库设计,让你尽量使用规则或者注入模式去使用ADC。如下:


void ADC_ChannelConfig(ADC_TypeDef* ADCx, uint32_t ADC_Channel, uint32_t ADC_SampleTime)

{

  uint32_t tmpreg = 0;


  /* Check the parameters */

  assert_param(IS_ADC_ALL_PERIPH(ADCx));

  assert_param(IS_ADC_CHANNEL(ADC_Channel));

  assert_param(IS_ADC_SAMPLE_TIME(ADC_SampleTime));


  /* Configure the ADC Channel */

  ADCx->CHSELR |= (uint32_t)ADC_Channel;


  /* Clear the Sampling time Selection bits */

  tmpreg &= ~ADC_SMPR1_SMPR;


  /* Set the ADC Sampling Time register */

  tmpreg |= (uint32_t)ADC_SampleTime;


  /* Configure the ADC Sample time register */

  ADCx->SMPR = tmpreg ;

}

那就直接写通道到寄存器吧:


ADC1->CHSELR = ADC_CHSELR_CHSEL1;


第2个小坑: 就是在向FLASH 写入参数的时候,单片机会死机,后来找到问题了,在写FLASH的时候,要关闭中断。可能是我写入到FLASH的内容多,时间长,写进入后,还要读出来,校验。而我的串口通讯,波特率时38400很快,读写FLASH期间,频繁的进入中断,导致死机。

关键字:STM32  ADC  通道设置  写FLASH 引用地址:STM32中的一些小坑-ADC通道设置-写FLASH

上一篇:MDK V5.12 + ST-Link V2 + Win10 STM32开发环境搭建1
下一篇:stm32 实现串口中断接收浮点型、整型数据

推荐阅读最新更新时间:2024-11-13 06:51

Stm32的TFT LCD显示器控制学习笔记
学习stm32,TFT LCD显示屏控制是很重要的一章,本人在初步学习STM32遇到了很多困难,所以把学习中积累的部分感觉重要的知识点罗列出来。目前常用的TFT液晶内部驱动芯片是ILI9320,ILI9325系列,内部原理基本一致,我用的是ILI9320。用stm32驱动液晶,实际上就是驱动ILI9320芯片。点亮TFT LCD的具体步骤有: (1)stm32与ILI9320芯片管脚的初始化。 void LCD_Init(void); /*初始化LCD,也就是初始化LCD控制器ILI9320芯片与stm32控制器的管脚连接配置*/其中包括CS:TFTLCD片选信号,WR:向TFTLCD写入信号,RD:从TFTLCD读取信号,DB(
[单片机]
stm32中AMBA、AHB、APB总系介绍
AMBA(advanced microcontroller bus architecture )片上总线是由ARM公司推出的。 AMBA规范主要包括了:AHB(Advanced High-performance Bus)系统总线和 APB(Advanced Peripheral Bus) 外围总线。其中,AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。 基于AMBA的片上系统 一个典型的基于AMBA总线的系统框图如图3所示。 大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者
[单片机]
<font color='red'>stm32</font>中AMBA、AHB、APB总系介绍
STM32的八种I/O口的用法
STM32的八种I/O口的用法: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD 开漏输出 (6)GPIO_Mode_Out_PP 推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 简单理解: 1.浮空,顾名思义就是浮在空中,上面用绳子一拉就上去了,下面用绳子一拉就沉下去了。浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的
[单片机]
STM32入门之旅(第四天)-------位带操作、中断
一、位带操作 1.意义 回想以前写51代码 P0 = 0x10; //将P0端口设置为0x10 P1_0=1; //将P1端口1号引脚设置为高电平 a = P2_2; //获取P2端口2号引脚的电平 根据上述的方法,我们可以发现快速定位修改某个引脚的电平还有获取引脚的状态 GPIO_SetBits、GPIO_ResetBits操作IO口的性能没有达到极致,因为这些函数都需要进行现场保护和现场恢复的动作,比较耗时间,没有进行一步到位,使用位带操作则没有上述的烦恼,简单快速! //位带操作,实现51类似的GPIO控制功能 //IO口操作宏定义 #define BITBAND(addr, bitnum) ((addr
[单片机]
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又如何
[单片机]
STM32库函数详解----(通用输入/输出GPIO)
初始化和配置相关函数 1.void GPIO_DeInit (GPIO_TypeDef* GPIOx) 函数解释:gpio的反初始化函数,该函数的作用是把GPIO相关的寄存器配置成上电复位后的默认状态,在第一次初始化前或者不在使用某一接口后,可以调用该函数。 参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义。 2.void GPIO_Init (GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) 函数解释:GPIO的初始化函数,该函数的作用是对io进行初始化。 参数:(1)GPIOx,GPIO的分组,如 GPIOA,
[单片机]
STM32 | 什么是通讯?
一、什么是串行通讯与并行通讯? 按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少量数据信号线(一般是 8 根以下),地线以及控制信号线,按数据位形式一位一位地传输数据的通讯方式。 而并行通讯一般是指使用 8、 16、 32 及 64 根或更多的数据线进行传输的通讯方式。并行通讯就像多个车道的公路,可以同时传输多个数据位的数据,而串行通讯,而串行通讯就像单个车道的公路,同一时刻只能传输一个数据位的数据。 并行通讯与串行通讯的对比图如下: 很明显,因为一次可传输多个数据位的数据 ,在数据传输速率相同的情况下,并行通讯传输的数据量要大得多,而串行通讯则可以节省数据线的硬件成本(特别是远距离时)以及 PCB
[单片机]
<font color='red'>STM32</font> | 什么是通讯?
射频 FDA 如何使用射频采样 ADC 来增强测试系统
为了在无线通信系统中实现更高的数据速率以及在雷达中使用更窄的脉冲来解析近距离目标,对测试和测量仪器的性能和带宽提出了更高的要求。 高带宽示波器和射频数字转换器等射频 (RF) 测试和测量仪器可使用射频采样模数转换器 (ADC),对从直流到数千兆赫的信号同时进行数字化。 射频采样 ADC 取代混频器与窄带 ADC 的配置,降低了系统复杂性并提高了宽带测试和测量仪器、雷达和无线收发器的性能。 设计人员通常使用与无源平衡-非平衡变压器级联的单端增益块来驱动射频采样 ADC。不过,这种方法也有缺点,即限制了可实现的性能。在本文中,我们将讨论这些缺点,并说明射频全差分放大器 (FDA) 如何帮助您更大限度提高射频采样 ADC 的性能
[物联网]
射频 FDA 如何使用射频采样 <font color='red'>ADC</font> 来增强测试系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved