STM32串口协议概念及结构体初始化详解+串口点灯+串口收发

发布者:omicron25最新更新时间:2021-12-14 来源: eefocus关键字:STM32  串口协议  串口收发 手机看文章 扫描二维码
随时随地手机看文章

一、串口通信协议简介

物理层:规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。其实就是硬件部分。


协议层:协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。其实就是软件部分。


1.RS232标准

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.USB转串口

在这里插入图片描述

3.原生的串口到串口

在这里插入图片描述

二、初始化结构体解

1.USART初始化结构体

在这里插入图片描述

2.同步时钟初始化结构体

在这里插入图片描述

3.编程时需要用到的固件库函数

在这里插入图片描述
在这里插入图片描述

三、串口点灯代码实现

1.USART .C文件

#include "bsp_usart.h"


void USART_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;


// 打开串口GPIO的时钟

DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);

// 打开串口外设的时钟

DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);


// 将USART Tx的GPIO配置为推挽复用模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);


  // 将USART Rx的GPIO配置为浮空输入模式

GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

// 配置串口的工作参数

// 配置波特率

USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

// 配置 针数据字长

USART_InitStructure.USART_WordLength = USART_WordLength_8b;

// 配置停止位

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(DEBUG_USARTx, &USART_InitStructure);

// // 串口中断优先级配置

// NVIC_Configuration();

//

// // 使能串口接收中断

// USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);

// 使能串口

USART_Cmd(DEBUG_USARTx, ENABLE);     

}


/* 发送一个字节 */

void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data)

{

USART_SendData(pUSARTx, data);

while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );

}


/* 发送两个字节的数据 */

void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data)

{

uint8_t temp_h,temp_l;

temp_h = (data&0xff00) >> 8 ;

temp_l = data&0xff;

USART_SendData(pUSARTx, temp_h);

while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );

USART_SendData(pUSARTx, temp_l);

while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );

}


/* 发送8位数据的数组 */

void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num)

{

uint8_t i;

for( i=0; i  {

Usart_SendByte(pUSARTx, array[i]);

}

while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );

}


/* 发送字符串 */

void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str)

{

uint8_t i=0;

do

  {

Usart_SendByte(pUSARTx, *(str+i));

i++;

}while(*(str+i) != '');

while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET );

}


///重定向c库函数printf到串口,重定向后可使用printf函数

int fputc(int ch, FILE *f)

