

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、嵌式单机基础篇(三)之串通信stm32F1以及单机串通信详解1、连线:如图所:我们先记住四条线,分别是电源线,地线,以及发送和接收线既然两个单机要通讯,那么个发送个接收,那么肯定是个单机的发送端连接到另个单机的接收端,就像两个说话,个嘴说,个朵听,那么话语就是其中的抽象连线2、数据的传输格式(1)核思想:就是低位先发位后发(也就是说先发低位如01234567位先发0,如果是进制数据11100100先发0)(2)数据的本质是什么?答案:电平状态如:发送个 0 xE4 这个数据,进制形式表就是 0b11100100,在 UART 通信过程中,是低位先发,位后发的原则,那么就让 TXD先拉低电平,持
2、续段时间,发送位 0,然后继续拉低,再持续段时间,发送了位 0,然后拉电平,持续段时间,发了位1直到把 8 位进制数字 0b11100100全部发送完毕。(3)数据传输格式是什么?答案:数据包每个数据包包含1个起始位,59个数据位(般是8位),可选的奇偶校验位(般不设置)和1或1.5或2个停位(般是1位),协议如下:如图:我们可以很清晰明了的看出数据包包含4种数据位类型,终结起来就是:起始数据校验停其实是和我们活中做事是样的总要有个开始和结束,然后包含事情的内容以及检查下做的事到底对不对,当然啦,现实中的事情往往复杂的多,毕竟很多事往往疾终3、数据传输的动:波特率那么波特率的作是什么?答案:其
3、实说了就是告诉单机多久发送个数据包特率是每秒钟传输进制代码的位数,单位是:位秒(bps)。在电通信领域,波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。波特率表每秒钟传送的码元符号的个数,它是对符号传输速率的种度量,它单位时间内载波调制状态改变的次数来表,1波特即指每秒传输1个符号。数据传输速率使波特率来表。单位bps(bits per second),常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例,如果串波特率设置为115200bps,那么传输个特
4、需要的时间是1/1152008.68us。有两个物理上独的接收、发送缓冲器SBUF,它们占同地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产重叠错误。SM0和SM1为作式选择位,可选择四种作式:SM2,多机通信控制位,主要于式2和式3。当接收机的SM2=1时可以利收到的RB8来控制是否激活RI(RB80时不激活RI,收到的信息丢弃;RB81时收到的数据进SBUF,并激活RI,进在中断服务中将数据从SBUF读)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通
5、信。在式0时,SM2必须是0。在式1时,如果SM2=1,则只有接收到有效停位时,RI才置1。REN,允许串接收位。由软件置REN=1,则启动串接收数据;若软件置REN=0,则禁接收。TB8,在式2或式3中,是发送数据的第九位,可以软件规定其作。可以作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在式0和式1中,该位未。RB8,在式2或式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在式1时,若SM2=0,则RB8是接收到的停位。TI,发送中断标志位。在式0时,当串发送第8位数据结束时,或在其它式,串发送停位的开始时,由内部硬件使TI置1,向CPU发中断申请
6、。在中断服务程序中,必须软件将其清0,取消此中断申请。RI,接收中断标志位。在式0时,当串接收第8位数据结束时,或在其它式,串接收停位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,软件将其清0,取消此中断申请。看起很复杂,但是实际上没有啥东西:如,我们选择式1,那么只需将sm0=0,sm1=1,记忆:01,使能位REN=1;TI和RI就是中断标志位已,我们需要做的就是软件清零已,TB8通常不SCON=0X50;这是什么意思?解析成2进制就是0000 0000 0101 0000我们主要看低8位:0101的前两个数代表式1,sm2=0,并使能,接收到的数据直接进Bu
7、ff并且使RI=1,这个时候需要我们在中断函数将标志位清0即可4.1.3 PCON功率控制寄存器中只有位SMOD与串作有关 :SMOD(PCON.7) 波特率倍增位。在串式1、式2、式3时,波特率与SMOD有关,当SMOD=1时,波特率提倍。复位时,SMOD=0。这不要想那么复杂只需要做件事情:PCON=0X80;这条语句应该可以看得懂4.1.4波特率的计算(波特率计算器)式0的波特率 = fosc/12式2的波特率 =(2SMOD/64) fosc式1的波特率 =(2SMOD/32)(T1溢出率)式3的波特率 =(2SMOD/32)(T1溢出率)T1 溢出率 = fosc /12256 (T
8、H1)在单机的应中,常的晶振频率为:12MHz和11.0592MHz。所以,选的波特率也相对固定。常的串波特率以及各参数的关系如表所。4.1.5串如何使?(1)确定串控制(编程SCON寄存器);(2)确定T1的作式(编程TMOD寄存器);TMOD=0X20;(3)计算T1的初值,装载TH1、TL1;(4)启动T1(编程TCON中的TR1位);4.1.6定时器知识点:定时器/计数器的结构定时器/计数器的实质是加1计数器(16位),由8位和低8位两个寄存器组成。TMOD是定时器/计数器的作式寄存器,确定作式和功能;TCON是控制寄存器,控制T0、T1的启动和停及设置溢出标志。定时器/计数器的作原理
9、计数器输的计数脉冲源系统的时钟振荡器输出脉冲经12分频后产;T0或T1引脚输的外部脉冲源。计数过程每来个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置每来个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器作于定时模式,则表定时时间已到;如果作于计数模式,则表计数值已满。定时应作定时器:此时设置为定时器模式,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数
10、频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t。计数运作计数器:此时设置为计数器模式,外部事件计数脉冲由T0或T1引脚输到计数器。每来个外部脉冲,计数器加1。但单机对外部脉冲有基本要求:脉冲的低电平持续时间都必须于1个机器周期。作式寄存器(TMOD)GATE:门控位。GATE=0时,只要软件使TCON中的TR0或TR1为1,就可以启动定时器/计数器作;(即需要个启动条件)GATE=1时,要软件使TR0或TR1为1,同时外部中断引脚也为电平时,才能启动定时器/计数器作,即需要两个启动条件。C/T :定时/计数模式选择位。C/T =0为定时模式;C/T =1为计数模式。M1M
11、0:作式设置位。计数器作式选择M1 M0 作 式 功 能 说 明0 0 式0 13位计数器0 1 式1 16位计数器1 0 式2 动重装8位计数器1 1 式3 定时器0:分成两个8位定时器1:停计数定时器/计数器的控制控制寄存器TCONTCON的低4位于控制外部中断,已在前介绍。TCON的4位于控制定时器/计数器的启动和中断申请。其格式如下:TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件动置TF1为1。CPU响应中断后TF1由硬件动清0。TR1(TCON.6):T1起/停控制位。1:启动 0:停TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。TR0(T
12、CON.4):T0起/停控制位。1:启动 0:停定时器/计数器的作式式0式0为13位计数,由TL0的低5位(3位未)和TH0的8位组成TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。式1式1的计数位数是16位,由TL0(TL1)作为低8位、TH0(TH1)作为8位,组成了16位加1计数器 。式2式2为动重装初值的8位计数式。式2为动重装初值的8位计数式。在式2下,当计数器计满255(FFH)溢出时,CPU动把TH 的值装TL中,不需户预。因此特别适合于作较精确的脉冲信号发器。式3式3只适于定时器/计数器T0,定时器T1式3时相当于TR1=0,停
13、计数。作式3将T0分成为两个独的8位计数器TL0和TH0 。注意:1、EA:访问外部程序存储器控制信号。2、ES:串中断允许控制位。TF1:其值位1时,表定时器T1计满溢出。TF0:其值位1时,表定时器T0计满溢出。TR1:为1是定时器T1开始计数;0时不计数。TR0:为1是定时器T0开始计数;0时不计数。IE1:当发外部中断1时其值为1。IE0:当发外部中断0时其值为1以上的知识都掌握后就可以写程序啦:4.1.7程序代码:PC和单机通信:12typedef unsigned char uchar;3456/8位重装载78/设置波特率为96009/打开通信中断/打开总中断10111213141
14、51617181920212223242526272829TR11; /打开计数器receiveData;/出去,收到的数据RI =0;/清除接收中断标志位SBUFreceiveData;/将接收到的数据放到发送寄存器while(!TI); /等待发送数据完成TI0;/清除发送完成标志位这还需要注意点是什么?也就是SBUF,如果是接收数据就从SBUF读出数据来receiveData=SBUF;如果想发送,就往SBUF写数据SBUF=receiveData;4.2 stm32F103 库函数4.2.1、简介:STM32F103ZET6 有 3 个 USART(通同步和异步收发器)+ 2 个 UA
15、RT(通异步收发器),分别是 USART1,USART2,USART3 和 UART4,UART54.2.2、USART 和 UART 有什么区别呢?当进异步通信时,这两者是没有区别的。区别在于 USART UART 多了同步通信功能,同步通信需要 STM32 提供时钟来同步。这个同步通信功能可以把 USART 当做 SPI来,如 USART 来驱动 SPI设备。我们得最多的是全双异步通信功能4.2.2.1、我们需要设置的数据有通信速率,数据字长,奇偶检验位,停位。个典 型的设置是 115200 波特率,8 位数据,奇偶校验,1 位停位。这个设置在固件函数库,我们是通过设置 USART_Ini
16、tStructure 结构体,然后调 USART_Init 函数来实现的:USART_InitStructure.USART_BaudRate = 115200;/设置通信波特率为 115200USART_InitStructure.USART_WordLength = USART_WordLength_8b; /设置通信数据格式为 8 位数据USART_InitStructure.USART_StopBits = USART_StopBits_1; /设置停位为 1 位USART_InitStructure.USART_Parity = USART_Parity_No ; /设置为奇偶校验/
17、* 设置为硬件流控制,即 CTS/RTS 控制/USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/ 设置发送使能,接收使能 */USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure); /调 USART_Init,把上的参数分别设置进 USART的控制寄存器 USART1-CR1,USART1-CR2,USART1-CR3USART_C
18、md(USART1, ENABLE); /使能串4.2.2.2、上 USART_Init 函数配置了 USART1 的数据通信格式,但串能作的前提是需要配置相应的TX,RX引脚,这个是通过GPIO_Configuration函数来配置的:void GPIO_Configuration(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /打开 USART1 时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENAB
19、LE); /打开 AFIO 时钟/* 配置 USARTx_Tx 为复推挽输出/GPIO_InitStructure.GPIO_Pin = GPIO_TxPin;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOx, &GPIO_InitStructure);/ 配置 USARTx_Rx 为输悬空 */GPIO_InitStructure.GPIO_Pin = GPIO_RxPin;GPIO_InitStructure.GPIO
20、_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOx, &GPIO_InitStructure);4.2.2.3、配置好 USART1 使的引脚,数据通信格式,下就可以收发数据了,USART_GetFlagStatus 函数可以读取收发状态等,读取状态标志可以是以下个:4.2.2.4、发送数据例:USART_SendData(USART1, a);/发送个字符 a4.2.2.5、接收数据例:u16 RxData;RxData = USART_ReceiveData(USART1); /从 USART1 接收数据到 RxData 变量FlagStatus U
21、SART_GetFlagStatus();/获取状态标志位void USART_ClearFlag();/清除状态标志位ITStatus USART_GetITStatus();/获取中断状态标志位void USART_ClearITPendingBit();/清除中断状态标志位*4.2.2.6、下是串通信 printf 程序的主要功能,上电打印串信息,把接收到的数据回显到 PC 上:/ printf 打印串信息到 PC 的超级终端或串调试软件上 /printf(nrUSART Printf Example: retarget the C library printf function to
22、the USARTnr);while (1)if(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)=SET) /判断是否有数据要接收i = USART_ReceiveData(USARTx); /接收数据printf(%cnr,i&0 xff); /回显到 PC 的超级终端或串调试软件上4.2.2.7、 printf 的实现上的 printf 是怎么实现的呢,这个是 C 标准库定义的函数,我们是怎 样把它的输出重定向到串的呢?我们知道 printf 是调 fputc 函数来打印的,所以我们只要把 fputc 函数 重定义就可以了:#define PUTCH
23、AR_PROTOTYPE int fputc(int ch, FILE f)PUTCHAR_PROTOTYPE/ 调 USARTx 发送个字符/USART_SendData(USARTx, (u8) ch);/ 等待发送完成 /while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) = RESET)return ch;另外还要加上头件#include “stdio.h”4.2.2.8、 串配置的般步骤(1)串时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();(2)串复位:USART_DeInit(); 这步不是必须的(3)
24、GPIO端模式设置:GPIO_Init();(4)串参数初始化:USART_Init();(5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)NVIC_Init();USART_ITConfig();(6)使能串:USART_Cmd();(7)编写中断处理函数:USARTx_IRQHandler();(8)串数据收发:void USART_SendData();/发送数据到串,DRuint16_t USART_ReceiveData();/接受数据,从DR读取接受到的数据(9)串传输状态获取:FlagStatus USART_GetFlagStatus(USART_TypeDef
25、 USARTx,uint16_t USART_FLAG);void USART_ClearITPendingBit(USART_TypeDeSARTx, uint16_t USART_IT);4.2.2.9、简单通信程序123456789101111121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374USART_InitTypeDef USART_InitStrue;RCC_APB2PeriphC
26、lockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,);/初始化I/O*/GPIO_InitStrue.GPIO_ModeGPIO_Mode_AF_PP;/推挽复输出GPIO_InitStrue.GPIO_PinGPIO_Pin_9;GPIO_InitStrue.GPIO_ModeGPIO_Mode_IN_FLOATING;/下拉输GPIO_InitStrue.GPIO_PinGPIO_Pin_10;GPIO_InitStrue.GPIO_SpeedGPIO_Speed_10MHz;GPIO_Init(,GPIO_InitStrue);/串初始
27、化*/USART_InitStrue.USART_BaudRate115200;/波特率USART_InitStrue.USART_WordLengthUSART_WordLength_8b; /8位数据USART_Init(USART1,USART_InitStrue);/USART_Cmd(USART1,);/使能串1USART_ITConfig(USART1,USART_IT_RXNE,);/开启接收中断设置优先级分组*/NVIC_InitStrue.NVIC_IRQChannelUSART1_IRQn; /通道为串1NVIC_InitStrue.NVIC_IRQChannelCmd;
28、/分组使能NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority1; /抢占优先级为10-3)/优先级为10-3)void USART1_IRQHandler(void) /中断服务函数u8 res;if(USART_GetITStatus(USART1,USART_IT_RXNE)/如果接收到了中断res=USART_ReceiveData(USART1); /变量接收的数据LED_Init();();=!;LED1=!LED1;USART_SendData(USART1,res); /单机将接收到的变量发送回端NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/设置优先级分组为模式2,也就是说优先级都是2位的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2031年中国硬质合金燕尾槽铣刀行业投资前景及策略咨询研究报告
- 甘肃省武威市2024届中考猜题数学试卷含解析
- 广东省广州市天河区暨南大附中2024届中考五模数学试题含解析
- 2025年厂级员工安全培训考试试题【必考】
- 2024-2025厂里厂里安全培训考试试题(B卷)
- 2025公司员工安全培训考试试题带解析答案
- 2025年部门级安全培训考试试题参考
- 2024-2025全员安全培训考试试题高清
- 2025新员工入职安全培训考试试题带答案(A卷)
- 2025年新入职工职前安全培训考试试题(打印)
- 《新大学英语·跨文化交际阅读》Values Behind Sayings
- 风电项目开发前期工作流程
- 劳动保障部《关于劳动合同制职工工龄计算问题的复函》
- 国开2023春计算机组网技术形考任务二参考答案
- 200条健康小常识
- 【玫瑰花的药理作用和研究进展4200字(论文)】
- 国家开放大学《西方经济学》章节测试(1-17)参考答案
- 油漆用量计算公式表
- 实用全面的招聘流程图
- 冷库聚氨酯发泡保温施工技术交底
- DL-T 2181-2020 高压费控装置通用技术条件
评论
0/150
提交评论