STM32的数据传输外设:USART、I2C、SPI三种常见接口的学习

发布者:TranquilSmile最新更新时间:2019-04-09 来源: eefocus关键字:STM32  数据传输  外设 手机看文章 扫描二维码
随时随地手机看文章

一、USART串行接口


串行接口分为异步串行接口和同步串行接口两种,其中异步串行接口统称为通用异步收发器接口UART,具有同步功能的UART(包含时钟信号SCLK)称为通用同步/异步收发器接口USART。


USART的电气特性标准包括RS-232C、RS422、RS423和RS485等,其中RS-232C是最常见的串行通信接口(台式机的显示器与主机的连接线好像就是RS232吧)


RS232有9个引脚,当然最常用的只有三个:RXD(接收数据)、TXD(发送数据)、GND(用来共地);而RS232的主要指标有两个:数据速率和数据格式。数据速率就是我们设置的波特率,而数据格式便是我们设置的起始位、数据位、校验位、停止位;


因为UART是挂载在APB1上的,所以我们使用其传输数据的时候,要先开启相应的时钟。但是不要忘了,UART是需要用到GPIO接口的,所以我们还需要开启GPIO的时钟,并且先初始化GPIO接口,再初始化USART。


至于USART使用哪些GPIO引脚,我就不赘述了,网上随便一查就能知道。


当我们程序需要对USART进行操作的时候,我们若通过寄存器进行操作的话,那么通过查询USART寄存器的表便可以慢慢书写下来,而通过库函数的话,通过正点原子的例程也可以很清楚的学习到。


我们只需要知道在我们的主函数里先使用初始化函数,将USART初始化完成,然后接收数据的话通过串口中断来完成,根据项目设置的接收结束标志,把接收结束标志位置1,在主函数中通过查询该标志位的真假来完成接收。


而发送的话,我们既可以用重定向printf来发送数据(但是我不建议实时系统或者系统资源比较小的时候使用,因为该方法会使程序耗费的资源大大增加);也可以通过自己写发送函数,通过传入字符串指针,通过对指针的查询,来逐字节输出到USART->DR,再查询USART->SR来判断是否发送成功,从而发送下一字节。


二、I2C内部集成总线接口


内部集成电路总线接口I2C是通信控制领域广泛采用的一种标准,连接在总线上的每一个设备都有唯一的7/10位地址。


I2C采用一根双向串行数据线SDA和一根双向串行时钟线SCL实现主/从设备间的多主串行通信。


而I2C所要学习的也正是其各个时期的时序以及数据线的高低电平变动:


I2C总线在传输数据的过程中一共有三种信号:开始信号、结束信号、应答信号。


开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传输数据。


结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传输数据。


应答信号:接收数据的IC在接收到8bit的数据后,向发送数据的IC发出一个特定的低电平脉冲,表示已经接收到数据。例如CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号则再根据实际情况决定是否发送下一个信号;若没有接收到应答信号,则可以判断受控单元出现了故障。


这三种信号里,起始信号是必须需要的,而结束信号和应答信号都可以视情况不要。



而使用I2C的时候肯定是要先初始化,初始化的时候我们先初始化GPIO的时钟,然后根据时序图来写出起始信号,结束信号与应答信号,而向从IC写数据与读数据,这些函数在正点原子里都有写,我就不占篇幅赘述啦。


三、SPI串行设备接口


SPI在工业控制领域的应用也可以说是非常多的,SPI可以实现主设备或从设备协议,并且它是一种典型的全双工数据传输方式,其传输的正确性通过串行时钟SCK来保证。当配置为主设备时,SPI可以连接多达16个独立的从设备,发送数据和接收数据寄存器的宽度可以设置为8位或者16位。


SPI使用四根线来实现串行通信:两根数据线、一根时钟线、一根控制线


主出从入MOSI:主设备输出数据,从设备输入数据


主入从出MISO:主设备输入数据,从设备输出数据


串行时钟SCK:主设备输出,从设备输入,用于同步数据位


从设备选择NSS:主设备输出,从设备输入,用来选择哪一个从设备与主机通信。


并且SPI的接口时序也由两个很重要的参数决定:时钟极性与时钟相位


时钟极性为0时初始电平是低电平,为1时初始电平是高电平;时钟相位为0时第一个边沿采集数据,为1时第二个边沿采集数据。


关键字:STM32  数据传输  外设 引用地址:STM32的数据传输外设:USART、I2C、SPI三种常见接口的学习

上一篇:STM32 I2C 难点
下一篇:STM32应用简章之GPIO初始化

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

