STM32应用相关问答解析

发布者:HarmonyJoy最新更新时间:2024-07-17 来源: elecfans关键字:STM32  寄存器 手机看文章 扫描二维码
随时随地手机看文章

这里就STM32用户咨询到的几个问题,稍加整理分享出来供君参考。


第1问:我目前使用STM32G0B1,代码里有设计BOOT代码,想在跳转前清理各类使用过的外设寄存器。请问STM32有没有复位所有外设寄存器的函数?


答:其实,每个STM32系列都有相关寄存器和应用函数用来针对指定外设或挂在指定总线上的外设进行批量复位,即令其回归到初始复位状态。以STM32G0系列为例,在STM32HAL库里就有类似下面的各种实现函数。

d7376692-a6ed-11ee-8b88-92fbcf53809c.png

关于这个话题可以参考本公众号另外一篇文章《话说STM32外设复位》,那里有更多详细解读,此处就不再赘述。

第2问:我在使用STM32F730的时候,如果SRAM设置到0x20010000 - 0x2001FFFF之间,DMA传输流程都对,但是SPI输出的数据不对,这是怎么回事?另外,在用USB的bulk传输的时候也是,数据有时是对的,有时候错的。

如果SRAM的缓冲区设置到0x20000000-0x2000FFFF之间的时候,就一切正常。请问这是什么原因?

答:现在问题是,只要代码使用的RAM内存锁定在0x20000000-0x2000FFFF之间时功能都正常,只有使用到0x20010000之后的RAM才有异常。结合他使用的芯片STM32F730,基于ARM Cortex-M7内核的,芯片里有高速L1 Cache。同时,他的代码里还用到了DMA。这样看来,如果他的代码启用了D-Cache,用到2个主设备【CPU和DMA】,如果没有针对D-Cache的使用做合理的配置,就很可能发生数据一致性方面的问题。经用户的进一步反馈,他的代码里也的确使用了D-Cache。

进一步的问题就是,为什么这里不能使用0x20010000之后的区域呢?为探究竟,我们有必要看看STM32F730相关的参考手册。

经查证,0x20000000-0x2000FFFF区间是属于DTCM区,CPU访问它时不使用D-Cache,即CPU每次访问DTCM时都是直接访问,当然DMA是不能使用D-Cache的。这时自然不会产生数据访问的一致性问题。而0x20010000~0x2001FFFF区域是经AXI接口访问的,默认情况下,CPU访问这块区域是可以使用D-Cache的【前提是使能了D-Cache】。

d741ada0-a6ed-11ee-8b88-92fbcf53809c.png

也就是说当我们使用到0x20010000之后的RAM区域时,CPU访问这块可以启用D-Cache。如果DMA也访问这块,若不对该区域做合理存储属性配置或适当操作就可能发生数据一致性问题。此时我们可以对相应RAM区域做MPU配置,将其配置为Shareable 且NonCacheable属性。或在代码里适时地使用针对Cache的清除或无效操作。关于MPU如何配置,这里不做展开,有兴趣的可以进一步了解。本公众号里也有多篇相关文章可供参考阅读。

第3问:在使用STM32 TIMER事件作为触发输出时,那个RESET信号是怎么回事?跟定时器从模式的RESET 模式有什么关系?

d752ecbe-a6ed-11ee-8b88-92fbcf53809c.png

答:这里的RESET事件特指通过软件方式对TIMx_EGR寄存器的UG进行置1操作。该操作可以产生1个触发信号给到其它外设,比方ADC,DAC或其它TIMER。同时这个RESET操作对当前定时器会产生更新效果或复位效果,具体点说就是产生更新事件,当前计数器发生重装从新开始计数。

该RESET操作跟定时器RESET从模式有关系吗?没有任何关系,但有相同的现象或效果。即处于RESET从模式的TIMER收到触发信号时,该从定时器也会产生更新事件、计数器进行重装计数。至于给到处于RESET从模式的TIMER的触发信号,可以是源于前级TIMER的更新事件、计数器使能事件、比较事件产生的,也可以是软件RESET操作产生的。

第4问:在使用STM32 ADC多通道转换时,如果不希望一次性转换完成如何操作?

答: 看情况。如果你选择使用的多个ADC通道,平常转换顺序固定,只是不希望基于扫描模式启动后就一次性转换完毕,而是分次分批转换完成。这时我们可以考虑使用ADC的分组转换模式。可以参考本公众号文章《STM32 ADC间断转换模式应用示例》。

如果你选择使用的多个ADC通道,使用过程中转换顺序随机,只是想每次就某个通道做转换,不同时刻可能使用不同的通道。本质上讲,这其实就是单通道转换,在配置时按单通道配置。需要使用哪个通道时,就针对某个通道配置后再做启动。这点可以参考本公众号文章《ADC多通道随机选择性转换应用示例》。

第5问:在使用STM32片内的Vrefint电压是ADC的参考基准吗?它有什么用?

答:STM32片内的Vrefint电压不是ADC模块的参考基准,STM32片内ADC的参考基准可以是Vref,或VDDA【多数时候VDDA跟VDD是接在一起的】,有些系列还可以是VrefBuf电压。注意不要把Vref、Vrefint、VrefBuf搞混了!事实上经常有人弄混。【早期推出的系列STM32片内没有VrefBuf】

Vrefint电压值一般固定在1.2v左右,波动很小。各STM32芯片数据手册有给出参数范围【下图来自STM32G0系列数据手册】:d76d0b12-a6ed-11ee-8b88-92fbcf53809c.png

至于它有什么用,这要看情况。它只是个备用项、可用项。

我经常拿它来验证ADC功能是否正常,因为其电压可知且比较稳定,无须外边引线。有些场合,Vrefint作为相对稳定的AD输入,反过来监测芯片的VDD,此时ADC模块的参考电压VDDA跟VDD是接在一起。有时Vrefint或其分压可用作片内比较器的输入做其它用途。


关键字:STM32  寄存器 引用地址:STM32应用相关问答解析

上一篇:STM32里的串口通信
下一篇:STM32的外部中断

推荐阅读最新更新时间:2024-11-02 10:36

基于LTC6804的电池管理系统设计
简介:本文基于该芯片,辅以热电阻式温度传感器实现多路的温度采集,配合Ⅱ公司STM32F103单片机实现电池管理系统模块单个模块实现24个单体电池的充放电电压监控(两片LTC6804)和16路的温度采集,支持can总线。 LTC6804是Lmear公司2012年发布的第三代多电池组监视器,可几乎同时测量多达121、串接电池的电压,并具有更低的总测量误差相比LTC6803测量精度有了不小的提升,本文基于该芯片,辅以热电阻式温度传感器实现多路的温度采集,配合Ⅱ公司STM32F103单片机实现电池管理系统模块单个模块实现24个单体电池的充放电电压监控(两片LTC6804)和16路的温度采集,支持can总线。 本文分电压温度采集和控
[单片机]
基于LTC6804的电池管理系统设计
大型车辆内轮差危险区域双向示警系统设计
摘 要:大型车辆由于自身车长,轴距长等特点在转弯过程中前轮与后轮轨迹不重合,形成“内轮差”区域。大型车辆发生的恶性 交通事故 中,由于“内轮差”引发的事故占70%以上。针对大型车辆转弯视觉盲区“内轮差”问题,本设计提出一套大型车辆 内轮差危险区域 双向示警系统的设计方案。整个系统模拟真实车辆转向过程。主控模块采用 STM32 进行控制,通过连接电路、实验调试后,该系统可以模拟真实车辆转向过程,并计算“内轮差”危险区域,进行相关 双向声光示警 ,能够达到预期目标,对有效减少大型车辆“内轮差”事故的发生提供解决方案。 *本项目获得“2020全国大学生集成电路创新创业大赛·创新实践项目组”辽宁省一等奖、东北赛区二等奖、国家级三等奖。
[汽车电子]
大型车辆内轮差危险区域双向示警系统设计
嵌入式开发:STM32 FSMC接口驱动TFT-LCD设计
TFT-LCD技术是微电子技术和LCD技术巧妙结合的高新技术。随着人们对图像清晰度、刷新率、保真度的要求越来越高,TFT-LCD的应用范围越来越广。本文提出了一种能直接驱动数字液晶屏的设计方案,方案先介绍了TFT数字彩屏的工作原理,利用STM32处理器的FSMC接口设计的硬件电路和软件程序均能对显示控制芯片进行有效的控制。在实际应用中显示清晰流畅,并且CPU有足够的时间来处理用户程序。该方案能成功应用在电脑横机的人机界面显示中,且其硬件电路结构简单、控制方式灵活、对于其他型号的接口芯片也能提供参考。 0 引言 随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏。目前
[单片机]
嵌入式开发:<font color='red'>STM32</font> FSMC接口驱动TFT-LCD设计
stm32单片机用什么软件编程
  今天要和大家分享的是stm32单片机用什么软件编程相关信息。   想学单片机开发,最主要是熟悉stm32的软件开发环境,目前stm32的开发环境,主流是KEIL和IAR,当然主要是windows版本运行。   两个开发环境都是目前的主流,都用的很多,而且这两种开发环境实际上差异不大,学好一个即可。我个人常用keil,虽然keil的版本很多,因为我常用的是STM32F1,所以KEIL4,就能满足需求。想完整完成一个Stm32的工程开发过程,需要学会新建工程,这个是单片机开发工具基础操作。   除此之外。还需要学会使用Keil进行仿真,写代码肯定会遇到各种问题。怎么找到问题造成的原因。就需要仿真查看了代码执行情况,当然也有其他
