首页 > 其他分享 >STM32F103C8T6串口通信

STM32F103C8T6串口通信

时间:2023-07-23 16:34:19浏览次数:40  
标签:USART 串口 通信 NVIC Init STM32F103C8T6 GPIO USART1

 

首先来看一下需要操作的函数,以及配置的步骤:

          图1 

                                                图2  

Code: usart.c

#include "usart.h"
void ustart_Init(void )
{
GPIO_InitTypeDef GPIO_Init_Ustar ; // 定义输出端口TX的结构体对象
USART_InitTypeDef USTART_Init; // 定义串口初始化结构体对象
NVIC_InitTypeDef NVIC_InitStructure; // 定义中断优先级组结构体对象
//配置中断优先级,以及中断的模式
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 ); //中断组选择器,也就是中断组的模式的配置,此处选择中断组2
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn ; // 设置中断的模式,串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1; //设置主优先级,首先比较主,如果主优先级相同,再进行比较子优先级,如果前面的两者都相同在比较中断号,具体可以参考图2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; // 设置子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE ; //中断使能,也就是打开中断的意思
NVIC_Init(&NVIC_InitStructure); // 初始化中断寄存器结构体
/* 配置输出端口结构体配置及其初始化*/
RCC_APB2PeriphClockCmd( GPIO_USTAR_CLK , ENABLE ) ;// 打开GPIO时钟
GPIO_Init_Ustar.GPIO_Pin= GPIO_USTAR_TX_PIN ; // 设置输出端口
GPIO_Init_Ustar.GPIO_Speed=GPIO_Speed_50MHz; // 配置输出的速度
GPIO_Init_Ustar.GPIO_Mode= GPIO_Mode_AF_PP; // 设置串口模式,设置为推挽输出
GPIO_Init(GPIO_USTAR_PORT , & GPIO_Init_Ustar); // 初始化输出端口的结构体
/* 配置输入端口结构体配置及其初始化*/
GPIO_Init_Ustar.GPIO_Pin= GPIO_USTAR_RX_PIN ; // 设置输出端口
GPIO_Init_Ustar.GPIO_Mode=GPIO_Mode_IN_FLOATING; // 设置串口模式,设置为浮空输入
GPIO_Init(GPIO_USTAR_PORT , & GPIO_Init_Ustar); // 初始化输出端口的结构体
//配置串口初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE ); // 打开串口时钟
USTART_Init.USART_BaudRate= USART_BaudRate1 ; //配置传输的波特率
USTART_Init.USART_HardwareFlowControl=USART_HardwareFlowControl_None ; //配置硬件流,通常采用无流的方式进行
USTART_Init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx ; // 设置是否启用传输或者是接收模式,此处配置的是既可以接收,又可以发送
USTART_Init.USART_Parity=DISABLE; // 是否打开校验位,此处不进行校验
USTART_Init.USART_StopBits=USART_StopBits_1 ; //配置停止位
USTART_Init.USART_WordLength= USART_WordLength_8b ; // 配置长度
USART_Init(USART1,&USTART_Init); //通过定义的结构体初始化串口一

// 使能串口,注意串口进行了初始化需要进行使能,如果没有进行使能那么将无法进行使用
USART_Cmd(USART1,ENABLE );
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE) ; // 溢出中断标志,这里一旦打开,当发生溢出时候,将回去执行中断服务函数,否则将不会执行中断服务函数
/* 注意这里的中断函数在stm32启动文件中,不能自己随意为中断函数命名,需要自己去查找函数名称,进行编写是实现。注意函数名称在启动文件中,
一定不要自己随便取函数名,这样发生中断的时候,也不会执行,所以程序竟会陷入死循环,并且没有任何的现象*/


/*发送字符串的函数*/
}
void usart_TX_String(uint8_t *str){

while(*str!='\0') // 取出指针中的内容并进行判断
{
USART_SendData(USART1 ,*str); // 发送一个数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); // 判断发送数据是否结束,也就是相当于51单片机中的TI发送结束标志位
str=str+1; // 注意这里的指针的偏移只是偏移一个字符的所占的空间的大小。所以不能使用str++,因为这样偏移的是一个指针整体的大小。

}
}

Code: usart.h

#ifndef _USART_H_
#define _USART_H_
#include "stm32f10x.h"
// GOPIO端口宏定义
#define GPIO_USTAR_PORT GPIOA // 定义寄存器
#define GPIO_USTAR_TX_PIN GPIO_Pin_9 // 定义输出端口
#define GPIO_USTAR_RX_PIN GPIO_Pin_10 // 定义输入端口
#define GPIO_USTAR_CLK RCC_APB2Periph_GPIOA // 定义GPIO端口时钟
//串口配置
#define USART_BaudRate1 9600 //设置串口的波特率
void ustart_Init(void ) ; // 串口初始化函数声明
void usart_TX_String(uint8_t *str); // 发送一个字符串的函数申明

