STM32 硬件I2C 到底是不是个坑?

发布者:快乐航程最新更新时间:2022-01-11 来源: eefocus关键字:STM32  硬件I2C  CLK 手机看文章 扫描二维码
随时随地手机看文章

/**

******************************************************************************

* @author    Maoxiao Hu

* @version   V1.0.0

* @date       May-2015

******************************************************************************

* < COPYRIGHT 2015 ISE of SHANDONG UNIVERSITY >

******************************************************************************

**/

调试STM32的硬件I2C已经有很长一段时间了,几乎搜遍了所有资料,对于其到底能不能正常工作,今天做一个彻底的研究。

 

下面是我在测试中得到的几个结论:

1、硬件I2C的CLK在50kHz及以下的情况下工作,不会出现任何情况下的卡住。(本人测试时间为20h)

2、硬件I2C的CLK在常用的100kHz和400KHz下工作,99%的概率下会在1小时之内卡住,甚至只有几十秒。

3、硬件I2C的CLK在任何频率下工作,在读取或者发送数据时,都绝对不允许其它中断事件打断它的工作,否则一定会卡住,只是时间问题。

综上,硬件I2C的稳定工作情况是:工作在50kHz及以下,并且保证无其它任何中断打断它的工作。这样只适用于某些对速率要求不高的场所,比如EEPROM的读取等,而对于高速器件例如某些型号的AD芯片,就不能用了。

 

如果你一定需要高速率(400KHz),那么推荐大家使用STM32的替代方案GD32(兆易创新),它与STM32完全兼容但是解决了STM32的硬件I2C bug,经过本人实际测试,在400KHz的情况下工作,48小时无任何错误发生。但是仍需注意的是不能有外部中断打断I2C的工作。

 

对于ST公司推荐的将I2C工作在DMA和最高优先级的中断,我只能说大家可以根据自己的情况使用,因为如果你使用了ucos ii或者其它实时操作系统,那么这种设置最高优先级的方式是绝对不推荐的。如果你是裸机程序,并且任务数量不多,可以考虑这种DMA+中断的方式,否则一定会出现问题,只是测试时间长短问题。

 

最后需要说明的是:

(1)以上只是考虑了最纯粹的硬件I2C代码,对于某些使用了软件弥补的方法,例如在经常卡住的部分设置超时退出,不在本文的讨论范围内,因为这样已经破坏了正常的I2C协议。

(2)由于使用STM32的较高境界是使用中断调度任务而不是死等循环,而硬件I2C对于中断打断十分忌讳,所以随着你的编程和对操作系统理解水平的提高,你会越来越感觉STM32硬件I2C是个坑。

 

所以,STM32的硬件I2C确实是个坑,可以正常工作的环境要求十分苛刻,


关键字:STM32  硬件I2C  CLK 引用地址:STM32 硬件I2C 到底是不是个坑?

上一篇:STM32软件定时器的设计
下一篇:在Mac OS X中使用VIM开发STM32(4)

推荐阅读最新更新时间:2024-11-22 11:12

