stm32 gpio I/O模式以及iic访问

news2024/11/19 10:38:16

 1,硬件补充连接原理图引脚

 

#define FLASH_BASE            ((uint32_t)0x08000000) /*!< FLASH(up to 1 MB) base address in the alias region                         */
#define CCMDATARAM_BASE       ((uint32_t)0x10000000) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region  */
#define SRAM1_BASE            ((uint32_t)0x20000000) /*!< SRAM1(112 KB) base address in the alias region                             */
#define SRAM2_BASE            ((uint32_t)0x2001C000) /*!< SRAM2(16 KB) base address in the alias region                              */
#define SRAM3_BASE            ((uint32_t)0x20020000) /*!< SRAM3(64 KB) base address in the alias region                              */
#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region                                */
#define BKPSRAM_BASE          ((uint32_t)0x40024000) /*!< Backup SRAM(4 KB) base address in the alias region                         */


#define APB1PERIPH_BASE       PERIPH_BASE
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)
#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000)
#define AHB2PERIPH_BASE       (PERIPH_BASE + 0x10000000)

#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE            (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE            (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE            (AHB1PERIPH_BASE + 0x0C00)
#define GPIOE_BASE            (AHB1PERIPH_BASE + 0x1000)
#define GPIOF_BASE            (AHB1PERIPH_BASE + 0x1400)
#define GPIOG_BASE            (AHB1PERIPH_BASE + 0x1800)
#define GPIOH_BASE            (AHB1PERIPH_BASE + 0x1C00)
#define GPIOI_BASE            (AHB1PERIPH_BASE + 0x2000)
#define GPIOJ_BASE            (AHB1PERIPH_BASE + 0x2400)


#define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414 
#define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814 
#define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14 
#define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014 
#define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414    
#define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
#define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14    
#define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014  

#define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010 
#define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410 
#define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810 
#define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10 
#define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010 
#define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410 
#define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810 
#define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10 
#define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010    


以GPIOB举例
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  

//IO 操作函数
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA
#define READ_SDA PBin(9) //输入 SDA

2,起始信号

//IO 方向设置
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;}//PB9 输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;}//PB9 输出模式

PB9 为MODER9, 看stm32407寄存器手册MODER9里面的bit18-bit19。

00:输入(复位状态) 01:通用输出模式 10:复用功能模式 11:模拟模式. 

STM32芯片的IO有8中模式:

(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 复用推挽输出

上面的MODER9定义和(1)-(4)定义。

//产生 IIC 起始信号
void IIC_Start(void)
{
    SDA_OUT(); //sda 线输出
    IIC_SDA=1;IIC_SCL=1;
    delay_us(4);
    IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    delay_us(4);
    IIC_SCL=0;//钳住 I2C 总线,准备发送或接收数据
}

3,结束信号

//产生 IIC 停止信号
void IIC_Stop(void)
{
    SDA_OUT();//sda 线输出
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    delay_us(4);
    IIC_SCL=1; IIC_SDA=1;//发送 I2C 总线结束信号
    delay_us(4);
}

4,ack/nack应答

//产生 ACK 应答
void IIC_Ack(void)
{
    IIC_SCL=0;SDA_OUT();
    IIC_SDA=0;delay_us(2);
    IIC_SCL=1;delay_us(2);
    IIC_SCL=0;
}
//不产生 ACK 应答
void IIC_NAck(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=1;delay_us(2);
    IIC_SCL=1;delay_us(2);
    IIC_SCL=0;
}

 5,获取ack状态

//等待应答信号到来
//返回值: 1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
    u8 ucErrTime=0;
    SDA_IN(); //SDA 设置为输入
    IIC_SDA=1;delay_us(1);
    IIC_SCL=1;delay_us(1);
    while(READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC_Stop();
            return 1;
        }
    }
    IIC_SCL=0;//时钟输出 0
    return 0;
}

 应答位为0 成功接收数据   应答位为1 表示来不及接收数据,SCK一个周期内,SDA为0为NACK, SDA为1 表示ACK。

