//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);
}