STM32串口通信-代碼實現


代碼實現

功能實現:與上位機進行通信

宏定義需要的GPIO

//頭文件中的引腳 宏定義
#ifndef _USART_H
#define _USART_H

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

// 串口1-USART1
//#define  USART1                   USART1
#define  USART1_CLK                RCC_APB2Periph_USART1
#define  USART1_APBxClkCmd         RCC_APB2PeriphClockCmd
#define  USART1_BAUDRATE           115200

// USART GPIO 引腳宏定義
#define  USART1_GPIO_CLK           (RCC_APB2Periph_GPIOA)
#define  USART1_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd
    
#define  USART1_TX_GPIO_PORT       GPIOA   
#define  USART1_TX_GPIO_PIN        GPIO_Pin_9
#define  USART1_RX_GPIO_PORT       GPIOA
#define  USART1_RX_GPIO_PIN        GPIO_Pin_10

#define  USART1_IRQ                USART1_IRQn
#define  USART1_IRQHandler         USART1_IRQHandler

void USART_Config(void);
void Usart_SendByte(USART_TypeDef *TX, uint8_t data);
void Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data);
void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num);
void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str);

#endif

串口初始化配置

//這里只在這個函數使用 可用static限制一下
//中斷分組配置函數
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中斷控制器組選擇 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART為中斷源 */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQ;
  /* 搶斷優先級*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子優先級 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中斷 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}


//串口初始化函數
void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打開串口GPIO的時鍾
	//DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	RCC_APB2PeriphClockCmd(USART1_GPIO_CLK, ENABLE);
	// 打開串口外設的時鍾
	//DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
	RCC_APB2PeriphClockCmd(USART1_CLK, ENABLE);
	
	//將USART TX的GPIO配置為推挽復用模式
	GPIO_InitStructure.GPIO_Pin   = USART1_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USART1_TX_GPIO_PORT,&GPIO_InitStructure);
	
	//將USART RX的GPIO配置為浮空輸入模式
	GPIO_InitStructure.GPIO_Pin  = USART1_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(USART1_RX_GPIO_PORT, &GPIO_InitStructure);
	
	//配置串口的工作參數
	//波特率
	USART_InitStructure.USART_BaudRate = USART1_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(USART1, &USART_InitStructure);
	
	// 串口中斷優先級配置
	NVIC_Configuration();
	
	// 使能串口接收中斷
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART_Cmd(USART1, ENABLE);	    
	
}

給上位機發送數據

提示:下面這些函數 都在usart.c中哦(⊙o⊙)

發送一個字節

void Usart_SendByte(USART_TypeDef *TX_usart, uint8_t data)
{
	USART_SendData(TX_usart,data);
	//檢測串口發送的數據
	//若沒有數據來 就會一直等待
	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);

發送兩個字節

void  Usart_Two_SendByte(USART_TypeDef *TX_usart, uint16_t data)
{
	uint8_t temp_h,temp_l;
	
	temp_h = (data&0xff00) >> 8;
	temp_l = data&0xff;
	
	//發送高八位
	USART_SendData(TX_usart,temp_h);
	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
	//發送低八位
	USART_SendData(TX_usart,temp_l);
	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TXE) == RESET);
}

發送八位數組

void Usart_SendArray(USART_TypeDef *TX_usart, uint8_t *array, uint8_t num)
{
	uint8_t i;
	for(i=0; i<num; i++)
	{
		Usart_SendByte(TX_usart,array[i]);
	}
	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
}

發送字符串

void Usart_SendStr(USART_TypeDef *TX_usart, uint8_t *str)
{
	uint8_t i = 0;
	do
	{
		Usart_SendByte(TX_usart,str[i]);
		i++;
	}while(str[i] != '\0');
	while(USART_GetFlagStatus(TX_usart,USART_FLAG_TC) == RESET);
}

注意:要勾選keil中的 ues MicroLIB選項

重定向c庫函數調用

//重定向c庫函數printf到串口,重定向后可使用printf函數
int fputc(int ch, FILE *f)
{
		/* 發送一個字節數據到串口 */
		USART_SendData(USART1, (uint8_t) ch);
		
		/* 等待發送完畢 */
		while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

//重定向c庫函數scanf到串口,重寫向后可使用scanf、getchar等函數
int fgetc(FILE *f)
{
		/* 等待串口輸入數據 */
		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);

		return (int)USART_ReceiveData(USART1);
}

主程序測試

#include "stm32f10x.h"
#include "led.h"
#include "key.h"
#include "systick.h"
#include "usart.h"

int main(void)
{
	uint8_t array[] = {0x00,0x01,0x03,0x04,0x05};
	
	USART_Config();

	Usart_SendByte(USART1,100);
  Usart_Two_SendByte(USART1,0xff00);
	Usart_SendArray(USART1,array,5);
	Usart_SendStr(USART1,"陳一一哇龘\n"); 

	printf("chen yi yi wa\n\n\n\n");
	while(1)
	{
		
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM