#include "usart.h"
#include <string.h>
#include "gpio.h"
#include "stm32f10x.h"
void GPIO_USART_init()
{
//定义GPIO结构体变量
GPIO_InitTypeDef GPIO_InitStructure;
//1,开启时钟 GPIOA|USART1|AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
USART_DeInit(USART1);
//2,初始化 GPIO
//PA9 推挽服用
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PA10 浮空输入模式(不用上拉也不用下拉 选择浮空)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//输入 不需要初始化速度
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void usart_init(int BaudRate)
{
//定义USART,NICV结构变量
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//USART GPIO 的初始化
GPIO_USART_init();
//3,初始化USART
USART_InitStructure.USART_BaudRate = BaudRate; /*设置波特率为115200*/
USART_InitStructure.USART_WordLength = USART_WordLength_8b; /*设置数据位为8位*/
USART_InitStructure.USART_StopBits = USART_StopBits_1; /*设置停止位为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);
//4,初始化NVIC
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断通道号(宏在在头文件stm32F10X.H中以IRQn结尾的)
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ; //抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//5,初始化状态
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断请求使能
USART_Cmd(USART1, ENABLE); //开启USART1
}
void USART1_IRQHandler() //串口1中断服务程序
{
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1)
{
USART_ENBEN();
usart_option();
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
void NVIC_Configuration(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
//每次进入中断 接收一个字节数据,而不是接收一串字符
//要想接收一串字符(一个一个字符接收,接收结束标志位‘!’)
u8 USART_Rx_buf[32]= {0}; //外部使用
u8 USART_Rx_flag=0; //接收完成标记位
static u8 count =0, flag_h =0; //count 用于计数 flag_h 用于记录到(开始标记符‘#')标志位
void USART_ENBEN()
{
static u8 buf[32]= {0};
u8 h_buf;
u8 i,j;
h_buf = USART_ReceiveData(USART1);
if(flag_h == 0 && h_buf=='#')
{
flag_h=1;
return;
}
if(flag_h)
{
buf[count++] = h_buf;
if(buf[count-1]!='.') {
USART_SendData(USART1,buf[count-1]);
}
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
//接收完成
if(buf[count-1]=='.')
{
//数据转移
for(i=0; i<=count-1; i++)
{
USART_Rx_buf[i]=buf[i];
}
//数据清空(数据,计数值)
for(j=0; j<count; j++)
{
buf[j]='\0';
}
count=0;
//接收完成标志位
USART_Rx_flag=1;
flag_h = 0;
USART_ClearFlag(USART1,USART_FLAG_TXE);
}
}
}
//串口输出字符串
//假如string中没有'\0',会额外发送一些数据
void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
int i = 0;
USART_ClearFlag(USARTx,USART_FLAG_TXE);
if(flag_h ==0)
{
while(DataString[i] != '\0')
{
USART_SendData(USARTx,DataString[i]);
while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == 0);
USART_ClearFlag(USARTx,USART_FLAG_TXE);
i++;
}
}
}
//这只是串口配置 使用请看(二)