//注意;这里不是变量的定义,这里是申明,使用的extern进行变量的申明,格式和定义的格式必须相同,只是多一个关键子extern
extern uint8_t Buf[200]; //定义一个八位的数组,每一个数组元素都是一个字节大小,数组的总长为200
extern uint16_t REC_STA; //用于接收计数,状态标志,这里是一个16位变量,最大位#0xFFFF
#endif

void SysTick_Handler(void)
{
}

判断数据发送是否完毕可以判断: TXE 、 TC 位都可以

判断数据是否接收到数据可以使用RXNE进行判断

Code: 中断处理函数:需要注意这里的函数名称不能自己随意命名:startup_stm32f10x_hd.s中查找对应的串口的函数名称。

 

void USART1_IRQHandler(void) {
uint8_t data=0; //接收数据临时变量
if( USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
{
data= USART_ReceiveData(USART1) ; //接收一个字节数据
USART_SendData(USART1,data);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
}

运行结果:

 

标签:USART,串口,通信,NVIC,Init,STM32F103C8T6,GPIO,USART1
From: https://www.cnblogs.com/Nic-zhang/p/17575151.html

相关文章

  • dockercompose 容器服务之间通信
    DockerCompose容器服务之间通信DockerCompose是一个用于定义和运行多容器Docker应用程序的工具。通过DockerCompose,我们可以使用YAML文件来定义多个容器的配置和连接方式。在DockerCompose中,容器之间的通信非常重要,因为它们可能需要相互协作来完成复杂的任务。在本......
  • ubuntu上virtualbox主机和客户机共享物理串口
    本人电脑上安装的时ubuntu22.04系统,使用virtualbox的虚拟机里面安装了一个Win10。但由于工作关系,某些Win10下的工具需要使用主机上的物理串口。这时有两个办法:1、在vbox里直接把物理串口分配给Win10,设置如下图所示这里的路径/地址添加的是串口的设备对应的设备路径只要这样设......
  • java实现Modbus通信
    使用Java实现Modbus通信简介Modbus是一种通信协议,用于在工业自动化领域中不同设备之间进行数据通信。它是一种简单、可靠的通信协议,常用于监控和控制设备之间的通信。在Java中,我们可以使用第三方库来实现Modbus通信。本文将介绍如何使用j2mod库来实现ModbusTCP通信。准备工作......
  • SQL Server 的网络通信机制
    问题我试图了解SQLServer如何在网络上进行通信,因为我必须告诉我的网络团队在防火墙上打开哪些端口,以便边缘Web服务器与内部的SQLServer进行通信。我需要知道什么? 解决方案为了了解需要在哪里打开什么,我们首先简单谈谈当今常用的两个主要协议:TCP-传输控制协议UDP......
  • JVAA springboot 项目启动后,localhost加端口可以访问,但是外网IP不行// OCPP KYOHOON
     现象javaspringboot项目启动后,localhost(或127.0.0.1)加端口可以访问,但是使用外网IP却无法访问。   原因及解决方法springboot的配置文件(yml或properties)中缺少server.address的设置。解决方法:在springboot的配置文件中增加server.address的配置。yml配......
  • tivation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
    困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们!之前的求助帖,无人应答:http://www.cnblogs.com/freeton/archive/2012/08/28/2660585.htmlhttp://bbs.csdn.net/topics/391988642症状日志中大量报错,IIS严重错误,此类错误默认情况下5分钟连续出现5次会......
  • unity与python通信
    Unity与Python通信Unity是一款功能强大的游戏开发引擎,而Python是一种简单易学的编程语言。将这两者结合起来可以实现更多有趣的功能。本文将介绍如何在Unity中与Python进行通信,并提供代码示例。Unity端设置首先,在Unity中需要安装Python插件。可从UnityAssetStore中下载并导入"......
  • 网络通信协议设计
    《网络通信协议》1.背景  在计算机体系中,存在着很多的网络通信协议;通信协议的实际上就是一段数据,通信双方按照提前约定的规则去进行编码解码,达到传输数据的目的;例如,TCP/IP是目前计算机设备最常用的通信协议;TCP/IP实际上是一个协议族,包含一组协议,其中靠近应用层且最常用的......
  • 串口AT与数据的混杂接收处理
    linux串口AT与数据的混杂接收处理;fdcom_rs232为串口句柄conf.rs232.baudrate为实际使用的波特率buf_rs232为串口数据缓存数组buf_rs232_len为串口数据缓存实际长度LOG_ERROR为自定义错误打印宏voidrecv_at_rs232(void){ charbuf[1024];//根据实际需要分配大小 intl......
  • m基于扩频解扩+LDPC编译码的通信链路matlab误码率仿真,调制对比QPSK,16QAM,64QAM,扩频
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要      在现代通信系统中,扩频技术被广泛应用于数字通信链路中。扩频技术通过将要传输的信息序列与一个宽带的伪随机码序列进行卷积,将原始信号转换成一个具有更大带宽的扩频信号。在接收端......