肥宅钓鱼网
当前位置: 首页 钓鱼百科

stm32f103的启动过程(串口的使用方法)

时间:2023-07-01 作者: 小编 阅读量: 1 栏目名: 钓鱼百科

通讯结构设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。

串口通讯简介:

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。

通讯结构

设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。

两个设备或者器件要想实现串口通讯,要电平匹配才能够正常通讯。

电平标准

根据使用的电平标准不同,串口通讯可分为 RS232标准及TTL标准,具体标准如下:

在电子电路中,模块之间常使用TTL的电平标准,但其抗干扰能力较弱,为了增加串口的通讯距离及抗干扰能力,使用RS-232电平标准在设备之间传输信息,经常使用MA3232芯片对TTL电平及RS-232电平进行相互转换。

协议层

1.数据包

串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。

2.波特率

由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。

3.起始和停止信号

数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。

4.有效数据

有效数据规定了主题数据的长度,一般为8或9位,其在STM32中也是通过串口初始化结构体来实现的。

5.数据校验

在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、 0 校验(space)、 1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。

串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,

其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),

4、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。

STM32比51单片机好用的一个地方就是串口比较多,51单片机一般只有2个串口,有时不够用。

下面以USART1为例,说明一下STM32串口设置的一般步骤:

1) 串口时钟使能,GPIO 时钟使能

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

2) GPIO端口设置

设置发送和接收引脚的信息,将Tx(发送引脚)配置为推挽复用模式用来发送数据,Rx(接收引脚)配置为浮空输入模式用来接收数据。

GPIO_InitTypeDef GPIO_InitStructure;//USART1_TXGPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9//USART1_RXGPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10

3)Usart1 NVIC 配置(如果需要开启中断,才进行本步骤的设置)

NVIC_InitTypeDef NVIC_InitStructure;//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能NVIC_Init(&NVIC_InitStructure);//根据指定的参数初始化NVIC寄存器//如果需要接收串口数据,则开启串口接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

4) 串口参数初始化

USART_InitTypeDef结构体,内部包含串口通讯相关工作参数:

typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字长 uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校验位 uint16_t USART_Mode; // USART 模式 uint16_t USART_HardwareFlowControl; // 硬件流控制} USART_InitTypeDef;

USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = bound;//串口波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式USART_Init(USART1, &USART_InitStructure); //初始化串口1

5) 使能串口

USART_Cmd(USART1, ENABLE);//使能串口1

6) 编写串口发送函数

//发送一个字节void USART1_Send_Byte(u8 Data){USART_GetFlagStatus(USART1, USART_FLAG_TC);USART_SendData(USART1,Data);while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );}//发送字符串,遇到字符串结尾标志'\0'结束void USART1_Send_String(u8 *Data){while(*Data)USART1_Send_Byte(*Data);}//按长度发送字符串,这种方法可以发送含0x00的字符串void USART1_Send_String_By_Lens(u8 *Data, int Len){int i;for(i=0; i<Len; i){USART_SendData(USART1, Data[i]);while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//串口1发送数据}}//重定向printf函数发送字符串,一般使用此函数直接输出打印调试信息,使用方法跟C语言中的使用方法一致。int fputc(int ch, FILE *f){USART_SendData( DEBUG_USARTx,(uint8_t) ch);/* 等待发送完毕 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);return ch;}

7) 编写中断处理函数

//串口1中断服务程序,此接收的数据是以0x0D、0x0A结尾为标志的数据帧。void USART1_IRQHandler(void){u8 Res;if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断(接收到的数据必须是0x0d 0x0a结尾){USART_ClearFlag(USART1, USART_IT_RXNE);//清除标志位Res =USART_ReceiveData(USART1);//读取接收到的数据if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0d{if(Res==0x0D)USART_RX_STA|=0x4000;else if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始elseUSART_RX_STA|=0x8000;//接收完成了}else //还没收到0X0D{if(Res==0x0d)USART_RX_STA|=0x4000;else{USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA;if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收}}}}}

接收完数据之后,在main函数中对接收到的数据进行处理。