6,读写eeprom接口

//IIC 发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{
    u8 t;
    SDA_OUT();
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;
        delay_us(2); //对 TEA5767 这三个延时都是必须的
        IIC_SCL=1;delay_us(2);
        IIC_SCL=0; delay_us(2);
    }
}

//读 1 个字节, ack=1 时,发送 ACK, ack=0,发送 nACK
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA 设置为输入
    for(i=0;i<8;i++ )
    {
        IIC_SCL=0; delay_us(2);
        IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;
        delay_us(1);
    }
    if (!ack) IIC_NAck();//发送 nACK
    else IIC_Ack(); //发送 ACK
    return receive;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

球体检测系统源码分享

球体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

元素循环分析再添新成员:铜、钼、镍、钴、硒微量元素数据库注释

微量营养元素&#xff08;例如Fe、Cu、Mo、Ni等&#xff09;是光合作用、呼吸作用、生物大分子合成、氧化还原平衡、细胞生长和免疫系统功能等微生物驱动过程的重要调节因子。虽然生物体需要少量的微量营养元素&#xff0c;但缺乏微量营养元素会严重限制生物体的生长和生物过程…

快手IP归属地怎么设置别的地方

在当今数字化时代&#xff0c;社交媒体平台如快手已成为人们日常生活中不可或缺的一部分。快手通过显示用户的IP归属地&#xff0c;增加了信息的透明度和互动性。然而&#xff0c;有些用户可能出于个人需求或特定情境&#xff0c;希望将自己的IP归属地设置为别的地方。本文将深…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一&#xff1a; .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二&#xff1a; .ellipsis {ove…

分布式锁总结1 - 为什么需要分布式锁?

目录 1. 最基本的业务逻辑是&#xff1a; 2. 高并发场景下常见的缓存问题 2.1问题一 缓存穿透 : 一直查询不存在的数据 解决方案 : 短暂缓存null结果 2.2 问题二 缓存雪崩 : 大量key同时过期大量请求直击数据库 解决方案 : 在原有的过期时间上加一个随机的值&#xff0c;…

国联安基金前置机用朝天椒USB Server实现了虚拟化

国联安基金近期上线了朝天椒USB Server产品&#xff0c;影响了虚拟化进程的物理前置机逐步退出了历史舞台&#xff0c;实现了虚拟化&#xff0c;通过USB服务器&#xff0c;虚拟机中也能网络识别各个前置机系统的认证U盾。 一、背景 国联安基金在金融业务运营过程中&#xff0c…

进度条QProgressBar

进度条控价&#xff0c;用来只是任务的完成情况 值 包括当前值、最大值、最小值 // 获取和设置当前值 int value() const; void setValue(int);// 获取和设置最大值 int maximum() const; void setMaximum(int);// 获取和设置最小值 int minimum() const; void setMinimum(i…

Datawhale X 南瓜书 task01学习笔记

机器学习三观 机器学习工程领先理论 what:什么是机器学习? 机器学习定义&#xff1a;研究关于“学习算法”(一类能从数据中学习出其背后潜在规律的算法)的一门学科PS:深度学习指的是&#xff1a;神经网络那一类学习算法&#xff0c;因此是机器学习的子集把深度学习单列出来…

Linux网络命令:用于请求和配置网络地址的命令dhclient详解

目录 一、概述 二、功能描述 三、基本使用 1. 命令格式 2. 常用选项 3. 获取帮助 ​编辑 4. 基本操作 四、工作原理 1. 发送DHCP请求 2. 接收DHCP响应 3. 请求IP地址 4. 确认IP地址 5. 配置网络接口 五、功能特点 六、配置文件 七、常用命令和示例 1、启动…

spring boot项目对接人大金仓

先确认一下依赖 第一 是否引入了mybatis-plus多数据源&#xff0c;如果引入了请将版本保持在3.5.0以上 <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${dynam…

