stm32硬件IIC使用

发布者:shmilyde最新更新时间:2017-11-01 来源: eefocus关键字:STM32  硬件IIC 手机看文章 扫描二维码
随时随地手机看文章

在许多帖子里看到许多人在使用I2C设备时,都是使用模拟的I2C,因为ST为了规避专利而把它设计得很难用!

本人今天也尝试了一下官方生成的I2C,使用的是CUBEMX生成的I2C,在生成后也遇到了一些小问题,在这里贴出来,为自己和遇到相同问题的人做一个指导(若有问题,望指正!)

首先,在软件中配置生成带有I2C和USART的工程,如下图:

stm32硬件IIC使用

然后使用KEIL打开工程,进行I2C和USART的实验:

stm32硬件IIC使用
以上生成的工程,已经可以使用I2C和USART了。

打印数据到串口,使用以下函数:

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

将你想要输出的数据在这里填写好即可,如:

HAL_UART_Transmit(&huart1,(unsigned char *)"start..",7,100);

以上函数就可以在串口打印输出:“start..”字符串。



测试I2C使用以下函数:

HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

值得注意的问题是:

MemAddSize

这个参数的意义,是需要使用以下的两个参数之一。

#define I2C_MEMADD_SIZE_8BIT            ((uint32_t)0x00000001)

#define I2C_MEMADD_SIZE_16BIT           ((uint32_t)0x00000010)

下面把我生成的工程,贴出来,供大家参考,当然,你可以看到在使用软件生成的函数时,参数很多,你可以将一些参数多的函数进行封装,然后使用起来就方便多了。

下载地址:

http://www.stmcu.org/module/forum/thread-612424-1-1.html

我的问题:不能正确读取指定地址的数据?

解决:原来我在写读取数据函数时,使用的MemAddSize参数不是I2C_MEMADD_SIZE_8BIT            和I2C_MEMADD_SIZE_16BIT           之一,导致读取的数据不正确。当修改改成I2C_MEMADD_SIZE_8BIT后,读取正确。

 

测试结果:

我向AT24C02写入了123456这6个字符,然后指定读取后三个和全部6个字符。stm32硬件IIC使用


关键字:STM32  硬件IIC 引用地址:stm32硬件IIC使用

上一篇:stm32上的c语言可变参数 实现自己的printf
下一篇:STM32L151中RTC_WakeUpCmd()函数带来了系统延时

推荐阅读最新更新时间:2024-03-16 15:42

用qt编写上位机与stm32通信
好的文章 1、Qt5.5.1实现通用串口程序https://www.2cto.com/kf/201607/524028.html 2、QT实现串口通信 https://www.2cto.com/kf/201610/558768.html 资源下载:https://download.csdn.net/download/hellybobo/9950904?web=web 本文采用的的开发环境是VS2010+Qt5.5.1版本,所有程序不是通过Qt Creator编译的,如果有需要可以介绍VS2010和Qt环境的搭建和简单的使用。 QSerialPort QSerialPort这个类是从QT5.1开始引入的,之前都是通过
[单片机]
用qt编写上位机与<font color='red'>stm32</font>通信
STM32(Cortex-M3) 中NVIC(嵌套向量中断控制)的理解
一、STM32 (Cortex-M3) 中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作 亚优先级 或 副优先级 ,每个中断源都需要被指定这两种优先级。 1. 何为占先式优先级(pre-emption priority) 高占先式优先级的中断事件会打断当前的主程序/中断程序运行 抢断式优先响应,俗称中断嵌套。 2. 何为副优先级(subpriority) 在占先式优先级相同的情况下,高副优先级的中断优先被响应; 在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应 非抢断式
[单片机]
STM32DAC讲解及代码示例
DAC转换 STM32的DAC模块主要特点有: ① 2个DAC转换器:每个转换器对应1个输出通道 ② 8位或者12位单调输出 ③ 12位模式下数据左对齐或者右对齐 ④ 同步更新功能 ⑤ 噪声波形生成 ⑥ 三角波形生成 ⑦ 双DAC通道同时或者分别转换 ⑧ 每个通道都有DMA功能 DAC_OUT1 - PA4 DAC_OUT2 - PA5 DAC配置步骤 程序代码示例: //DAC通道1输出初始化 void Dac1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; DAC_InitTypeDef DAC_InitType; RCC_APB2PeriphClockCm
[单片机]
STM32DAC讲解及代码示例
STM32实例-待机唤醒实验
本文我们来学习下STM32的待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP 按键实现唤醒。学习本内容可以参考《STM32F10x中文参考手册》-4 电源控制器(PWR)章节。 STM32 低功耗模式介绍 很多单片机具有低功耗模式,比如 MSP430、STM8L等。我们的STM32也不例外。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用户需要根据最低电源消耗、最快速启
[单片机]
<font color='red'>STM32</font>实例-待机唤醒实验
不用库函数自己动手配置STM32中的DMA
今天调试的STM32的DMA部分,第一次接触这部分,8位的单片机没有这部分的功能,一开始感觉这东西很神秘,所以怀着敬畏的心情来学习它。慢慢的发现这确实是个好东西,功能强大,可以分担CPU的任务。但它没有想象中那么棘手。 DMA英文全称是Direct Memory Access,意思是直接存储器访问。他的作用就是不需要经过CUP进行数据传输,也就是替CPU分担点事情做,什么事情?数据传输方面的事情。也就是说,你只要使能并配置好了DMA,DMA就可以将一批数据从源地址搬运到目的地址去而不经过CPU的干预,这样可以为CPU节省好多精力去干更重要的事情很人性化。就像我们人一样,我们平常习惯性的动作是不用经过大脑思考的,比如说眨眼睛,呼吸等。
[单片机]
STM32之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library;一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube驱动包,官方培训文档中称为Cube library。 本文使用的为Legacy library USB 驱动。更详细的各驱动库版本,请参考博文STM32 之 USB IP(USB模块) 详解。 本文多出自于ST的官方文档 及 2016~2017的培训文档,读者也可以直接去ST官网查阅相关文档。 稍有涉及USB 2.0 规范的内容,关于USB规范去官网或自行Google。也可以参考: USB之USB2.0 规范详解 第一部分 USB之U
[单片机]
<font color='red'>STM32</font>之三标准外设版USB驱动库详解(架构+文件+函数+使用说明
STM32中关于GPIO口的介绍
一、什么是GPIO? GPIO的英文全称是General-Purpose IO ports,也就是通用输入输出口。 在嵌入式系统中,经常需要控制许多结构简单的外部设备或者电路,这些设备有的需要通过CPU控制,有的需要CPU提供输入信号。并且,许多设备或电路只要求有开/关两种状体就够了,比如LED的亮与灭。对这些设备的控制,使用传统的串口或者并口就显得比较复杂,所以,在嵌入式微处理器上通常提供了一种“通用可编程I/O端口”,也就是GPIO。 一个GPIO端口至少需要两个寄存器,一个做控制用的“通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是
[单片机]
<font color='red'>STM32</font>中关于GPIO口的介绍
STM32开发中的位带操作机制
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。 如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。 想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。 官方给出了如下相应的计算公式: AliasAddr=0x42000000+((A‐0
[单片机]
<font color='red'>STM32</font>开发中的位带操作机制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved