国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置

這篇具有很好參考價值的文章主要介紹了STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、硬件介紹

正點原子戰(zhàn)艦開發(fā)板
STM32F103ZET6有5個串口,查看引腳圖可以找到對應的IO口分別如下

串口 USART1 USART2 USART3 UART4 UART5 輸入/輸出方式
USARTx_TX PA9 PA2 PB10 PC10 PC12 復用推挽輸出
USARTx_RX PA10 PA3 PB11 PC11 PD2 浮空輸入

USART1掛在APB2下
USART2,USART3,USART4,USART5掛在APB1下

一、實現(xiàn)目的

串口調(diào)試助手設置波特率設置115200,停止位1,數(shù)據(jù)為8,校驗位None,以十六進制顯示和發(fā)送。不勾選DTR和RTS。
按下KEY0,串口調(diào)試助手接收到十六進制下的41
以十六進制發(fā)送5a a5,開發(fā)板上的LED0/LED1均點亮

三、代碼簡介

3.1 公共的LED和按鍵等外設代碼

因為涉及到LED和KEY,所以包含led.h、led.c、key.hled.c如下

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5	
void LED_Init(void);//初始化	 				    
#endif
#include "led.h"
void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);	 //使能PB,PE端口時鐘
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽輸出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度為50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);					 //根據(jù)設定參數(shù)初始化GPIOB.5
 GPIO_SetBits(GPIOB,GPIO_Pin_5);						 //PB.5 輸出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	    		 //LED1-->PE.5 端口配置, 推挽輸出
 GPIO_Init(GPIOE, &GPIO_InitStructure);	  				 //推挽輸出 ,IO口速度為50MHz
 GPIO_SetBits(GPIOE,GPIO_Pin_5); 						 //PE.5 輸出高 
}
#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//讀取按鍵0
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//讀取按鍵1
#define KEY2  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)//讀取按鍵2 
#define WK_UP   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//讀取按鍵3(WK_UP) 
void KEY_Init(void);//IO初始化					    
#endif
#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE時鐘

	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設置成上拉輸入
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
	
	//初始化 WK_UP-->GPIOA.0	  下拉輸入
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0設置成輸入,默認下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
}

3.2 五個串口的代碼配置

3.2.1 串口一:USART1

包含usart.h、usart.c

#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "sys.h" 
#define USART_REC_LEN  		200  	//定義最大接收字節(jié)數(shù) 200
	  	
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收緩沖,最大USART_REC_LEN個字節(jié).末字節(jié)為換行符 
extern u16 USART_RX_STA;         		//接收狀態(tài)標記	
//如果想串口中斷接收,請不要注釋以下宏定義
void uart_init(u32 bound);
#endif
#include "sys.h"
#include "usart.h"	  

/*使用microLib的方法重寫printf函數(shù)*/
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	   
  return ch;
}
int GetKey (void)  
{ 
	while (!(USART1->SR & USART_FLAG_RXNE));
	return ((int)(USART1->DR & 0x1FF));
}
   	
u8 USART_RX_BUF[USART_REC_LEN];//接收緩沖,最大USART_REC_LEN個字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標記	  
void uart_init(u32 bound)
{
	//GPIO端口設置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA時鐘
	
	
	//USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

	//USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  


	//USART 初始化設置
	USART_DeInit(USART1); //復位串口1
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  USART_Init(USART1, &USART_InitStructure); //初始化串口1	

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

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

void USART1_IRQHandler(void)                	//串口1中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(USART1);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_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;//接收數(shù)據(jù)錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
} 

3.2.2串口二:USART2

usart.h和串口1是一樣的、
usart.c需要改成串口2的配置
下面的串口3.4.5也是一樣的,只需要更改usart.c即可

#include "sys.h"
#include "usart.h"	  

/*使用microLib的方法重寫printf函數(shù)*/
int fputc(int ch, FILE *f)
{
	USART_SendData(USART2, (uint8_t) ch);
	while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}	   
  return ch;
}
int GetKey (void)  
{ 
	while (!(USART2->SR & USART_FLAG_RXNE));
	return ((int)(USART2->DR & 0x1FF));
}
 
u8 USART_RX_BUF[USART_REC_LEN];//接收緩沖,最大USART_REC_LEN個字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標記	  
void uart_init(u32 bound)
{
	//GPIO端口設置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART2,GPIOA時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//使能USART2時鐘
	
	//USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2

	//USART1_RX	  GPIOA.3初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3  


	//USART 初始化設置
	USART_DeInit(USART2); //復位串口2
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  USART_Init(USART2, &USART_InitStructure); //初始化串口2	

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

  USART_Cmd(USART2, ENABLE);                    //使能串口2 
}

