stm32f407VET6 系统学习 day06 窗口看门狗, IIC 通信协议

news2024/11/26 2:48:08

1.独立看门狗,与窗口看门狗的差别

1. 差别1 : 窗口看门狗, 有上限   0x7F, 有下限 0x40  ,, 独立看门狗只有下限 0

2. 差别2:  时钟源不同,  独立看门狗:LSI     

                                             窗口看门狗    :APB1时钟  分频后得到时钟驱动


2.窗口看门狗配置过程


3.代码

头文件

#ifndef __MY_WWDG_H__
#define __MY_WWDG_H__
#include "stm32f4xx_wwdg.h"
#include "stm32f4xx_gpio.h"
void mywwdg_init(void);

#endif

 .cpp 文件


#include "mywwdg.h"

void mywwdg_init()
{
    NVIC_InitTypeDef NVIC_InitStruct;
    // 使能看门狗时钟: RCC_APB1PeriphClockCmd();
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);
    //设置分频系数:     WWDG_SetPrescaler();
    WWDG_SetPrescaler(WWDG_Prescaler_8);
    //设置上窗口值:
    WWDG_SetWindowValue(0x6f);
    //开启提前唤醒中断并分组
   
    NVIC_InitStruct.NVIC_IRQChannel = WWDG_IRQn ;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    
    NVIC_Init(&NVIC_InitStruct);
    	//6清除提前唤醒中断标志位:防止提前进入中断函数中。
	WWDG_ClearFlag();
     WWDG_EnableIT();
    // 使能看门狗:
    WWDG_Enable(0X7F);
    
}

void WWDG_IRQHandler()
{
    WWDG_SetCounter(0x5f);
    WWDG_ClearFlag();
    
}

4.IIC 的通信协议

基础知识:l2C(Inter-Integrated Circuit)总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,由于其简单性,2C总线被非常广泛地应用在EEPROM(指带电可擦可编程只读存储器)、实时钟、小型LCD等设备与CPU的接口中。

I2C总线是一种用于Ic器件之间连接的双向二线制总线,所谓总线,是指它上面可以挂多个器件,并且通个两根线连接,占用空间非常的小。

I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生,读取I2c从控器的数据或向I2C从控器写入数据。l2C总线实现设备通信的框图如下:



5.IIC .的信号内容  (状态, 与信号)

1. 空闲状态 : I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

2.起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。


3.停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是—种电平跳变时序信号,而不是一个电平信号。

4. 应答信号: 当我们的主机把时钟信号拉高之后,  从机把数据总线的电平变为低电平, 主机收到这个低电平的信号。

5. 当我们的主机把时钟信号拉高之后,  从机把数据总线的电平变为高电平, 主机收到这个高电平的信号。


6.IIC 主机发送数据

发送数据的流程:

 两种情况:

1. 主机发送 一个信号表明自己要发送数据给这个从机 (7 个地址)

2.  主机发送 一个信号表明自己要接收数据从这个从机(7个地址)这里。

数据格式:

1. 第一个 主句发送起始信号

2. 第二个发送  从机的7 为的地址信号 和一位的 读写信号(判断主机  收数据,还是接收数据)

3. 从机应答

4. 第一种情况: 主机发送数据从机应答, 第二种情况: 从机发送数据主句应答。


7.代码:

头文件:

#ifndef __MY_IIC_H__
#define __MY_IIC_H__
#include "stm32F4xx.h"

#define SCL_HIGH()  GPIO_SetBits(GPIOB,GPIO_Pin_6)
#define SDA_HIGH()  GPIO_SetBits(GPIOB,GPIO_Pin_7)

#define SDA_LOW()  GPIO_ResetBits(GPIOB,GPIO_Pin_7)

#define SCL_LOW()  GPIO_ResetBits(GPIOB,GPIO_Pin_6)

void IIC_Init(void);

//起始信号
void IIC_Start(void);

//停止信号
void IIC_Stop(void);

//发送应答信号
void IIC_Ack(void);

//接收应答信号
u8 IIC_Wait_Ack(void);
//发送非应答信号
void IIC_NAck(void);

//发送一个字节数据
void IIC_Send_Byte(u8 sendData);

