控制寄存器

I2C接口开漏输出输入双向

十年热恋 提交于 2019-12-13 22:03:17
I2C接口 原创 朝辞暮见 发布于2018-06-13 19:45:25 阅读数 8265 收藏 展开 一、I2C总线协议内容 1. I2C总线引脚定义 SDA (I2C数据引脚) CLK (I2C数据引脚) 2. I2C 总线物理连接 I2C总线物理连接如下图所示,SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都将使总线的信号变低。 二、I2C总线的数据传送 1. 数据位的有效性规定 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化 1 scl处于高电平的时候,如果sda处于低电平:传输数据0,sda处于高电平:传输数据1 2.在scl处于高电平的时候,sda用来传输数据,必须保持电平稳定 3.如果要产生数据即sda需要变化时,只能在scl处于低电平的时候 2. 起始和终止信号 SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。 1. 信号的发起和终止,由主机发起,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。 2. scl处于高电平的时候,sda由高->低的跳变, 表示发起传输,产生起始信号s, 如果低-

从零开始51单片机学习教程----经验杂谈

白昼怎懂夜的黑 提交于 2019-12-11 10:37:59
大学四年白混了四年,如今要毕业了。学习单片机,也算是工作前的准备。单片机对于工科类的学生来说真的很重要,这点到现在才明白。写个贴,主要是为了分享一下自己在学习单片机过程中遇到的各种新手入门所遇到的困难,如果能够帮助到一起学习单片机的同学那实属荣幸。 第一步:学习单片机一定要看书,刚开始从书中大概了解单片机各管脚、各个功能寄存器是干什么的、能实现什么功能就够了,这个非常重要,因为控制单片机的核心是用程序去控制单片机的各个功能 寄存器,给寄存器赋值二进制数据0或者1。单片机书有很多,但也不是每一本都适合入门学习,可以看看王云51单片机教程,书带的云龙51教学视频比较全面。 第二步:在电脑上安装上必备的软件(Keil编程软件和STCisp下载软件),找一块开发板开始实践,刚开始可以跟着教学视频操作,边看边练习,不懂的再查一下资料或书本。下载参考程序,并修改参 考程序,从最简单的交通灯实验开始,在实践中不断的积累新知识。 第三步:进行一些小制作,来开拓思维。可以在面包板上搭建各中小电路,当你能做自属于自已风格的产品时,你已算是高手了。 来源: https://www.cnblogs.com/clrystal/p/12020677.html

STM32 GPIO口的配置和应用

我的梦境 提交于 2019-12-10 16:38:31
STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) GPIO_Mode_IN_FLOATING 浮空输入 (3) GPIO_Mode_IPD 下拉输入 (4) GPIO_Mode_IPU 上拉输入 4种输出模式: (5) GPIO_Mode_Out_OD 开漏输出 (6) GPIO_Mode_Out_PP 推挽输出 (7) GPIO_Mode_AF_OD 复用开漏输出 (8) GPIO_Mode_AF_PP 复用推挽输出 四种输入模式: 1、一图记住上拉、下拉、浮空输入模式: 原理分析:图中箭头表示信号流动方向。从I/O引脚向左沿着箭头方向,首先遇到两个开关和电阻,与VDD相连的称为上拉电阻,与Vss相连的称为下拉电阻,再连接到施密特触发器(信号转换)把电压信号转化为0、1的数字信号,存储在输入数据寄存器(IDR)。然后通过设置配置寄存器(CRL、CRH)控制这两个开关,于是就可以得到GPIO的上拉输入、下拉输入模式和浮空输入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空输入模式中,输出缓冲器被禁止(P-MOS和N-MOS),施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接

STM32 GPIO口的配置和应用

