STM32入门学习笔记之EEPROM存储实验5

发布者:Harmonious88最新更新时间:2024-04-18 来源: elecfans关键字:STM32  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

(2)创建at24cxx.c文件并输入以下代码。


/*********************************************************************************************************

                EEPROM    驱    动    程    序

*********************************************************************************************************/

#include 'at24cxx.h'

#include 'delay.h'

/***************************************************

Name    :IIC_Write_Data

Function  :写入1个数据

Paramater  :

      Address:地址

      Byte:读取的字节

Return    :None

***************************************************/

void IIC_Write_Data( u8 Address, u8 Byte )

{

  u16 Time, tmpreg ;

  tmpreg = tmpreg ;

  //等待BUSY标志置0

  Time = 0 ;

  while( ( ( I2C1->SR2&0x02 )==0x02 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos

  I2C1->CR1 |= 1<<8 ;                                          //开始信号

  //等待SB标志置1

  Time = 0 ;

  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->DR = 0xA0 ;                                          //发送从机地址

  //等待地址发送结束

  Time = 0 ;

  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )

  {

    Time ++ ;

    if( ( I2C1->SR1&0x400 )==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除AF标志

      I2C1->CR1 |= 1<<9 ;                                      //结束信号

      break ;

    }

  }

  tmpreg = I2C1->SR1 ;                                        //清除地址标志

  tmpreg = I2C1->SR2 ;

  //等待TXE标志置0

  Time = 0 ;

  while( ( ( I2C1->SR2&0x04)==0 )&&( Time<65535 ) )

  {

    Time ++ ;

    //检查是否检测到NACK

    if( ( I2C1->SR1&0x400 )==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;

      I2C1->CR1 |= 1<<9 ;                                      //结束信号

      break ;

    }

  }

  I2C1->DR = Address ;                                        //发送寄存器地址

  //等待TXE标志置1

  Time = 0 ;

  while( ( ( I2C1->SR1&0x80 )==0 )&&( Time<65535 ) )

  {

    Time ++ ;

    //检查是否检测到NACK

    if( ( I2C1->SR1&0x400 )==0x400 )

    {

      I2C1->SR1 &= ~( 1<<18 ) ;                                  //清除NACKF标志

      I2C1->CR1 |= 1<<9 ;                                      //结束信号

      break ;

    }

  }

  I2C1->DR = Byte ;                                          //发送数据

  //等待BTF标志被置1

  Time = 0 ;

  while( ( ( I2C1->SR1&0x04 )==0 )&&( Time<65535 ) )

  {

    Time ++ ;

    //检查是否检测到NACK

    if( ( I2C1->SR1&0x400 )==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF标志

      I2C1->CR1 |= 1<<9 ;                                      //结束信号

      break ;

    }

  }

  I2C1->CR1 |= 1<<9 ;                                          //结束信号

  delay_ms( 10 ) ;

}

/***************************************************

Name    :IIC_Read_Data

Function  :读取1个数据

Paramater  :

      Address:地址

Return    :读取的数据

***************************************************/

void IIC_Read_Data( u8 Address, u8 *Data )

{

  u16 tmpreg, Time;

  tmpreg = tmpreg ;

    //等待BUSY标志置0

  Time = 0 ;

  while( ( ( I2C1->SR1&0x02 )==0x02 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos

    //发送从机地址

  I2C1->CR1 |= 1<<8 ;                                          //开始信号

  Time = 0 ;

  //等待SB标志置1

  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->DR = 0xA0 ;                                          //发送从机地址

  //等待地址发送结束

  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )

  {

    if( ( I2C1->SR1&0x400 )==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除AF标志

      I2C1->CR1 |= 1<<9 ;                                      //停止信号

      break ;

    }

  }

  tmpreg = I2C1->SR1;                                          //清除ADDR标志

  tmpreg = I2C1->SR2;

  //等待TXE标志置1

  while( ( ( I2C1->SR1&0x80 )==0 )&&( Time<65535 ) )

  {

    //检查是否检测到NACK

    if( ( I2C1->SR1&0x400)==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF标志

      I2C1->CR1 |= 1<<9 ;                                      //通用结束

      break ;

    }

  }

  I2C1->DR = Address ;                                        //写入数据

  //等待BTF标志置1

  while( ( ( I2C1->SR1&0x04 )==0 )&&( Time<65535 ) )

  {

    //检查是否检测到NACK

    if( ( I2C1->SR1&0x400)==0x400 )

    {

      I2C1->SR1 &= ~( 1<<10 ) ;                                  //清除NACKF标志

      I2C1->CR1 |= 1<<9 ;                                      //通用结束

      break ;

    }

  }

  I2C1->CR1 |= 1<<9 ;                                          //通用结束

  //等待忙标志退出

  Time = 0 ;

  while( ( ( I2C1->SR1&0x02 )==0x02 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->CR1 &= ~( 1<<11 ) ;                                      //禁用Pos

    //发送从机地址

  I2C1->CR1 |= 1<<10 ;                                        //开启应答信号

  I2C1->CR1 |= 1<<8 ;                                          //开始信号

  //等待SB标志置1

  Time = 0 ;

  while( ( ( I2C1->SR1&0x01 )==0 )&&( Time<65535 ) )

    Time ++ ;

  I2C1->DR = 0xA1 ;                                          //发送从机地址

  //等待地址标志置1

  while( ( ( I2C1->SR1&0x02 )==0 )&&( Time<65535 ) )

  {

    Time ++ ;

    //检查是否检测到STOPF

    if( ( I2C1->SR1&0x10 )==0x10 )

    {

      I2C1->SR1 &= ~( 1<<4 ) ;                                  //清除停止标志

      break ;

    }

  }

  I2C1->CR1 &= ~( 1<<10 ) ;                                      //禁止应答

[1] [2]
关键字:STM32  EEPROM 引用地址:STM32入门学习笔记之EEPROM存储实验5

上一篇:什么是串口通讯?STM32中的串口通讯接口有哪些
下一篇:STM32入门学习笔记之EEPROM存储实验2

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

解读STM32最小系统那些事
一:电源 无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空。 对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU。 用万用表测试供电电压是否正确,调试时最好用数字电源供电,以便过压或过流烧坏板子,电压最好一步一步从进线端测试到芯片供电端。 二:启动选择 Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址 在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空; STM32三种启动模式对应的存储介质均是芯片内置的,它们是: STM32的三种
[单片机]
解读<font color='red'>STM32</font>最小系统那些事
在MDK调试STM32出现“could not stop cortex-m device”解决办法
错误如http://www.amobbs.com/forum.php?mod=viewthread&tid=4075329 错误图片如下: 我的解决办法: 发现RESET一直在1V附近,将RESET处的下拉电容换掉后第一个错误没有,但是跳出下面的错误:No Cortex-M Device found in JTAG chain。 解决办法:发现JTAG线没插上,插上就好了。 http://no001.blog.51cto.com/1142339/857117 网上的解决办法: 1 我遇到这个问题的原因是Boot1没接地,所以可以考虑下是否是硬件的原因 2 如果MCU出于reset状态,也会出现这种情
[单片机]
在MDK调试<font color='red'>STM32</font>出现“could not stop cortex-m device”解决办法
STM32的GPIO口的输出:开漏输出和推挽输出
推挽输出与开漏输出的区别: 推挽输出:可以输出高,低电平,连接数字器件 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 三极管的开漏输出有什么特性,和推挽是不是一回事, 问题: 很多芯片的供电电压不一样,有3.3v和5.0v,需要把几种IC的不同口连接在
[单片机]
STM32通用定时器详解
1. STM32定时器分类 STM32定时器可以分为3类: A)高级控制定时器TIM1和TIM8 高级定时器适合多种用途,包含输入捕获、输出比较、PWM、带死区控制的PWM等,所以可以用来做电机控制。 B)通用定时器TIM2、TIM3、TIM4、TIM5 通用定时器就是基本的定时器,同51单片机中定时器的概念。 C)基本定时器TIM6和TIM7 基本定时器可以为通用定时提供时间基准,可以为DAC提供时钟。 2. 通用定时器功能介绍 3. 通用定时器操作步骤 操作通用定时器时主要有如下几部: A)打开定时器的时钟 定时器的时钟控制寄存器为:APB1ENR,如下: 操作方式为RCC- APB1ENR |= (1 0); //打开T
[单片机]
<font color='red'>STM32</font>通用定时器详解
STM32开发笔记88: SX1268驱动程序设计(天线控制)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍天线控制的相关驱动程序。 上篇日志,提到在SX126xCheckDeviceReady函数中,如果芯片处于启动、硬复位、SLEEP模式、RX_DC模式,转换到STDBY模式时,需唤醒芯片,并将天线打开,程序如下: void CSX1268::SX126xCheckDeviceReady(void) { if((this- OperatingMode == MODE_SLEEP) || (this- OperatingMode == MODE_RX_DC)) { SX126xWakeup(); SX126
[单片机]
<font color='red'>STM32</font>开发笔记88: SX1268驱动程序设计(天线控制)
STM32堆栈设置
1.堆和栈大小 定义大小在startup_stm32f2xx.s Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp ; h Heap Configuration ; o Heap Size (in Bytes) 0x0-0xFFFFFFFF:8 ; /h Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base
[单片机]
<font color='red'>STM32</font>堆栈设置
STM32 DMA使用详解
DMA部分我用到的相对简单,当然,可能这是新东西,我暂时还用不到它的复杂功能吧。下面用问答的形式表达我的思路。 DMA有什么用? 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。 有多少个DMA资源? 有两个DMA控制器,DMA1有7个通道,DMA2有5个通道。 数据从什么地方送到什么地方? 外设到SRAM(I2C/UART等获取数据并送入SRAM); SRAM的两个区域之间; 外设到外设(ADC读取数据后送到TIM1控制其产生不同的PWM占空比); SRAM到外
[单片机]
<font color='red'>STM32</font> DMA使用详解
基于CORTEX的STM32的三相电能表方案
背景   电能表是用来测量电能的仪表,又称电度表,火表,电能表,千瓦小时表,指测量各种电学量的仪表。基于ARM的方案已经出现,但是适合应用的ARM7 TDMI在性能上不尽人意,同时外设资源不足;而更高端的ARM9系统的复杂程度很高,成本也较高。所以要研究一种廉价的,满足客户需求的电能表,来填补这个空缺。   一、关于CORTEX-M3与STM32   最新一代ARM v7内核,命名为Cortex,同ARM7/9/10/11相比在架构上有了革命性突破。它采用高效的哈佛结构三级流水线,达到1.25DMIPS/MHz,在功耗上更是达到0.06mW/MHz。Cortex-M3使用Thumb-2指令集,自动16/32位混合排列。单周
[工业控制]
基于CORTEX的<font color='red'>STM32</font>的三相电能表方案
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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