当前位置:   article > 正文

基于STM32F103C8T6的USART1串口的中断接收

stm32f103c8t6的usart1

#一、串口介绍
#二、项目所需硬件
##1.USB转串口模块
#三、项目代码

一、串口介绍

USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)
通用同步/异步串行接收/发送器

USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。

1、单工(Simplex)
单工通信只支持信号在一个方向上传输(正向或反向),任何时候不能改变信号的传输方向。

2、半双工(Half Duplex)
半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输。半双工通信实际上是一种可切换方向的单工通信。

3、全双工(Full Duplex)
全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。全双工通信是两个单工通信方式的结合,要求收发双方都有独立的接收和发送能力。

TTL电平:数字芯片的电平,单片机。(电压范围:0V~5V)
232电平:电脑串口的电平,负逻辑。(电压范围:-15V~15V)

1.USB转串口模块主要应用于电脑与其他设备的连接,使用的时候电脑需要安装电平转换芯片驱动。

USB转串口模块示意图,如图。在这里插入图片描述
2.原生串口通信主要用于设备与传感器的连接,不需要经过电平转换芯片直接用TTL电平通信,如GPS模块,串口转WIFI模块(ESP8266),蓝牙模块(HC05)
在这里插入图片描述
3.串口数据包的基本组成:起始位、有效数据位,校验位和停止位在这里插入图片描述
4.串口数据包校验位在这里插入图片描述
5.**USART:**通用同步异步收发器
在这里插入图片描述
6.USART引脚位置:

PA10/USART1_RX
PA9/USART1_TX
PA8/USART1_CLK

在这里插入图片描述
7.串口的结构体配置在这里插入图片描述
8.串口初始化函数
在这里插入图片描述
二、项目所需硬件

1、STM32F103C8T6开发板

串口的配置:
1.电源——VCC3.3V
2.接地——GND
3.输出端——TX(PA9)
4.输入端——RX(PA10)
在这里插入图片描述
2、USB转串口模块

接线配置:
1.电源:3.3V——3.3V
2.接地:GND——GND
3.输出:TXD——RX(PA10)
4.输入:RXD——TX(PA9)
在这里插入图片描述
三、项目代码

1.main.c

#include "stm32f10x.h"
#include "main.h"
#include "LED.h"
#include "usart.h"
#include "relay.h"
#include "shake.h"
#include "exti.h"

void delay(uint16_t time)//延迟函数
{
		uint16_t i=0;
	  while(time--)
		{
				i=12000;
			  while(i--);
		}
}



int  main()
{
	 usart_init();
	 LED_Init();
	 GPIO_SetBits(GPIOA, GPIO_Pin_1);
   //USART_SendData(USART1, 'O');
   //USART_SendData(USART1, 'K');	
	 //USARTSendStr(USART1,"狗崽崽的bb叫燕贤");
	
	 //printf("狗崽崽的bb叫燕贤"); 
	
	 

	 while(1)
	 {
       
		  
	 }
	
}


void USART1_IRQHandler(void)//串口1中断响应函数
{
	  char Temp;//定义一个变量
		if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断是否发生中断
		{
				Temp=USART_ReceiveData(USART1);
			  if(Temp=='O')
				{
						GPIO_ResetBits(GPIOA,GPIO_Pin_1); 
					  USARTSendStr(USART1, "LED is OK");
				
				}
				if(Temp=='C')
				{
						 GPIO_SetBits(GPIOA, GPIO_Pin_1);
					   USARTSendStr(USART1, "LED is Down");
				}
		}
}
	




  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

USART.C

#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>


void usart_init(void)//串口初始化
{
	  
		GPIO_InitTypeDef gpioinstructure;//GPIO结构体初始化函数
	  USART_InitTypeDef usartinstructure;//USART结构体初始化函数
	  NVIC_InitTypeDef  nvicinstructure;//中断控制器结构体初始化函数
	  
	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置中断控制器优先抢占级组
		
	//1.配置GPIO、USART、引脚复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置GPIOA时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置引脚复用时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART时钟
		
	//2.配置GPIO结构体
	   
    //配置PA9 TX 输出引脚
		gpioinstructure.GPIO_Mode  =  GPIO_Mode_AF_PP;//复用推挽输出
	  gpioinstructure.GPIO_Pin   =  GPIO_Pin_9 ;//引脚9
	  gpioinstructure.GPIO_Speed =  GPIO_Speed_50MHz;//速度为50Mhz
	
	  GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化
	
	  //配置PA10 RX 接收引脚
	  gpioinstructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;//浮空输出
	  gpioinstructure.GPIO_Pin   = GPIO_Pin_10;//引脚10
		
		GPIO_Init(GPIOA,&gpioinstructure);//GPIO初始化
		
	//3.配置串口的结构体
	  usartinstructure.USART_BaudRate = 115200;//波特率为115200
		usartinstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流配置
		usartinstructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx ;//接收模式
		usartinstructure.USART_Parity = USART_Parity_No;//无校验位
		usartinstructure.USART_StopBits = USART_StopBits_1;//一个停止位
		usartinstructure.USART_WordLength = USART_WordLength_8b;//有效数据位为8位
    
    USART_Init(USART1,&usartinstructure);//初始化串口1
    
    USART_Cmd(USART1,ENABLE);	//使能串口1
		
		USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//串口中断配置
		
	//4.配置中断控制器的结构
	  nvicinstructure.NVIC_IRQChannel  =  USART1_IRQn;//中断通道
		nvicinstructure.NVIC_IRQChannelCmd = ENABLE; //通道使能
		nvicinstructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级配置为1
		nvicinstructure.NVIC_IRQChannelSubPriority = 1;//子优先级配置为1
		
	  NVIC_Init(&nvicinstructure);//中断控制器初始化
			  
}


//发送字符
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data)//发送字符
{
		USART_SendData(USARTx, Data);
	  while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE)==RESET);
}


//发送字符串
void USARTSendStr(USART_TypeDef* USARTx, char *str)
{
		uint16_t i=0;
	  do
		{
			  USARTSendByte(USARTx,*(str+i));
			  i++;
		}while(*(str+i)!='\0');
		
		while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
		

}


int fputc(int ch,FILE *f)//printf函数的重映射
{
		USART_SendData(USART1,(uint8_t)ch);//发送
	  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//发送数据寄存器空标志位判断
	  
		return (ch);
	
}


int fgetc(FILE *f)//printf函数的重映射
{
		while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//接收数据寄存器非空标志位判断

    return (int)USART_ReceiveData(USART1);//返回接收到的字符
}


 




		



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110

usart.h

#include "stm32f10x.h"
#include <stdio.h>

void usart_init(void);
void USARTSendByte(USART_TypeDef* USARTx, uint16_t Data);
void USARTSendStr(USART_TypeDef* USARTx, char *str);





  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

led.c

#include "LED.h"
#include "stm32f10x.h"

void LED_Init(void)
{
	
	GPIO_InitTypeDef LED_Init;
	//1.使能ABP2的时钟GPIOA
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//2.结构体配置
	LED_Init.GPIO_Mode  = GPIO_Mode_Out_PP;
	LED_Init.GPIO_Pin   = GPIO_Pin_1;
	LED_Init.GPIO_Speed = GPIO_Speed_10MHz;
	
	GPIO_Init(GPIOA, &LED_Init);

	
	
	
	
	
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

led.h

```c
#include "stm32f10x.h"

void LED_Init(void);

  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/433237
推荐阅读
相关标签
  

闽ICP备14008679号