void USART2_IRQHandler(void)                	//串口2中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(USART2);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_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;//接收數(shù)據(jù)錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
} 

3.2.3串口三:USART3

#include "sys.h"
#include "usart.h"	  

/*使用microLib的方法重寫printf函數(shù)*/
int fputc(int ch, FILE *f)
{
	USART_SendData(USART3, (uint8_t) ch);
	while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) {}	   
  return ch;
}
int GetKey (void)  
{ 
	while (!(USART3->SR & USART_FLAG_RXNE));
	return ((int)(USART3->DR & 0x1FF));
}
 	
u8 USART_RX_BUF[USART_REC_LEN];//接收緩沖,最大USART_REC_LEN個字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標記	 

void uart_init(u32 bound)
{
	//GPIO端口設置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能GPIOB時鐘
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//使能AFIO復用時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART3時鐘
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10_USART3_TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PB11_USART3_RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.11


	//USART 初始化設置
	USART_DeInit(USART3); //復位串口1
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  USART_Init(USART3, &USART_InitStructure); //初始化串口1	

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口1中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器

  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

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

void USART3_IRQHandler(void)                	//串口1中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(USART3);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_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;//接收數(shù)據(jù)錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
} 

3.2.4 串口四:UART4

#include "sys.h"
#include "usart.h"	  

/*使用microLib的方法重寫printf函數(shù)*/
int fputc(int ch, FILE *f)
{
	USART_SendData(UART4, (uint8_t) ch);
	while (USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET) {}	   
  return ch;
}
int GetKey (void)  
{ 
	while (!(UART4->SR & USART_FLAG_RXNE));
	return ((int)(UART4->DR & 0x1FF));
}
 	
u8 USART_RX_BUF[USART_REC_LEN];//接收緩沖,最大USART_REC_LEN個字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標記	 

void uart_init(u32 bound)
{
	//GPIO端口設置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	//使能GPIOC時鐘
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//使能AFIO復用時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);	//使能UART4時鐘
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PC10
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC10

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PC11
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC11


	//USART 初始化設置
	USART_DeInit(UART4); //復位串口4
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  USART_Init(UART4, &USART_InitStructure); //初始化串口1	

	//Uart4 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;//串口4中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器

  USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

  USART_Cmd(UART4, ENABLE);                    //使能串口4 
}

void UART4_IRQHandler(void)                	//串口1中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(UART4);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_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;//接收數(shù)據(jù)錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
} 

3.2.5 串口五:UART5

#include "sys.h"
#include "usart.h"	  

/*使用microLib的方法重寫printf函數(shù)*/
int fputc(int ch, FILE *f)
{
	USART_SendData(UART5, (uint8_t) ch);
	while (USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET) {}	   
  return ch;
}
int GetKey (void)  
{ 
	while (!(UART5->SR & USART_FLAG_RXNE));
	return ((int)(UART5->DR & 0x1FF));
}
 	
u8 USART_RX_BUF[USART_REC_LEN];//接收緩沖,最大USART_REC_LEN個字節(jié).
u16 USART_RX_STA=0;       //接收狀態(tài)標記	 

void uart_init(u32 bound)
{
	//GPIO端口設置
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);	//使能GPIOC/GPIOD時鐘
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//使能AFIO復用時鐘
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);	//使能UART5時鐘
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PC12
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//傳輸速度50MHZ
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出
	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC10

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PD2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
	GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOC11


	//USART 初始化設置
	USART_DeInit(UART5); //復位串口5
	USART_InitStructure.USART_BaudRate = bound;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數(shù)據(jù)格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數(shù)據(jù)流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發(fā)模式
  USART_Init(UART5, &USART_InitStructure); //初始化串口5	

	//Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;//串口5中斷
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優(yōu)先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據(jù)指定的參數(shù)初始化VIC寄存器

  USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);//開啟串口接受中斷

  USART_Cmd(UART5, ENABLE);                    //使能串口5
}

void UART5_IRQHandler(void)                	//串口5中斷服務程序
{
	u8 Res;
	if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結尾)
		{
		Res =USART_ReceiveData(UART5);	//讀取接收到的數(shù)據(jù)
		
		if((USART_RX_STA&0x8000)==0)//接收未完成
			{
			if(USART_RX_STA&0x4000)//接收到了0x0d
				{
				if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
				else USART_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;//接收數(shù)據(jù)錯誤,重新開始接收	  
					}		 
				}
			}   		 
     } 
} 

四、實驗現(xiàn)象