STM32开发笔记43: 使用CMSIS-RTOS建立任务
单片机型号:STM32F070F6P6 昨天,将FreeRTOS移植到STM32现有的工程后,今天希望使用RTOS进行工程设计,遇到的第1个问题,就是工程中的函数在FreeRTOS的帮助文档中全部都检索不到。在网上仔细学习后,才发现,ST公司给的FreeRTOS例程,又进行了一层封装,这层就是CMSIS-RTOS。CMSIS-RTOS是keil公司对不同RTOS的一种封装结构,可以使不同的RTOS具有相同的调用接口,以方便今后程序的移植。本文,详细介绍使用CMSIS-RTOS建立任务的方法。 使用CMSIS-RTOS建立任务需要用到两个API,分别是osThreadDef和GprsTaskHandle,其具体定义如下:
[单片机]
<font color='red'>STM32</font>开发笔记43: 使用CMSIS-RTOS建立任务
STM32在IAR的开发步骤
我也是刚开始接触stm32,前几天开始在IAR上做程序,发现很多网上写的建立程序步骤已不适于新版本的IAR,遇到不少问题,每个问题都得自己解决,最后在一些网友的帮助下,终于成功建立了第一个程序。 现在我写出STM32在IAR建立工程的步骤与大家分享,希望能帮大家解决一些问题。 我使用的是IAR5.3版本,固件库3.0版本(注意查看你的固件库是不是3.0,3.0以上的版本大致相同) 第一步,先建立一个文件夹,该文件夹将放所有与项目有关的文件,并将ST公司提供的固件函数库(Libraries)复制到该文件夹下,并在该文件中在建立一个文件,命名为project,再创立一个文本文档,命名为readme 如图所示 打开project,将
[单片机]
<font color='red'>STM32</font>在IAR的开发步骤
STM32通过FSMC读写CPLD
STM32通过FSMC读写CPLD的程序,CPLD挂在STM32的地址线和数据线上,将CPLD看做片外RAM的方式来进行读写,在我做的板子上CPLD挂在第四个区,因此基地址是0x6c000000,通过FSMC来进行读写,程序较为简单,具体的地方在函数中都有注释,仅供参考。 /**************************(C) COPYRIGHT emouse 2011*************************** 名称:CPLD.c 功能:配置fsmc,CPLD读写函数 作者:emouse 时间:2011.1.2 版本:1.0 注意:一定要使能RCC_AHBPeriphClockCmd
[单片机]
STM32学习笔记-Flash做为存储器储存数据
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。 自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,
[单片机]
STM32单片机学习(10) 数码管输出实验补 静态(共阳)+动态(共阴)
注:使用普中科技开发板测试时,需要拔掉Boot1插口 参考手册、电路图等参见 STM32单片机学习(1) 总记 学习资料+参考手册+LED灯 静态数码管实验 /* * * 软件功能: 静态数码管实验(软件延时方式) * */ #include stm32f10x.h #include delay.h void RCC_Configuration(void); void GPIO_Configuration(void); u8 Count=0; // 此表为 LED 的字模 0-f, . unsigned char LED7Code = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~
[单片机]
STM32 EXTI外部中断
外部中断引脚配置初始化:以PA0为例说明 1、外设端口时钟打开 RCC- APB2ENR|=1 2; //使能PORTA时钟 2、端口设置为输入 GPIOA- CRL&=0XFFFFFFF0;//PA0设置成输入 GPIOA- CRL|=0X00000008; 3、端口选择上拉/下拉方式 GPIOA- ODR&=0xFFFFFFFE; //A0默认下拉 4、中断触发方式选择 Ex_NVIC_Config(GPIO_A,0,RTIR); //上升沿触发 5、嵌套向量中断控制(抢占优先级,响应优先级,组) MY_NVIC_Init(2,2,EXTI0_IRQChannel,2); //抢占2,子优先级2,组2
[单片机]
STM32自学之串口中断模式
今天是自学STM32的第7天了,之前的流水灯,按键,查询方式串口,PWM,计数器和红外有时间再补上来吧,先从今天调试的中断式串口写起吧。 事先说明,写此博客只是为了记录自己的自学历程,由于水平极其有限,所以很多理解可能是错的,欢迎大家积极指出,让我们一起在嵌入式的开发上向前进。 我所使用的是神舟三号学习开发板,芯片型号是STM32F103ZE。功能很齐全了,作为初期自学用绰绰有余。 串口的printf在STM32程序调试过程中,确实可以起到实时跟踪程序进程的作用,但是经过昨天的红外和今天的中断式串口程序的坑爹BUG之后,深深感觉,没事还是不要加printf了,特别是在待处理事件的时间频率很高时,如昨天的红外调试时,
[单片机]
关于stm32的外部中断与事件的概念
最近在写stm32基础库的时候,发现了一个问题,就是外部中断里,有一个事件寄存器,一直没有明白是干什么用的。网上查了一下,写个总结。 主要的讲,就是在不进入到中断函数的情况下,触发其他的操作。比如,我希望在外部中断的时候,去采集ad。那么其他单片机的做法是,在中断函数中写入adc 采集。而在这里,只需要将事件寄存器置位,然后在其他外设寄存器中设置即可。这样设置,当外部中断被触发时,则可以不用在中断函数中处理adc。直接由事件来驱动adc采集。 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套.图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部
[单片机]
关于<font color='red'>stm32</font>的外部中断与事件的概念
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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