自作多情 提交于 2019-12-10 13:27:37
STM32F103ZET6 一共有7组IO口(有FT的标识是可以识别5v的) 每组IO口有16个IO 一共16*7=112个IO 4种输入模式: (1) GPIO_Mode_AIN 模拟输入 (2) GPIO_Mode_IN_FLOATING 浮空输入 (3) GPIO_Mode_IPD 下拉输入 (4) GPIO_Mode_IPU 上拉输入 4种输出模式: (5) GPIO_Mode_Out_OD 开漏输出 (6) GPIO_Mode_Out_PP 推挽输出 (7) GPIO_Mode_AF_OD 复用开漏输出 (8) GPIO_Mode_AF_PP 复用推挽输出 四种输入模式: 1、一图记住上拉、下拉、浮空输入模式: 原理分析:图中箭头表示信号流动方向。从I/O引脚向左沿着箭头方向,首先遇到两个开关和电阻,与VDD相连的称为上拉电阻,与Vss相连的称为下拉电阻,再连接到施密特触发器(信号转换)把电压信号转化为0、1的数字信号,存储在输入数据寄存器(IDR)。然后通过设置配置寄存器(CRL、CRH)控制这两个开关,于是就可以得到GPIO的上拉输入、下拉输入模式和浮空输入模式,浮空就是既不接上拉也不接下拉。在上拉/下拉/浮空输入模式中,输出缓冲器被禁止(P-MOS和N-MOS),施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接

xilinx基础入门

