stm32串口

1. 串口概述

通信的总线。UART串口属于异步串行全双工总线。

1.1 串口连接方式

 

1.2 串口的通信协议

空闲态为高电平

起始位为低电平,表示开始

数据位可以设置,一般设置为8位

校验位有奇校验和偶校验,奇校验根据数据位中的1的个数,如果为奇数,校验位补0

如果为偶数,校验位补1。偶校验根据1的个数,如果为奇数,校验位为1,如果为偶数

校验位补0;

停止位为低电平。

校验位可以选择不校验。 

2. 板子上的电路图串口

 

3. 数据手册分析

3.1 gpio

3.2  uart

 

 

 

串口的发送

串口的发送

 、

串口波特率的公式,可知BRR寄存器设置为USARTDIV的值。

那么只要知道这个值,就可以设置成想要的波特率了 

分析到这里,下边我们开始写代码

3. 代码实例

uart.c

#include "uart.h"

void Uart_Init()
{
	//1创建gpio还有uart的初始化结构体
	GPIO_InitTypeDef txinit; //pa9;
	GPIO_InitTypeDef rxinit; //pa10
	USART_InitTypeDef uart_init;
	NVIC_InitTypeDef nvic_Init;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	//2时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//gpio时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//复用功能使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能
	//3gpio初始化
	txinit.GPIO_Mode = GPIO_Mode_AF_PP;
	txinit.GPIO_Pin = GPIO_Pin_9;
	txinit.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &txinit);
	rxinit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	rxinit.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOA, &rxinit);
	//4uart初始化
	uart_init.USART_BaudRate = 115200;
	uart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	uart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	uart_init.USART_Parity = USART_Parity_No ;
	uart_init.USART_StopBits = USART_StopBits_1;
	uart_init.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1, &uart_init);
	USART_Cmd(USART1, ENABLE);
	USART_ITConfig( USART1,  USART_IT_RXNE, ENABLE);
	//中断初始化
	nvic_Init.NVIC_IRQChannel = USART1_IRQn;

	nvic_Init.NVIC_IRQChannelPreemptionPriority = 0;
	nvic_Init.NVIC_IRQChannelSubPriority = 1;
	nvic_Init.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&nvic_Init);
	
}
void sendstr(uint8_t *str)
{
	int i = 0;
	while(i < 128)
	{
		
		USART_SendData(USART1, str[i]);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
		if(str[i] == '\0')
		{
			break;
		}
		i++;
	}
	USART_SendData(USART1, '\n');
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	USART_SendData(USART1, '\r');
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
}

main.c

int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t)ch);
	while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
	return (ch);
}
uint8_t str[128];
int  main()
{


	 
	uint8_t ch;
		 
	 LED_Init();
	 Key_Init();
	 //beap_Init();
	 Relay_Init();
	 Shake_Init();
	 Exti_Init();
	 Uart_Init();
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
		GPIO_SetBits(GPIOB, GPIO_Pin_7);
		//strcpy((char *)str,"hello world!");
	
   while(1)
	 {

			//sendstr(str);
		 
			//printf("hello\r\n");
		 //while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
		// str[i] = USART_ReceiveData(USART1);
		 //i++;
		 //USART_SendData(USART1, ch);
		 //while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
			delay(500);
			//USART_SendData(USART1, 'o');
			//while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
			//delay(500);
		 
		 
	 }
		 
   
}

void EXTI1_IRQHandler(void)
{
	if(EXTI_GetFlagStatus(EXTI_Line1) != RESET)//判断是否发生中断
	{
			GPIO_ResetBits(GPIOB, GPIO_Pin_7);
			delay(1000);
			GPIO_SetBits(GPIOB, GPIO_Pin_7);
			
	}
	EXTI_ClearFlag(EXTI_Line1);
}

void USART1_IRQHandler(void){
	char ch;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
			
			str[i] = USART_ReceiveData(USART1);
		
		
			i++;
			if(i == 3)
			{	
				i = 0;
				if(strcmp((char *)str,"off") == 0)
				{
				GPIO_ResetBits(GPIOA, GPIO_Pin_1);
				delay(1000);
				GPIO_SetBits(GPIOA, GPIO_Pin_1);
			
				}
			}
		}
	
	
	
}

串口是串行接口(serialport)的简称,也称为串行通信接口或COM接口。串口通信是指采用串行通信协议(serialcommunicaTIon)在一条信号线上将数据一个比特一个比特地逐进行传输的通信模式。串口按电气标准及协议来划分,包括RS-232-C、RS-422、RS485等。串行通信在串行通信中,数据在1宽的单条线路上进行传输,一个字节的数据要分为8次,由低到高按顺序一的进行传送。串行通信的数据是逐传输的,发送方发送的每一都具有固定的时间间隔,这就要求接收方也要按照发送方同样的时间间隔来接收每一。不仅如此,接收方还必须能够确定一个信息组的开始和结束。常用的两种基本串行通信方式包括同步通信和异步通信。1、串行同步通信同步通信(SYNC:synchronousdatacommunicaTIon)是指在约定的通信速率下,发送端和接收端的时钟信号频率和相始终保持一致(同步),这样就保证了通信双方在发送和接收数据时具有完全一致的定时关系。同步通信把许多字符组成一个信息组(信息帧),每帧的开始用同步字符来指示,一次通信只传送一帧信息。在传输数据的同时还需要传输时钟信号,以便接收方可以用时针信号来确定每个信息。同步通信的优点是传送信息的数几乎不受限制,一次通信传输的数据有几十到几千个字节,通信效率较高。同步通信的缺点是要求在通信中始终保持精确的同步时钟,即发送时钟和接收时钟要严格的同步(常用的做法是两个设备使用同一个时钟源)。在后续的串口通信与编程中将只讨论异步通信方式,所以在这里就不对同步通信做过多的赘述了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值