//读取数据线的高低电平
u8 READ_SDA(void);

//输入输出
void SDA_IN(void);

void SDA_OUT(void);
#endif

.cpp 文件

#include "myii.h"
#include "stm32f4xx_rcc.h"
#include "mysystick.h"
// PB6---SCL   PB7---SDA
void IIC_Init()
{
    GPIO_InitTypeDef GPIO_InitStruct ;
    
    //第一步:AHB1总线上的E组引脚时钟使能;(心脏开始跳动)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

    //设置gpio结构体
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7  ;   //控制哪一个引脚  PE8
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 设置引脚为输出
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //设置输出速度
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   //推挽方式
   GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;  //设置高电平还是低电平
    //设置GPIO口寄存器数据
   GPIO_Init(GPIOE,&GPIO_InitStruct);
   GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
}

//起始信号
void IIC_Start()
{
    //设置输出模式
    SDA_OUT();
    //一开始两根线拉高,空闲
    SDA_HIGH();
    SCL_HIGH();
    delay_us(2);
    //数据线产生下降沿,低电平
    SDA_LOW();
    delay_us(2);
    //把时钟线拉低
    SCL_LOW();  
    
}

//停止信号
void IIC_Stop()
{
    //设置输出模式
    SDA_OUT();
    //一开始低电平 数据无效
    SDA_LOW();
    SCL_LOW();
    //时钟线拉高 使在高电平的时候有上升沿
    delay_us(2);
    SCL_HIGH();
    delay_us(2);
    //产生上升沿
    SDA_HIGH();
    delay_us(2);
}

//发送应答信号
void IIC_Ack(void)
{
    //先设置输出模式
    SDA_OUT();
    //时钟线拉低
    SCL_LOW();
    delay_ms(2);
    //发送应答信号
    SDA_LOW();
    delay_ms(2);
    //时钟线拉高,在高电平期间保持SDA稳定
    SCL_HIGH();
    delay_ms(2);
    //拉低,数据线无效
    SCL_LOW();
    
}

//发送非应答信号
void IIC_NAck()
{
   //先设置输出模式
    SDA_OUT();
    //时钟线拉低
    SCL_LOW();
    delay_ms(2);
    //发送应答信号
    SDA_HIGH();
    delay_ms(2);
    //时钟线拉高,在高电平期间保持SDA稳定
    SCL_HIGH();
    delay_ms(2);
    //拉低,数据线无效
    SCL_LOW();
}

//发送一个字节数据
void IIC_Send_Byte(u8 sendData)
{
    u8 i = 0;
    //先设置成输出模式
    SDA_OUT();
    //时钟线拉低
    SCL_LOW();
    for(i = 0; i < 8;++i)
    {
        if(sendData& 0x80)
        {
            SDA_HIGH();
        }
        else
        {
            SDA_LOW();
        }
        sendData <<= 1;
        delay_ms(2);
        //时钟线拉高 开始发数据
        SCL_HIGH();
        delay_ms(2);
        //数据发送完成后,时钟线拉低
        SCL_LOW();
    }
}


u8 IIC_Wait_Ack(void)
{
    u8  count =0;
    //设置输入模式
    SDA_IN();
    //数据线拉高
    SCL_HIGH();
    delay_ms(2);
     //时钟线拉高
    SDA_HIGH();
    delay_ms(2);
   
    //读SDA线高电平还是低电平
    while(READ_SDA() != 0)
    {
        count++;
        if(count > 250)
        {
            IIC_Stop();
            return 1;
        }
    }
    SCL_LOW();
    //时钟线拉低
    return 0;
}

//读取数据线的高低电平
u8 READ_SDA(void)
{
    u8 val = 0;
    val= GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);
    return val;
}

//输入输出
void SDA_IN(void)
{
GPIO_InitTypeDef GPIO_InitStruct ;
    
    //第一步:AHB1总线上的E组引脚时钟使能;(心脏开始跳动)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

    //设置gpio结构体
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7  ;   //控制哪一个引脚  PE8
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // 设置引脚为输出
   GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;  //设置高电平还是低电平
    //设置GPIO口寄存器数据
   GPIO_Init(GPIOE,&GPIO_InitStruct);
   GPIO_SetBits(GPIOB,GPIO_Pin_7);
}