還需要增加main.c主函數(shù)

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
 int main(void)
 {		 
	u16 len;	
	delay_init();	    	 //延時函數(shù)初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
	uart_init(115200);	 //串口初始化為115200
 	LED_Init();			     //LED端口初始化
	KEY_Init();
 	while(1)
	{
		if(USART_RX_STA&0x8000)
		{					   
			len=USART_RX_STA&0x3fff;//得到此次接收到的數(shù)據(jù)長度
			if((USART_RX_BUF[0]==0x5a)&&(USART_RX_BUF[len-1]==0xa5))
			{
				LED0=0;
				LED1=0;
			}			
				USART_RX_STA=0;
		}
		if(KEY0==0)
		{
			delay_ms(10);//消抖
			if(KEY0==0)
			{				//按鍵按下
				printf("A");
			}
		}
		delay_ms(2000);
	}	 
 }

1.開機兩個LED都是熄滅狀態(tài),按照圖一配置串口調(diào)試助手,發(fā)送數(shù)據(jù)后,可以看到開發(fā)板上兩個led均點亮
2.按下圖三圈起來的KEY0,可以看到串口調(diào)試助手收到16進制的41

STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置圖1
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置圖2
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置圖3
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置圖4

五、注意事項

1、重寫printf函數(shù),需要keil里面將Use MircroLIB勾選上。
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置

2、注意串口1-5的命名差異,前三個都是USART、后兩個是UART
3、USART_TX配置為復用推挽輸出、USART_RX設置為浮空輸入
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置

4、關于時鐘的配置,
USART2 USART3 UART4 UART5掛在APB1下
AFIO、GPIOA-GPIOF、USART1掛在APB2下

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能GPIOA時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//使能GPIOB時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	//使能GPIOC時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);	//使能GPIOD時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	//使能AFIO復用時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//使能USART1時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//使能USART2時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);	//使能USART3時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);	//使能UART4時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);	//使能UART5時鐘

5、關于RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE)在配置五個串口的時候,可以不加,不影響使用。加上也可以。
6、串口中斷服務函數(shù)的命名不能寫錯

void USART1_IRQHandler(void)    //串口1中斷服務程序
void USART2_IRQHandler(void)    //串口2中斷服務程序
void USART3_IRQHandler(void)    //串口3中斷服務程序
void UART4_IRQHandler(void)     //串口4中斷服務程序
void UART5_IRQHandler(void)     //串口5中斷服務程序

7.usart.c里面需要修改的串口位置如下圖
STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置文章來源地址http://www.zghlxwxcb.cn/news/detail-437877.html

到了這里,關于STM32F103ZET6【標準庫函數(shù)開發(fā)】------04五個串口的詳細配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 矩陣鍵盤之門鎖小項目(stm32f103zet6)

    矩陣鍵盤之門鎖小項目(stm32f103zet6)

    今天,給大家分享的是自己弄著玩的一個矩陣鍵盤控制控制舵機模擬一個智能門鎖的功能。 用到的硬件: 開發(fā)板我用的是原子哥的精英板(殺雞用宰牛刀了)。 矩陣鍵盤(寶上十幾塊買的): 外加一個舵機和一個0.96的oled顯示屏。 矩陣鍵盤: 有VCC,GND,SCL,SDO四條線,這個矩陣鍵

    2024年02月10日
    瀏覽(22)
  • AD7606與STM32F103ZET6的串行通信

    AD7606與STM32F103ZET6的串行通信

    ??本文是AD7606與STM32的串行通信的學習心得,可幫助你快速入門AD7606。 ??圖一 ??圖二 ??圖三 ??圖四 ??根據(jù)圖一,一些引腳在置高或置低時的上升或下降沿會受時間影響,因此在編寫代碼時,一些對引腳的操作需要放在一起,且延時函數(shù)不能隨意使用。 ??圖

    2024年02月08日
    瀏覽(32)
  • 用正點原子STM32F103ZET6精英板控制舵機轉(zhuǎn)動實驗保姆教程

    用正點原子STM32F103ZET6精英板控制舵機轉(zhuǎn)動實驗保姆教程

    正點原子精英板一塊 Jlink4線SWD下載線一根 精英板usb供電/下載線一根(負責給開發(fā)板供電) SG90舵機一個(三線:其中紅線接5V電壓,棕線接GED,橙黃色為信號線接開發(fā)板PB5引腳,舵機所給為3pin杜邦線母頭,可用單根杜邦線(一頭子一頭母)將舵機線飛開接到精英板上)。 以

    2023年04月15日
    瀏覽(90)
  • STM32F103ZET6 封裝 LQFP-144 ST意法 單片機芯片

    STM32F103ZET6 封裝 LQFP-144 ST意法 單片機芯片

    STM32F103ZET6 是意法半導體(STMicroelectronics)生產(chǎn)的一款基于 ARM Cortex-M3 內(nèi)核的 32 位微控制器。它具有高性能、低功耗的特點,廣泛應用于各種嵌入式系統(tǒng)和工業(yè)應用中。STM32F103ZET6 的主要特點如下: 內(nèi)核:ARM Cortex-M3,工作頻率最高可達 72MHz。 存儲器:64KB SRAM,512KB FLASH。 外

    2024年04月22日
    瀏覽(28)
  • STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉(zhuǎn)換

    STM32---stm32f103c8t6與stm32f103zet6之間的代碼移植轉(zhuǎn)換

    目錄 一、將c8t6轉(zhuǎn)換為zet6 1、修改啟動文件 2、修改芯片 3、將MD修改為HD ?4、下載器的修改 5、修改完成,編譯成功 ?二、將zet6轉(zhuǎn)換為c8t6 最終結果如下:? ?將STM32F103C8改為STM32F103ZE ? 基本相同,反向即可。 ? ?

    2024年02月06日
    瀏覽(46)
  • MDK Keil5 創(chuàng)建Stm32工程-理論篇(這里以Stm32F103Zet6為例)

    MDK Keil5 創(chuàng)建Stm32工程-理論篇(這里以Stm32F103Zet6為例)

    整個工程可以粗略的劃分為幾個文件夾: BSP 底層驅(qū)動比如GPIOTimer等驅(qū)動文件 CMSIS 內(nèi)核相關的文件 Firmware 生成的固件下載文件 Mycode 用戶編寫的相關文件,主要編寫的文件都在這個文件夾里 Project 工程文件 startup 芯片啟動文件 STM32F10x_FWLib 標準庫文件 USER 主函數(shù)等文件 readm

    2023年04月24日
    瀏覽(95)
  • 【LVGL】STM32F103ZET6——LVGL_GUI_GUIDER移植過程成功

    【LVGL】STM32F103ZET6——LVGL_GUI_GUIDER移植過程成功

    STM32F103ZET6——LVGL_GUI_GUIDER移植過程 STM32F103ZET6——LVGL_GUI_GUIDER移植過程 使用工具: 1.LVGL庫8.02 2.GUI_GUIDER 3.keil5 設計出來的總體是這樣 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 這部分有很多大佬已經(jīng)寫的很成熟了,我就不贅述了 安裝包在這里硬件資源 右上角可將

    2024年02月12日
    瀏覽(58)
  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模塊驅(qū)動LCD屏(基于正點原子歷程)

    基于STM32F103ZET6使用STM32CubeMX配置FSMC模塊驅(qū)動LCD屏(基于正點原子歷程)

    在學習STM32的過程中,剛好學到了LCD屏,我使用的是STM32F103ZET6,屏幕是正點原子的。但是在我自己新建工程點亮顯示LCD屏時遇到了很多問題。解決之后分享在此,希望能幫助到遇到此困惑的朋友。 想要快速驅(qū)動LCD屏請直接跳轉(zhuǎn)到CubeMX配置 FSMC全名叫可變靜態(tài)存儲控制器(Fle

    2024年02月15日
    瀏覽(50)
  • STM32F103ZET6 GPIO工作模式介紹+使用寄存器點亮第一個LED燈

    STM32F103ZET6 GPIO工作模式介紹+使用寄存器點亮第一個LED燈

    目錄 ?GPIO的工作模式介紹 1.輸入模式(模擬、上拉、下拉、浮空) 2.輸出模式(推挽/開漏) 3.復用功能(推挽/開漏) 4.模擬輸入輸出(上下拉無影響) 如何使用寄存器點亮第一個LED燈 ? ? ? ? 在輸入模式時,施密特觸發(fā)器打開,輸出被禁止??赏ㄟ^輸入數(shù)據(jù)寄存器 GPIOx_

    2024年02月06日
    瀏覽(91)
  • 基于STM32F103ZET6單片機驅(qū)動SM16306SJ控制8個LED燈的系統(tǒng)設計

    基于STM32F103ZET6單片機驅(qū)動SM16306SJ控制8個LED燈的系統(tǒng)設計

    1.設計要求:使用stm32f103zet6精英開發(fā)板? 采用SM16306SJ驅(qū)動8個LED燈。 2.原理圖 3.代碼 4.實物效果圖 備注:1 硬件上有一個LED燈壞了,所以才亮了7個LED燈 ???????????2 一個SM16306SJ最多可以驅(qū)動16個LED燈 ???????????3 SM16306SJ跟MBI5020程序通用

    2024年04月17日
    瀏覽(132)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包