STM32I2C接口读写EEPROM(AT24C02)试验例程
硬件平台:stm32f10xZET6 开发环境:keil MDK uVisionv4.10 开发语言:C、ST_lib_3.5固件库 EEPROM:电可擦可编程只读存储器。 【stm32f10xZET6开发板的I2C外设物理层特点】 (1)两条串行总线:一条双向数据线(SDA),一条时钟线(SCL); (2)从设备地址唯一; (3)支持总线仲裁; (4)三种速率传输模式: 标准模式100kbit/s 快速模式400kbit/s 高速模式3.4Mbit/s (目前大多I2C设备尚不支持高速模式) (5)片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整; (6)连接到相同总线的IC数量受到总线的最大电容400p
[单片机]
STM32 测量交流电压的方法
关于STM32测量交流电的一种方法. 关于交流电压测量的难点有以下几点:1.电压过大,比如市电220V,2.交流电和直流电区别很大,例如值一直在变不稳定.3.交流电压存在负值,STM32 的AD模块没法测量.4.STM32读取的电压值是瞬时值和交流电的有效值还要转换. 针对以上几点:可以采取合适的硬件设计和算法设计解决.采用电流互感器将电压从高变低,采用直流电压叠加的方式将整体的交流波形抬升,抬升到最低都大于零.至于读取到的数值采用均方根的算法算出交流有效值.另外还要注意一点是采样周期的设置. 电路设计: 这个硬件电路设计很完善.还有一种: 第二种电路结构更简单,但是运放采用的是用于测量交流信号的MCP
[单片机]
<font color='red'>STM32</font> 测量交流电压的方法
意法半导体推出功率量程更大的STM32 烧录调试器,赋能下一代超低功耗应用
2023 年 4 月 25 日,中国 – STLINK-V3PWR是意法半导体新推出的一款在线调试烧录器,能够准确地测量在任何一款STM32 微控制器 (MCU) 上运行的应用的功耗。 该产品的宽动态量程能够处理物联网和无线应用等功耗敏感的开发项目,可测量从纳安到 500mA 的电流值,测量准确度保持在±0.5%。此外,该产品用一条 USB 数据线就可以为目标系统提供最高2A的电流,开发人员无需再单独连接一个电源为电路板供电。 STM32CubeMonitor-Power图形工具直接支持STLINK-V3PWR ,能够实时图显应用的功率需求量,分析设计变更对功耗的影响,以便提高能效。此外,Arm® Keil® 开发工
[单片机]
STM32 TALK | 无感FOC方案原理机器控制难点分析
1、电机控制方案的分析与选择 在永磁电机的无感控制策略中,主要有两大类:(1)无感方波控制;(2)无感FOC控制。 先谈谈无感方波控制。在无感方波控制中,主要是利用反电动势过零点的方式来得到换相信号(反电动势过零点的信号与电机的换相信号在相位上相差30°电角度)。为了得到反电动势过零的信号,通常采用两种方式:(1)硬件比较器法;(2)软件端电压采样法。这两种方法的原理大致是相同的,都是将检测得到的端电压的值与电机中性点电压进行比较来得到反电动势过零点的信号。在无感方波控制中,该检测手段的好坏将决定了控制性能的好坏。但无感方波控制通常会伴随着噪声大、转矩脉动大等缺点,因此仅在一些对电机无感控制要求不是很高的场合中较为适用。
[单片机]
STM32的SWD下载模式
之前一直用的JTAG下载,最近使用了下SWD模式。SW模式使用了5个引脚,NRST :复位 SWCLK:串行线时钟 SWDIO:串行线调试数据输入/输出,另外的为 GND 和VCC SWD模式的优势:SWD 模式比 JTAG 在高速模式下面更加可靠. 在大数据量的情况下面 JTAG 下载 程序会失败, 但是 SWD 发生的几率会小很多. 基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 比较方便,并且引脚比较少,便于集成。
[单片机]
<font color='red'>STM32</font>的SWD下载模式
STM32自带PWM输出实验
#include stm32f10x_lib.h #include sys.h #include delay.h #include usart.h #define LED0_val TIM3- CCR2 void PWM_init(u16 arr,u16 psc) { RCC- APB1ENR|=1 1; //TIM3时钟使能 GPIOA- CRH&=0xfffffff0; //PA8 GPIOA- CRH|=0x00000004; //PA8 浮空输入 GPIOA- CRL&=0x0fffffff; GPIOA- CRL|=0xB00000
[单片机]
<font color='red'>STM32</font>自带PWM输出实验
stm32 AD模数转换[操作寄存器+库函数]
stm32f103最少有2个AD模数转换器,每个ADC都有18个通道,可以测量16个外部和2个内部模拟量。最大转换频率为1Mhz,也就是转换时间为1us(在 ADCCLK = 14Mhz,采样周期为1.5个时钟周期时)。最大时钟超过14Mhz,将导致ADC转换准确度降低。stm32的ADC是12位精度的。 stm32的ADC转换有两种通道,规则通道和注入通道,注入通道可以抢占式地打断规则通道的采样,执行注入通道采样后,再执行之前的规则通道采样,和中断类似。本例只使用规则通道实现独立模式的中断采样,这里不再赘述两种通道区别。 stm32的ADC可以由外部事件触发(例如定时器捕获,EXTI线)和软件触发(即在配置相关寄存器时,
[单片机]
STM32串口通信设置(查询方式)
首先是配置UART的GPIO口 void UART1_GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // Configure USART1_Tx as alternate push-pull GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_I
[单片机]

推荐帖子

Cadence16.6破解完后,打开PCB Editor报错,如图所示。求助。。。
Cadence16.6破解完后,打开PCBEditor报错,如图所示。求助。。。打开不能正常使用?直接就弹出这个?是不是破解没破解好?你是不是选错editor了? 都试过了,还是报错。。。我现在下个16.5试试~~~ :time:额,,,我16.6前前后后在N台电脑上都安装成功,从来没遇到过你的问题额。。重装吧 我问同事,也没遇到这种问题。。。装了个win732bit的虚拟机,现在好用了,估计是我原来系统组件有冲突 装了四五遍没用,,实在没法装了个WIN7
周张超 PCB设计
lwIP的TCP client在资料接收问题?
使用8962範例专案enet_lwip中加入tcpclient,使mcu能连接到PC端的tcplistener.已测试可正常连线至pc,接通时发送6个byte至pc端去,如下程式码:staticerr_tTcpClient_Connected(void*arg,structtcp_pcb*pcb,err_terr){unsignedcharbb={0x00,0x01,0x02,0x03,0x04,0xFF};tcp_write(pcb,bb,
tomexou 微控制器 MCU
51定时器任意io输出pwm的呼吸灯
/*定时器iopwm程序*/typedefunsignedcharuint8;typedefunsignedintuint16;sfrAUXR=0x8E;//0000,0000辅助寄存器//按键和led接口定义sbitLED=P3^4;//定时器重装值#defineSYSTEM_CLOCK11059200//时钟频率#defineTIMER0_OVERFLOW_FREQ(25600)//定时器溢出频率//定时器重装值,指定类型避
huo_hu 51单片机
stm32串口通讯时怎样接收字符串
串口通讯时我想实现把pc机发过来的字符串提取出来,且提取结果能在main函数里使用,怎么配置?stm32串口通讯时怎样接收字符串附件是野火的中断例子,哪位大侠能在此基础上配置将接收的数据能在主函数里使用?定义一个数组缓冲,中断接收后放入缓冲,之后在任何想用的地方都可以直接从数组中获取。。。。。最简单的做法就是定义一个全局变量的数组,在中断中把接收到的字符逐个存储到数组中处理。请问楼主怎么解决的啊,我也遇到了同样的问题,845588678@qq.com万分感谢会问这样的问题,
飓风狂飙 stm32/stm8
为什么会输出负电压?
在Vi=-12v时,Vo会输出负电压,大概有-2v,为什么呢?基极和发射极反偏不应该截止吗?(两个电阻分别是174欧和300欧) 为什么会输出负电压?截止区也是在一定电压范围的为什么会输出负电压?怀疑你的测量方法或是电路的实际连接。我在Vi端输入2.7v,Vo输出2v,Vo接一个50欧的负载,三极管变得烫手,这正常吗?9014的Pcm为0.4w,没超呀。我用的9014是贴片的,是不是贴片的不好?无语,,同板凳的意见,,,,Vi=-12v时,Vo会输出负电压对!楼主英明。但多数
PCB板 模拟电子
滤波器基础知识-滤波器种类
  滤波器基础知识-滤波器种类  滤波器是一种用来消除干扰杂讯的器件,它是由集中参数的电阻、电感和电容,或分布参数的电阻、电感和电容构成的对特定频率的频点或该频点以外的频率进行有效滤除的电路(滤波器电路)。那么,滤波器种类有哪些呢?小编通过搜集整理资料,对滤波器种类及相关知识作了详细的归纳总结。  滤波器的分类(数字滤波器的分类)  1、按所处理的信号  按所处理的信号分为模拟滤波器和数字滤波器两种。  2、按所通过信号的频段  按所通过信号的频段分为低通、高通、带
sairvee 模拟电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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