void SDA_OUT(void)
{
 GPIO_InitTypeDef GPIO_InitStruct ;
    
    //第一步:AHB1总线上的E组引脚时钟使能;(心脏开始跳动)
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

    //设置gpio结构体
   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7  ;   //控制哪一个引脚  PE8
   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // 设置引脚为输出
   GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;  //设置输出速度
   GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;   //推挽方式
   GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;  //设置高电平还是低电平
    //设置GPIO口寄存器数据
   GPIO_Init(GPIOE,&GPIO_InitStruct);
   GPIO_SetBits(GPIOB,GPIO_Pin_7);
}

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

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

相关文章

【iMessage苹果推群发】苹果相册推它由pushchatkey.pem和pushchatcert.pem作为单独的文件使用

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

cut与分层抽样

个人觉得&#xff0c; 把分层抽样称为“分类采样”会更贴切一些。通常最基本的采样手段是&#xff1a;随机抽样&#xff0c;但是在很多场景下&#xff0c;随机抽样是有问题的&#xff0c;举一个简单的例子&#xff1a;如果现在要发起一个啤酒品牌知名度的调查问卷&#xff0c;我…

Improved Unsupervised Lexical Simplification with Pretrained Encoders 论文精读

Improved Unsupervised Lexical Simplification with Pretrained Encoders 论文精读InformationAbstract1 Introduction2 System Description2.1 Simplification Candidate Generation2.2 Substitution Ranking2.3 Obtaining Equivalence Scores3 End-to-end System Performanc…

好书推荐《C++17 in Detail》

无意中发现作者的博客&#xff08;https://www.cppstories.com/&#xff09;和这本书。这本书算是对C17新增特性较为全面的介绍&#xff0c;而且从实战出发&#xff0c;不流于语法细枝末节&#xff0c;简洁清晰&#xff0c;可以作为Scott Meyers那本非著名的《Effective Modern…

2022环境电器年度行业分析报告:洗地机同比增长357%,扫地机器人销量197万+

在当前的大环境下&#xff0c;人们的消费观念不断变化&#xff0c;健康因素在购买决策中的比重逐渐增大&#xff0c;因此&#xff0c;与此挂钩的环境电器行业也迎来发展变化。 在这里&#xff0c;鲸参谋也综合了京东平台环境电器中一些重点类目的销售数据&#xff0c;主要包括吸…

Krita像素画教程

Krita Windows 上一款自由开源的绘画软件 Krita 是一款自由开源的免费绘画软件&#xff0c;使用 GPL 许可证发布。它的功能齐全&#xff0c;能胜任从起草、勾线、上色到最终调整的所有绘画流程&#xff0c;可以绘制概念草图、插画、漫画、动画、接景和 3D 贴图&#xff0c;支持…

云服务器部署内网穿透映射本地服务

项目开发时需要和前端联调&#xff0c;考虑使用内网穿透避免每次上传服务部署的过程 下载frp &#xff08;开源内网穿透、反向代理工具&#xff09; https://github.com/fatedier/frp/releases/上传云服务器并解压&#xff08;使用xftp等工具上传&#xff09; tar -zxvf frp_0…

尚硅谷JavaWeb教程

1、Servlet Server Applet 全称为&#xff1a;Java Servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据&#xff0c;生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口&#xff0c;广义的Servlet是指任何实现了这个Servlet接口的类。 1.1、Ser…

李沐精读论文:DETR End to End Object Detection with Transformers

论文&#xff1a; End-to-End Object Detection with Transformers 代码&#xff1a;官方代码 Deformable DETR&#xff1a;论文 代码 视频&#xff1a;DETR 论文精读【论文精读】_哔哩哔哩_bilibili 本文参考&#xff1a; 山上的小酒馆的博客-CSDN博客 端到端目标检测DETR…

【javaSE】类和对象

希望各位老铁三连支持&#xff01; 文章目录 # 关于面向对象# 类的定义和使用# 构造方法的创建和初始化# 封装## 封装的概念## 访问限定符## 封装包的各种用法# 关键字static# 代码块一、关于面向对象 1.1面向对象的定义 简单来说&#xff0c;面向对象就是一种编程的思想&…

