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