自闭症寄宿学校陕西:提供综合发展的教育环境

星贝育园&#xff1a;自闭症儿童的综合发展摇篮 在自闭症儿童教育的广阔领域里&#xff0c;寄宿制学校以其独特的康复环境和全方位的支持体系&#xff0c;为这些特殊的孩子点亮了希望之灯。广州的星贝育园自闭症儿童寄宿制学校&#xff0c;正是这样一所充满爱心与专业的机构&a…

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试&#xff0c;并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…

R包:ggspatial空间画图

ggplot2语法的空间图形画图 Spatial data plus the power of the ggplot2 framework means easier mapping. 加载R包 # install.packages("ggspatial")library(ggplot2) library(ggspatial) load_longlake_data()Using layer_spatial() and annotation_spatial() g…

香港品牌JEWELRIESHOP发起商标维权,尚未TRO,跨境卖家注意排查

案件基本情况&#xff1a;起诉时间&#xff1a;2024-9-6案件号&#xff1a;2024-cv-08146品牌&#xff1a;JEWELRIESHOP原告&#xff1a;Chung Ting Yu原告律所&#xff1a;Ford Banister LLC起诉地&#xff1a;伊利诺伊州北部法院涉案商标/版权&#xff1a;原告品牌简介&#…

【触想智能】工业显示器在智慧城市中的应用市场分析

随着智能技术的快速发展和智慧城市的不断兴起&#xff0c;工业显示器作为智慧城市基础设施的重要组成部分&#xff0c;正逐渐成为市场热点。 触想工业显示器TPC-M200系列 工业显示器不仅在监控、交通、能源等领域有着广泛应用&#xff0c;还在提升智慧城市管理和运营效率方面发…

【前端】前端高级与前端全家桶——学的更深更广一点!

工作太卷了要加油呀&#xff01; 今天首次参加宣讲会&#xff0c;华测导航的&#xff0c;1/300&#xff0c;太可怕了 What can I do for your company? 前端&#xff0c; 更深一点&#xff08;JS、算法、底层原理、手写&#xff09; 当谈及前端开发的学习深度时&#xff0…

WRFDA保姆级安装教程

文章目录 前言基础环境准备Ubuntu20.04子系统安装WSL功能开启与Ubuntu子系统下载Ubuntu用户创建 Ubuntu 20.04 更换国内镜像 相关库及WRFDA安装检验和安装基础包WRF基础环境测试编译器基础环境测试基础库安装zlib安装hdf5安装netcdf4-c 安装netcdf-fortran安装mpich安装安装lib…

CSP-S 2024 提高级 第一轮(初赛) 阅读程序(1)

【题目】 CSP-S 2024 提高级 第一轮&#xff08;初赛&#xff09; 阅读程序&#xff08;1&#xff09; 1 #include <iostream> 2 using namespace std; 3 4 const int N 1000; 5 int c[N]; 6 7 int logic(int x, int y) { 8 return (x & y) ^ ((x ^ y)…

【资源三号卫星】

资源三号卫星 资源三号卫星&#xff08;ZY-3&#xff09;&#xff0c;作为中国第一颗民用高分辨率光学传输型测绘卫星&#xff0c;于2012年1月9日成功发射&#xff0c;正式拉开了我国在高分辨率对地观测领域自主发展的序幕。以下是对资源三号卫星的详细介绍&#xff1a; 基本…

从Servlet+JSP+JDBC到MyBatis:重构用户CRUD操作的高效之旅

前言 原生的JDBC&#xff1a; 原生的JDBC操作数据库&#xff0c;书写较为繁琐&#xff0c;降低开发效率。JDBC的局限性&#xff08;如代码冗余、SQL语句与Java代码紧密耦合、难以维护等&#xff09;。 相比于JDBC&#xff0c;Mybatis的优势&#xff1a; SQL与Java代码的分离、强…