[单片机]
Linux环境开发STM32,从环境到调试
首先简单地描述一下软硬件开发环境。 宿主机: 操作系统:CentOS7 x86_64 ( grome桌面版 ) IDE:Eclipse Luna JLink驱动:JLink_Linux_V434a 工具链:GNU-ARM-Toolchains-4.9-2014q4 GDB:arm-linux-gdb V7.8.1 硬件平台: CPU:STM32F103C8T6 JLink:V8 USB转串口:Silicon Labs CP2101 环境的搭配都是比较简单的,编译工具链都比较容易装。这里就不再介绍了。下面就只附上工具链的下载链接。 https://launchpad.net/gcc
[单片机]
Linux环境开发<font color='red'>STM32</font>,从环境到调试
STM32】DAC基本原理、寄存器、库函数(DAC一般步骤)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第12章 数字模拟转换DAC DAC的基本介绍 DAC的基本定义 Digital-to-Analog Converter的缩写。指数/模转换器或者数字/模拟转换器。是指将离散的数字信号转换为连续变量的模拟信号的器件。 典型的数字模拟转换器将表示一定比例电压值的数字信号转换为模拟信号。 STM32的DAC模块是12位数字输入,电压输出型的DAC。 DAC的主要特征 2个DAC转换器:每个转换器对应1个输出通道; 8位或者12位单调输出; 12位模式下数据左对齐或者右对齐; 同步更新功能; 噪声波形生成; 三角波形生成; 双DAC通道同时或者分别转换;
[单片机]
【<font color='red'>STM32</font>】DAC基本原理、<font color='red'>寄存器</font>、库函数(DAC一般步骤)
STM32 usb_mem.c和usb_sil.c文件的分析
这两个c文件都还算是很简单的,先讲讲usb_mem.c这个文件。从文件名就能知道跟内存有关,这个文件主要定义了两个函数,一个读双缓冲区PMA的数据PMAToUserBufferCopy(),另一个是写数据到双缓冲区PMA,UserToPMABufferCopy。如果,当你的usb设备接收到了数据,当然数据存放在PMA中了,我们要读出数据就要用到PMAToUserBufferCopy()函数了,如果我们想要发送数据给usb主机,就要将你要发送的数据拷贝到PMA缓冲区中了,这样才能发送出去,原理跟串口类似。 /*************************************************************
[单片机]
STM32的12位ADC过采样实现16位分辨率
1.什么是过采样 过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术。部分STM32单片机是支持硬件过采样的,如STM32G0系列。通过过采样,可以将12位的ADC提升到16位,非常实用。 根据过采样技术,每提高1位ADC分辨率,需要增加4倍的采样率。也就是说1次采样是12Bit,4次是13Bit,16次是14Bit,64次是15Bit,256次是16Bit,如果要更高分辨率,那么STM32的硬件过采样就无能为力了。 过采样主要通过配置ADC_SMPR寄存器的下面几位即可实现,配置移位位数、过采样倍数以及使能位。如下: 最大可配置为256倍过采样,实现16位分辨率。当采用256倍过采样时,得到的结果是20位的,但ADC
[单片机]
<font color='red'>STM32</font>的12位ADC过采样实现16位分辨率
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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