串口相關

頭文件
#ifndef __USART_H__
#define __USART_H__

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

//串口1-USART1

#define CUSTOM_USART_APBxClkCmd             RCC_APB2PeriphClockCmd
#define CUSTOM_USART_CLK                    RCC_APB2Periph_USART1
#define CUSTOM_USARTx                       USART1
#define CUSTOM_USART_BaudRate               115200

//USART_GPIO
#define CUSTOM_USART_GPIO_APBxClkCmd        RCC_APB2PeriphClockCmd
#define CUSTOM_USART_GPIO_CLK               (RCC_APB2Periph_GPIOA)

#define CUSTOM_USART_TX_GPIO_PORT           GPIOA
#define CUSTOM_USART_TX_GPIO_PIN            GPIO_Pin_9
#define CUSTOM_USART_RX_GPIO_PORT           GPIOA
#define CUSTOM_USART_RX_GPIO_PIN            GPIO_Pin_10

#define CUSTOM_USART_IRQn                  USART1_IRQn
#define CUSTOM_USART_IRQHandler            USART1_IRQHandler

#define USART_REC_LEN  			200  	//定義最大接收字節數 200
extern u8 USART_RX_Cmd[20]; //命令接收緩衝,最大USART_REC_LEN個字節
extern u8 USART_RX_BUF[USART_REC_LEN]; //數據接收緩衝,最大USART_REC_LEN個字節

void USART_Custom_Init(void);
void CUSTOM_USART_SendByte(USART_TypeDef* CUSTOM_USART, uint8_t data);
void CUSTOM_USART_SendHalfWord(USART_TypeDef* CUSTOM_USART, uint16_t data);
void CUSTOM_USART_SendArray(USART_TypeDef* CUSTOM_USART, uint8_t *data, uint8_t num);
void CUSTOM_USART_SendStr(USART_TypeDef* CUSTOM_USART, uint8_t *str);
void CUSTOM_USART_SendTem(USART_TypeDef* CUSTOM_USART, short data);

uint8_t CUSTOM_USART_ReceiveByte(USART_TypeDef* CUSTOM_USART);
void CUSTOM_USART_ReceiceArray(USART_TypeDef* CUSTOM_USART, uint8_t *data, uint8_t num);

#endif

函數相關
#include "usart.h"

void USART_Custom_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	USART_InitTypeDef USART_InitStrutre;
	
	CUSTOM_USART_APBxClkCmd(CUSTOM_USART_CLK, ENABLE);
	CUSTOM_USART_GPIO_APBxClkCmd(CUSTOM_USART_GPIO_CLK, ENABLE);
	
	// 將USART Tx的GPIO配置爲推輓複用模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = CUSTOM_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(CUSTOM_USART_TX_GPIO_PORT, &GPIO_InitStructure);
	
	// 將USART Rx的GPIO配置爲浮空輸入模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = CUSTOM_USART_RX_GPIO_PIN;
	GPIO_Init(CUSTOM_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	//Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = CUSTOM_USART_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶佔優先級2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子優先級3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器
	
	USART_InitStrutre.USART_BaudRate = CUSTOM_USART_BaudRate;
	USART_InitStrutre.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStrutre.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStrutre.USART_Parity = USART_Parity_No;
	USART_InitStrutre.USART_StopBits = USART_StopBits_1;
	USART_InitStrutre.USART_WordLength = USART_WordLength_8b;
	USART_Init(CUSTOM_USARTx, &USART_InitStrutre); //初始化串口1
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啓串口接受中斷
	USART_Cmd(CUSTOM_USARTx, ENABLE);// 使能串口
} 

/* 發送一個字節 */
void CUSTOM_USART_SendByte(USART_TypeDef* CUSTOM_USART, uint8_t data)
{
	USART_SendData(CUSTOM_USART, data);
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TXE) == RESET);
}

/* 接收一個字節 */
uint8_t CUSTOM_USART_ReceiveByte(USART_TypeDef* CUSTOM_USART)
{
	uint8_t GetData;
	if(USART_GetFlagStatus(CUSTOM_USART ,USART_FLAG_RXNE) == SET)
		GetData = USART_ReceiveData(CUSTOM_USART); 
	return GetData;
}

/* 發送兩個字節的數據 */
void CUSTOM_USART_SendHalfWord(USART_TypeDef* CUSTOM_USART, uint16_t data)
{
	uint8_t temp_h,temp_l;
	
	temp_h = (data & 0xff00) >> 8;
	temp_l = data & 0xff;
	USART_SendData(CUSTOM_USART, temp_h);
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TXE) == RESET);
	
	USART_SendData(CUSTOM_USART, temp_l);
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TXE) == RESET);
}

/* 發送8位數據的數組 */
void CUSTOM_USART_SendArray(USART_TypeDef* CUSTOM_USART, uint8_t *data, uint8_t num)
{
	uint8_t temp;
	for(temp = 0; temp < num; temp++)
	{
		CUSTOM_USART_SendByte(CUSTOM_USART, data[temp]);
	}
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TC) == RESET);
}

/* 接收多個字節的數組 */
void CUSTOM_USART_ReceiceArray(USART_TypeDef* CUSTOM_USART, uint8_t *data, uint8_t num)
{
	uint8_t temp;
	for(temp = 0; temp < num; temp++)
	{
		data[temp] = CUSTOM_USART_ReceiveByte(CUSTOM_USART);
	}
}

/* 發送字符串 */
void CUSTOM_USART_SendStr(USART_TypeDef* CUSTOM_USART, uint8_t *str)
{
	uint8_t i = 0;
	do
	{
		CUSTOM_USART_SendByte(CUSTOM_USART, *(str+i));
		i++;
	}while(*(str+i) != '\0');
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TC) == RESET);
}


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

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

		return (int)USART_ReceiveData(CUSTOM_USARTx);
}

/* 發送數據 */
void CUSTOM_USART_SendTem(USART_TypeDef* CUSTOM_USART, short data)
{
	uint8_t temp_h,temp_l;
	
	temp_h = (data & 0xff00) >> 8;
	temp_l = data & 0xff;
	USART_SendData(CUSTOM_USART, temp_h);
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TXE) == RESET);
	
	USART_SendData(CUSTOM_USART, temp_l);
	while(USART_GetFlagStatus(CUSTOM_USART, USART_FLAG_TXE) == RESET);
}
中斷服務函數
void CUSTOM_USART_IRQHandler(void) //串口1中斷服務程序
{
	if(USART_GetITStatus(CUSTOM_USARTx ,USART_IT_RXNE) == SET)
	{
		USART_ClearITPendingBit(CUSTOM_USARTx, USART_IT_RXNE);
		USART_RX_Cmd[num_L] = USART_ReceiveData(CUSTOM_USARTx);
		num_L ++;
	}
	if(USART_RX_Cmd[num_L - 1] == 0x5A)
		num_S = num_L - 1;
	if((USART_RX_Cmd[num_S] == 0x5A) && (USART_RX_Cmd[num_L - 1] == 0xA5))
	{
		Cmd_Judge();
		for(num=0; num<=19; num++)
		{
			USART_RX_Cmd[num] = 0x00;
		}
	}
	if(USART_GetFlagStatus(CUSTOM_USARTx,USART_FLAG_ORE) == SET) //溢出 
	{ 
		USART_ClearFlag(CUSTOM_USARTx,USART_FLAG_ORE); //讀SR 
		USART_ReceiveData(CUSTOM_USARTx); //讀DR 
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章