STM32之USART篇

//file :USART.h
#include "stm32f10x.h"
#include "stdio.h"

/*
	USART基本操作步驟:
	1、串口時鐘使能,GPIO時鐘使能
	2、GPIO模式設置
	3、串口參數初始化
	4、使能串口
	5、開啓中斷並且初始化NVIC
	6、編寫中斷處理函數
*/

//int fputc(int ch, FILE *f)	
//如果需要對printf函數進行重定向,MDK選擇中需要將‘USE mitolib選上’

void Usart_Config( uint16_t BaudRate);	//	參數:波特率  串口1

void Nvic_Config(void);		//配置中斷優先級控制 優先級組別只要設置一次

void USART1_IRQHandler(void); //中斷處理函數,函數名在啓動文件中已固定
						
/*****************************常用的USTAT函數*****************************							
							
//使能或者失能USART外設
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);

//使能或者失能指定的USART中斷
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
	USART_IT_RXNE--接收中斷    USART_IT_TC--傳輸完成中斷
 
//使能或者失能USART的DMA請求
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);

//USART 發送一個字符
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

//讀取USART一個字符
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

//檢查USART是否產生了中斷
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

//清除USART中斷待處理位
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);

**************************************************************************/
//file:USART.c

#include "USART.h"


extern uint8_t str[100] = "測試ing\n"; //串口接收緩存字符串

void Usart_Config( uint16_t BaudRate)
{
	GPIO_InitTypeDef   GPIO_InitStruct;		//需使用相對應的引腳
	USART_InitTypeDef  USART_InitStruct;	//USART參數設定

	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1,ENABLE);	//開啓相對應的GPIO與串口時鐘
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;	//複用推輓輸出 TX 發送
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入  RT 接收
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//接收與發送模式
	USART_InitStruct.USART_BaudRate = BaudRate;					//設置波特率
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;	//數據位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;			//停止位
	USART_InitStruct.USART_Parity = USART_Parity_No;			//奇偶檢驗位無
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
																//硬件流控制無,一般不使用
	USART_Init(USART1, &USART_InitStruct);
	
	USART_Cmd(USART1, ENABLE);						//使能串口  一定要使能串口
	USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);	//使能接收中斷
}


void Nvic_Config(void)
{
	NVIC_InitTypeDef NVIC_InitStruct;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//中斷優先級分組設置,工程中只需要配置一次
	
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;		//選擇需要產生的中斷
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; //搶佔優先級分組
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;			//子優先級分組
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;		//使能
	
	NVIC_Init(&NVIC_InitStruct);
}

//重定義fputc函數  使用printf函數
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}


//中斷處理函數參考
void USART1_IRQHandler(void)
{
	uint8_t  static num  = 0;
	
	if(USART_GetFlagStatus(USART1,USART_IT_RXNE) == SET)
	{
		str[num] = USART_ReceiveData(USART1);
		num ++;
		
		if( str[num-1] == '#') 		//發送的字符串必須以 '#' 結尾
		{
			str[num-1] = 0;
			num = 0;
		}
		
	}			
	USART_ClearFlag(USART1,USART_IT_RXNE);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章