if(USART_RX_STA&0x8000){ //得到此次接收到的数据长度,即USART_RX_BUF数组中的有效数据长度 uart1Len=USART_RX_STA&0x3f; //对接收到的数据进行数据处理,接收的数据暂存在USART_RX_BUF数组中//... ... USART_RX_STA=0; memset(USART_RX_BUF, 0, sizeof(USART_RX_BUF));//清空数组}

串口应用:

  • 与TTL串口传感器或模块直接通讯;
  • 转为RS232与PC通讯;
  • 转为RS485与485部件的传感器或器件通讯;

USB转串口的原理图:

使用CH340C芯片的话,就可以省略外部晶振了,可以节省PCB布局空间;

win7系统一般选择CH340作为USB转串口驱动,Win10系统下选择CH341驱动作为USB转串口驱动;

TTL串口转RS232原理图:

TTL串口转RS485原理图:

RS485总线一般使用时默认处于接收状态。

参考资料:

【正点原子】MiniSTM32开发板资料

喜欢请关注程序员小哈

有啥想玩的模块,留言给我,咱们一起玩

    推荐阅读
  • 周星驰经典语录桥段(周星驰经典台词)

    小时候看周星驰的电影只觉得好笑,长大后才发现电影里的台词都藏着残酷的现实。当时,阿星的五位师兄弟虽然个个身怀绝技,但却落寞不堪。阿星想劝大师兄出山,大师兄垂头丧气地劝说他放弃梦想。而饱受欺凌的何金银只会在别人欺负他的时候抓紧头上的帽子,一言不发。但尽管如此,何金银还是善良的。何金银就像黑夜里的一盏灯,发光发热照亮漆黑中的其他人。

  • 豌豆花是完全花吗 豌豆花是完全花吗图片

    豌豆花是完全花,因为它是由萼片、花瓣、雄蕊和雌蕊这四部分所组成的,而一朵花若是具备了这四点的话,那就可以将它列为完全花,否则的话,它就是不完全花。对于豌豆花来说,它属于完全花,同时也属于双性花,相对而言,豌豆花在我国境内比较常见,而且花瓣多呈现出粉红色。

  • 父亲节很简单的礼物(父亲节最好的礼物)

    看他以前的照片真帅,怪不得俘获了妈妈的芳心。这种相互关怀形成一种模式后,只要做好了,每天都是父亲节。在分享物质礼物后,安全感会得到滋润,接下来要上升到情感的需求。“聆听”是对父亲最好的尊重。聆听的过程,是要真诚看着对方,不要随意打断爸爸讲话的节奏。等爸爸说完,可以对自己没有理解或者想深入了解的地方再进行询问。

  • 怎么样做好泡芙(泡芙怎么做)

    怎么样做好泡芙面粉60克、无盐黄油50克、水1/2杯、盐1/4小勺、砂糖1小勺、鸡蛋2个。填充用奶油材料:面粉40克、砂糖50克、蛋黄4个、牛奶1杯、奶油香精数滴、鲜奶油1/2杯。外壳和填充用奶油的面粉都分别过筛2次,备用。在锅内放入黄油和水,盐,砂糖加热,并用打蛋器搅拌,黄油全部融化后,转小火加入面粉。用力搅拌大约5分钟左右,锅底有薄膜出现时关火。

  • 针锋相对策略怎么做 针锋相对策略怎么做的

    2、在博弈论中,“针锋相对策略”来自阿克塞洛德一个非常著名的实验,也被称为“以牙还牙”策略,即对方合作我就合作,对方不合作我也选择不合作,值得注意的是该策略与触发战略的最大区别在于:触发战略是若选择不合作,则永远不合作下去;而争锋相对战略则是根据对手的选择适时选择自己的策略。

  • 如何学会正确的洗脸(正确的洗脸的方法)

    据华龙网报道,冰冷的水会刺激皮肤,对皮肤的毛细血管具有破坏性。早晨用冷水洗脸虽说能够达到清醒的目的,但这对身体丝毫没有好处。经过一夜的休息,身体的器官处于衰弱状态,这时脸部的血液流动是缓慢的,用冷水洗脸会让血液流动速度更慢。当血液得不到补充时,容易让人发生晕厥的现象。一般来说,洗脸时水温在35摄氏度左右较为合适,对于皮肤具有保护作用。

  • 2月份多肉可以露养吗(多肉在2月份的时候能不能在室外养殖呢)

    接下来我们就一起去研究一下吧!2月份多肉可以露养吗2月份多肉在南方地区可以露养,北方地区不可以露养。2月份正是气温回升的时节,属于早春季节,气温不太稳定,可能会出现寒流的情况,尤其是北方地区气温起伏较大,所以不适合露养,可能会出现冻伤的情况,对于南方地区来说,早春的气温回升快,相对稳定,可以搬出室外进行露养。

  • 做人不怕山高路远是什么歌(做人不怕山高路远是哪首歌)

    做人不怕山高路远是什么歌?做人不怕山高路远是什么歌《做人不怕山高路远是什么歌》歌词:时常沉默寡言偶尔也挥舞双拳曾经稚嫩的双肩早已磨出了老茧也曾泪湿双眼人生总有苦有甜心中再多的怨言也总有梦想藏在心间做人不怕山高路远寂寞孤单也坚持着信念追求和情感都隐埋于心田只为牵挂的人担心少一点做人别怕困难艰险狂风暴雨也浇不灭信念脆弱和不堪都习惯于遮掩只为会有一天梦想能实现歌曲:不怕,作曲:孙勇,作词:东立人/卢焱

  • 光荣使命搞笑游戏名字(光荣使命搞笑好听的游戏昵称)

    光荣使命搞笑游戏名字?下面更多详细答案一起来看看吧!光荣使命搞笑游戏名字初遇四野阒然糖果味的爱恋对白情真不浪费时光南辞北酒温酒叙余生假象i彼此、請陌生眼成海却未蓝陌路明月清风暖心向阳草莓[酱]鸢尾情人可爱的疯纸神仙与妖精葬心一抹夏忧海星惡魔の承諾凉笙姑凉热情喂给风初雪净洵几番浅陌爱她伤我你有种猪仙儿野性而又干净月出彼岸雨露醉梦秋水墨凉纤纤酒巷清风奶盖七七一杯敬相逢

  • 吃了巧克力吃什么不长胖(巧克力敲好吃吃对了还能减肥呢)

    而选择可可脂和可可粉含量高的黑巧克力就能较好地解决这个难题!我们建议你选择含糖量低、可可含量在70%~85%的黑巧克力,这个含量的黑巧克力口感不错,香味浓郁,能避免我们吃进去太多的白砂糖!可可粉的逆袭可可粉和可可脂都是从一种叫做可可豆的果实里提取出来的。