Compose 为什么可以跨平台?

这是我在 2022 Kotlin 中文开发者大会 中带来的一个分享&#xff0c;会后有网友反馈希望将 PPT 内容整理成文字方便阅读&#xff0c;所以就有了本篇文章。大家如果要了解本次大会更多精彩内容&#xff0c;也可以去 JetBrains 官方视频号查看大会的直播回放。 前言 Compose 不止…

Bean的生命周期流程-上

Bean的生命周期流程-上引言getBeangetSingletoncreateBean后置处理器类型区分doCreateBeancreateBeanInstance 是如何创建bean的实例的引言 Spring拥有一套完善的Bean生命周期体系,而使得这套生命周期体系具有高扩展性的关键在于Bean生命周期回调接口&#xff0c;通过这些接口…

层次分析法(AHP)

主要来解决评价类问题 什么是评价类问题&#xff1a;选择哪种方案最好&#xff0c;哪位运动员表现的更优秀。 评价类问题可以用打分解决 同一颜色的单元格权重之和为1 解决评价类问题&#xff0c;大家首先要想到以下三个问题&#xff1a; 1.我们评价的目标是什么&#xff1…

FineReport数据可视化图表-配置MySQL8外接数据库(1)

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 - 11.0.3 1&#xff09;首次配置外接数据库时&#xff0c;支持自行选择是否「迁移数据至要启用的数据库」 2&#xff09;迁移外接数据库的过程提示细化&#xff0c;方便用户了解迁移进度 1.2 功能简介 报表系统配置外接数…

USB TYPE C为什么能实现正反插

USB TYPE C接口在手机&#xff0c;电脑等移动终端中使用的非常多&#xff0c;它可以分为插头和插座&#xff0c;放在PCB板上一般是插座。 USB TYPE C的插座和插头引脚信号定义大家可以看下。引脚分为两排&#xff0c;上面一排是A&#xff0c;下面一排是B。标准的USB TYPE C总共…

YOLOV5融合SE注意力机制和SwinTransformer模块开发实践的中国象棋检测识别分析系统

本文紧接前文&#xff1a; 《基于yolov5s实践国际象棋目标检测模型开发》 《yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别》 首先来看下最终效果&#xff1a; 在我棋类检测系统开发之——五子棋检测那篇博文写完之后就萌生了想做一下基于目标…

WebDAV之葫芦儿·派盘+BubbleUPnP

BubbleUPnP 支持WebDAV方式连接葫芦儿派盘。 推荐一款投屏神器,它将手机内容分享到电视大屏上与家人好友一起共享,软件还提供了丰富的音乐及影视资源,喜欢的内容在线搜索就能播放。支持连接葫芦儿派盘WebDAV服务站,可以直接播放派盘内的影视资源。 BubbleUPnP是一款支持U…

水文监测系统-水文监测站构成 设备 功能 特点介绍以及案例分享

平升电子水文监测系统实现对江河流域水位、降水量、流量、流速、水质、闸门开启度、墒情等数据的实时采集、报送和处理。为防汛抗旱减灾提供科学依据和有效信息共享&#xff0c;保障人民群众生命财产安全&#xff0c;满足水利和经济社会发展对水文服务的需求。 2022年1月&#…

web前端-javascript-百炼成仙(第1节掌握JavaScript基础1.1-1.21)

文章目录1.1 第一章 初入宗门1.2 第二章 直接量1.3 第三章 数据类型1.4 第四章 数据类型扩展内容:1.5 第五章 基础考核1.6 第六章 何老1.7 第七章 对象数据类型1.8 第八章 对象的取值1.9 第九章 循环遍历的奥妙小结&#xff1a;For 循环1.10 第十章 对象内容的遍历1.11 第十一章…

Linux软件包管理之rpm与yum

Linux软件包管理之rpm与yum1.Linux rpm 命令2.rpm包的管理3.yum包管理&#xff08;强推&#xff09;1.Linux rpm 命令 Linux rpm 命令用于管理套件。 rpm&#xff08;英文全拼&#xff1a;redhat package manager&#xff09; 原本是 Red Hat Linux 发行版专门用来管理 Linux…