{

/* 发送一个字节数据到串口 */

USART_SendData(DEBUG_USARTx, (uint8_t) ch);

/* 等待发送完毕 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);

return (ch);

}


///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数

int fgetc(FILE *f)

{

/* 等待串口输入数据 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);


return (int)USART_ReceiveData(DEBUG_USARTx);

}


2.USART.H文件

#ifndef __BSP_USART_H

#define __BSP_USART_H


#include "stm32f10x.h"

#include


#define DEBUG_USART1     1

#define DEBUG_USART2     0

#define DEBUG_USART3     0

#define DEBUG_USART4     0

#define DEBUG_USART5     0


#if DEBUG_USART1

// 串口1-USART1

#define  DEBUG_USARTx                   USART1

#define  DEBUG_USART_CLK                RCC_APB2Periph_USART1

#define  DEBUG_USART_APBxClkCmd         RCC_APB2PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200


// USART GPIO 引脚宏定义

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_9

#define  DEBUG_USART_RX_GPIO_PORT       GPIOA

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_10


#define  DEBUG_USART_IRQ                USART1_IRQn

#define  DEBUG_USART_IRQHandler         USART1_IRQHandler


#elif DEBUG_USART2

//串口2-USART2

#define  DEBUG_USARTx                   USART2

#define  DEBUG_USART_CLK                RCC_APB1Periph_USART2

#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200


// USART GPIO 引脚宏定义

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOA)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOA   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_2

#define  DEBUG_USART_RX_GPIO_PORT       GPIOA

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_3


#define  DEBUG_USART_IRQ                USART2_IRQn

#define  DEBUG_USART_IRQHandler         USART2_IRQHandler


#elif DEBUG_USART3

//串口3-USART3

#define  DEBUG_USARTx                   USART3

#define  DEBUG_USART_CLK                RCC_APB1Periph_USART3

#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200


// USART GPIO 引脚宏定义

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOB)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOB   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_RX_GPIO_PORT       GPIOB

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11


#define  DEBUG_USART_IRQ                USART3_IRQn

#define  DEBUG_USART_IRQHandler         USART3_IRQHandler


#elif DEBUG_USART4

//串口4-UART4

#define  DEBUG_USARTx                   UART4

#define  DEBUG_USART_CLK                RCC_APB1Periph_UART4

#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200


// USART GPIO 引脚宏定义

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOC   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_10

#define  DEBUG_USART_RX_GPIO_PORT       GPIOC

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11


#define  DEBUG_USART_IRQ                UART4_IRQn

#define  DEBUG_USART_IRQHandler         UART4_IRQHandler


#elif DEBUG_USART5

//串口5-UART5

#define  DEBUG_USARTx                   UART5

#define  DEBUG_USART_CLK                RCC_APB1Periph_UART5

#define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd

#define  DEBUG_USART_BAUDRATE           115200


// USART GPIO 引脚宏定义

#define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD)

#define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd

    

#define  DEBUG_USART_TX_GPIO_PORT       GPIOC   

#define  DEBUG_USART_TX_GPIO_PIN        GPIO_Pin_12

#define  DEBUG_USART_RX_GPIO_PORT       GPIOD

#define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_2


#define  DEBUG_USART_IRQ                UART5_IRQn

#define  DEBUG_USART_IRQHandler         UART5_IRQHandler


#endif


void USART_Config(void);

void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data);

void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data);

void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num);

void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str);

#endif  /* __BSP_USART_H */


3.MAIN.C


#include "stm32f10x.h"

#include "bsp_led.h"

#include "bsp_usart.h"


int main(void)

{

uint8_t ch;

USART_Config();

LED_GPIO_Config();

printf( "这是一个串口控制RGB灯的程序n" );

 

while (1)

{

ch = getchar();

  printf( "ch=%cn",ch );

switch(ch)

   {

case '1': LED_RED;

break;

 

case '2': LED_GREEN;

  break;

 

case '3': LED_BLUE;

  break;

 

default: LED_RGBOFF;

    break;

}

}

}

/*********************************************END OF FILE**********************/


四、串口收发程序代码实现

1.USART .C文件

#include "bsp_usart.h"


static void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  

  /* 嵌套向量中断控制器组选择 */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

[1] [2]
关键字:STM32  串口协议  串口收发 引用地址:STM32串口协议概念及结构体初始化详解+串口点灯+串口收发

上一篇:STM32外部中断事件控制器EXTI概念及使用方法
下一篇:STM32中断NVIC的概念及中断编程步骤

推荐阅读最新更新时间:2024-11-09 11:45

STM32按键检测之短按与长按方法
在电路设计中,我们经常需要读取外部的电平信号。比如,在项目中,我们需要通过按键来输入一些数据,那么就需要检测按键是否被按下。电平分为高电平读取和低电平读取,读取高电平,需要设置IO为下拉电阻输入模式,反之,设置IO为上拉电阻输入模式。 S4按下时,单片机IO为高电平,S1-S3按下时,为低电平。我们设置S1为上拉输入模式,S4为下拉输入模式。本节使用按键实现2个功能: S1短按一次,LED2点亮,S1再短按一次,LED2熄灭。S1长按,LED1点亮,S1再长按,LED1熄灭。这种方式可以用来实现短按调节菜单,长按保存参数。 S4短按一次,LED4点亮,S4再短按一次,LED4熄灭。S4长按且不松手,LED4闪烁。这种方式可以用
[单片机]
<font color='red'>STM32</font>按键检测之短按与长按方法
stm32学习笔记之win8系统下,keil4出现黑块的解决方法
前不久,笔者安装keil4启动会出现黑块,如图所示 当时询问了不少技术群都没有找到解决办法,并且还在百度贴吧发贴,最终都无果而终 这是当时发贴地址 http://tieba.baidu.com/p/3176578044 后来重做了个系统,才勉强能使用。直至今天又出现了同样的状况。在此之间笔者发现当keil4出现黑块,win8自带的记事本也会出现未响应状况,于是上网找解决方法,最终网友 oafaq给了我思路 这是他的原文地址 http://blog.sina.com.cn/key9928 。原来我今天更新了QQ五笔输入法,当卸载了QQ五笔之后,所有问题都解决了。这是与keil4不兼容的QQ输入法版本
[单片机]
<font color='red'>stm32</font>学习笔记之win8系统下,keil4出现黑块的解决方法
STM32 keil 下编程,各种数据类型的长度
源码: void test_str2num(void) { printf( rnrnint is %d ,sizeof(int)); printf( rnlong int is %d ,sizeof(long int)); printf( rnlong long int is %d ,sizeof(long long int)); printf( rnfloat is %d ,sizeof(float)); printf( rndouble float is %d ,sizeof(double)); printf( rnchar is %d ,sizeof(char)); printf( rnsho
[单片机]
单片机开发中的内存溢出的状况
在进行单片机开发的过程中,出现单片机内存溢出的小状况及总结: 循环遍历溢出 在初学C语言时可能会犯的错误,for循环遍历一个数组时,循环的次数超出了数组的长度。c语言编程时都要特别注意,细心。 各种string.h中的函数 string.h提供了许多方便的处理字符串的函数,像是strcpy,strcmp。但是这些函数都是用于处理字符串的,它们的参数都只给了一块内存的首地址,函数通过’’字符来判断是否到了字符串结尾。如果用这些函数处理一块不含’’的内存(或者自己代码有误没把’’写进去),就会发生内存溢出的问题。 推荐使用带n的函数,例如strncmp,memcpy,snprintf等,这样就可以配合sizeof来限制要处理的内
[单片机]
stm32---usart1与电脑通信
usart.h #ifndef _USART_H_ #define _USART_H_ #include stm32f10x.h #include stdio.h //发送一个字节 void GPIO1_Configuration(void); void USART1_Configuration(unsigned long baund); int fputc(int ch, FILE *f); #endif usart.c #include usart.h #include string.h //重定义fputc(); //printf( hello world ); int fpu
[单片机]
STM32定时器输出PWM 【自用】
PWM1输出模式配置: 1.配置IO(TIM3 PA6~7 CH1 CH2 GPIO_Mode_AF_PP复用推挽输出 50Mhz速度) /*void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; //GPIOA and GPIOB clock enable RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull GPIO_InitStructure.
[单片机]
STM32+机智云AIoT云平台实现智能鸽笼控制
本智能鸽笼控制系统由贵州大学电气工程专业的刘磊、王民慧设计开发完成,基于STM32+机智云AIoT云平台设计专为赛鸽进笼检测的装置,利用机智云平台进行数据的传输交换,通过 WiFi 模块与云端的通信,将采集到的温湿度、归巢时间、告警信号等发送到手机 APP 端,同时在鸽子归巢时通过拨打人员电话,在断网的情况下可以进行按键操作,最终以物联网控制的方式能够对赛鸽进行有效的饲养选育。 正文内容 在赛鸽养殖中,饲养者因为工作生活繁忙等原因将无法按时喂养鸽子,同时赛鸽的养殖往往需要直接接触鸽子羽毛排泄物等,卫生问题尤为突出。在优秀乳鸽的选择上,通常采用给鸽子佩戴高昂的赛鸽计时装置,此外鸽舍内的温湿度直接影响着赛鸽的健康,需要及时对
[单片机]
STM32+机智云AIoT云平台实现智能鸽笼控制
STM32 Bootloader异常复位如何解决
问题描述 客户反馈通过PC软件Flashloader不能够跟STM32 MCU自带Bootloader连接。并且系统运行一段时间后异常复位。 系统分析 检测原理图 延续之前的项目,进行的一些软硬件简单修改。 上电、放电的时序也是正常。 BOOT0 拉高,BOOT1 拉低, 测量工作时的电压正常(2.5v)。 检测所有相关的硬件软件都是没有问题,他们的BOOT脚,以及之前的PDR_ON是通过外围的FPGA单元控制,我们一开始怀疑这些上电时序,以及PDR逻辑出错。尝试让他们全部断开逻辑,测试整个上电,掉电过程都是没有什么问题。 测量波形 检测他们的串口工具 能正常在PC上发现他们的串口工具,数据的发送正常。 但是串口的到PCB
[单片机]
<font color='red'>STM32</font> Bootloader异常复位如何解决
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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