这一生的挚爱 提交于 2019-12-06 04:56:38
2019.09.03 一、基础部分及语法 一、FPGA程序的固化 [USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information. 1、 在C语言代码中,行结尾反斜杠\ 起到换行作用,用于宏定义和字符串换行。其中宏定义使用居多。如果一行中有很多元素导致太长影响阅读,可以在结尾加 \ 的方式实现换行,编译时会忽略\以及其后的换行符,当做一行处理。………\就是表示一行不间断。 2、 关于各种电压: VCCINT:内部PL核心电压 VCCAUX:辅助PL电压 VCCBRAM:PL BRAM电压 VCCPINT:PS内部核心电压 VCCPAUX:PS辅助电压 VCCDDR:DDR RAM的工作电压 VREFP:XADC正参考电压 VREFN:XADC负参考电压 3、 #ifdef __cplusplus Extern “C”{ #endif 代码说明: 为了在C++代码中调用用c写成的库文件,就需要用extern”C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。 二、断言函数 #define Xil_AssertNonvoid(Expression) \ { \ if (Expression) { \ Xil

offsetof(s,m)解析

南笙酒味 提交于 2019-12-04 18:49:08
h ttps://www.cnblogs.com/jingzhishen/p/3696293.html sizeof()用法汇总 sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int); 对于静态数组,sizeof可直接计算数组大小; 例:int a[10];char b[]="hello"; sizeof(a)等于4*10=40; sizeof(b)等于6; 注意:数组做型参时,数组名称当作指针使用!! void fun(char p[]) {sizeof(p)等于4} char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20; char ss[] = "0123456789"; sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1 sizeof(

2019年11月5日

南笙酒味 提交于 2019-12-03 14:50:14
什么是寄存器 在点亮 LED 的时候,我们都是用操作寄存器的方法来实现的,那大家是否想过,这个 寄存器到底是什么?为什么我们可以直接操作 P0 口? 解答上面的问题之前,我们先简单介绍下 51 单片机的主要组成部分,这对我们学习其 他单片机也有好处。 我们以国内的 STC89C51 为例,该单片机主要由 51 内核、外设 IP、和总线这三大部分 组成。内核是由 Intel 公司生产的,外设 IP 就是 STC 公司在内核的基础上添加的诸如定时 器、串口、IO 口等这些东西,总线就是用来连接内核和外设的接口单元。Intel 在这里属于 IP 核设计公司,STC 属于 IC 设计公司。世界上能设计 IP 核的公司屈指可数。我们非常熟 悉的 ARM 公司就属于 IP 核设计公司,ARM 给其他公司授权,其他 IC 公司就在 ARM 内 核上设计出各具特色的 MCU,我们后面要学习的 STM32 就是属于一中基于 ARM 内核的 MCU。 寄存器则是内置于各个 IP 外设中,是一种用于配置外设功能的存储器,就是一种内 存,并且有想对应的地址。学过 C 语言我们就知道,要操作这些内存就可以使用 C 语言中 的指针,通过寻址的方式来操作这些具有特殊功能的内存—寄存器。比如 P0 口对应的地址 是 0X80,那么我们要修改 0X80 这个地址对应的内存的内容的话,按照常理可以这样操 作: 1 *

ARM NVIC控制器(基于cortex-M4)

匿名 (未验证) 提交于 2019-12-02 23:57:01
中断控制寄存器映射 中断寄存器的基地址为0xE000E000,所有中断控制/状态寄存器都只能在特权级下访问(除软件触发中断寄存器外),寄存器映射列表见表3-2。也可以参考cortex-m4使用手册,并推荐使用CMSIS函数来访问相关功能。 表3-2 中断寄存器映射 偏移量 名称 位宽 类型 复位值 描述 0x100-0x11C ISER0-ISER7 32 R/W 0x00000000 中断使能寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x180-0x19C ICER0-ICER7 32 R/W 0x00000000 中断清除使能寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x200-0x21C ISPR0-ISPR7 32 R/W 0x00000000 中断挂起寄存器,寄存器0为(IRQ0~IRQ31),以此类推 0x280-0x29C ICPR0-ICPR7 32 R/W 0x00000000 中断挂起清除寄存器寄存器0为(IRQ0~IRQ31),以此类推 0x300-0x31C IABR0-IABR7 32 RO 0x00000000 中断活动状态寄存器寄存器0为(IRQ0~IRQ31),以此类推 0x400-0x4EF IPR0-IPR59 32 R/W 0x00000000 中断优先级寄存器0寄存器0为(IRQ0~IRQ3),以此类推 0xD08

STM32第一周复习

Deadly 提交于 2019-12-02 14:45:58
资料可以去意法半导体官网 最底层(了解)CM3权威指南/CM4权威指南 芯片参考手册(了解)STM32F10x中文参考手册 官方其他资源教程(了解)固件库包(含参考源码),官方培训PPT 熟练掌握C语言 熟练掌握一种开发环境 库函数和寄存器对比学习 入门一款单片机的学习目标 基本外设 GPIO输入输出, 外部中断 定时器 串口 基本外设接口 SPI IIC WDG FSMC ADC/DAC SDIO 高级功能 UCOS FATFS EMWIN 外什么选择STM32 什么是STM32 Cortex-M3属于ARMv7架构 A系列 面对尖端的基于虚拟内存系统的操作系统和用户 R系列 针对于实时系统 M系列 对微控制器 性价比高,更稳定,所以可以替换ARM7 芯片有哪些资源 ZET6 144个引脚 112个IO 512K 64K RCT6 64个引脚 51个IO 256K 48K 强大的时钟系统 上电复位,掉电复位 低功耗 AD 3个12位 内置参考电压 内置温度 DA 2个12位 DMA 12个DMA通道 定时器 多达11个定时器 通信接口 2个I2C 5个串口 3个SPI 1个CAN2.0 1个USB FS 1个SDIO 最小系统 供电 复位 时钟 boot启动模式选择 下载电路 后备电池 程序下载 串口下载 STM32的ISP下载只能通过串口1,也就是对应的PA9,PA10

一个关于内联优化和调用约定的Bug

做~自己de王妃 提交于 2019-12-02 03:20:19
很久没有更新博客了(博客园怎么还不更新后台),前几天在写一个Linux 0.11的实验 [1] 时遇到了一个奇葩的Bug,就在这简单记录一下调试过程吧。 现象 这个实验要求在Linux 0.11中实现简单的信号量 [2] ,但在改动内核代码后运行测试程序总是报错,例如: /* pc_test.c */ #define __LIBRARY__ #include <stdio.h> #include <stdlib.h> #include <semaphore.h> #include <unistd.h> _syscall2(long, sem_open, const char *, name, unsigned int, value); _syscall1(int, sem_unlink, const char *, name); int main(void) { sem_t *mutex; if ((mutex = (sem_t *) sem_open("mutex", 1)) == (sem_t *)-1) { perror("opening mutex semaphore creating"); return EXIT_FAILURE; } sem_unlink("mutex"); return EXIT_SUCCESS; } 提示为段错误: 定位 在内核实现信号量的核心代码