197 lines
7.0 KiB
C
197 lines
7.0 KiB
C
/*
|
||
*****************************************************************
|
||
头文件
|
||
*****************************************************************
|
||
*/
|
||
#include "usart.h"
|
||
#include "pbdata.h"
|
||
/*
|
||
************************************************************************************
|
||
变量定义
|
||
************************************************************************************
|
||
*/
|
||
char USART1_TX_BUF[USART1_MAX_SEND_LEN]; //发送缓冲,最大USART1_MAX_SEND_LEN字节
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: UART_PutChar
|
||
* 功能说明: 串口发送字符
|
||
* 输 入 :串口号USARTx
|
||
* 数据Data
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data)
|
||
{
|
||
USART_SendData(USARTx, Data);
|
||
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET){}
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: UART_PutStr
|
||
* 功能说明: 串口发送字符串
|
||
* 输 入 :串口号USARTx
|
||
* 数据str
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void UART_PutStr (USART_TypeDef* USARTx, char *str)
|
||
{
|
||
while (0 != *str)
|
||
{
|
||
UART_PutChar(USARTx, *str);
|
||
str++;
|
||
}
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: fputc()
|
||
* 功能说明: printf重定义
|
||
* 输 入 :USART2
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
int fputc(int ch,FILE *f)
|
||
{
|
||
USART_ClearFlag(USART2,USART_FLAG_TC);
|
||
USART_SendData(USART2,(u8)ch);
|
||
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送数据完毕);
|
||
return ch;
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART1_Configuration()
|
||
* 功能说明: 串口1配置
|
||
* 输 入 :波特率baund
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART1_Configuration(u32 baund)
|
||
{
|
||
USART_InitTypeDef USART_InitStructure;
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
|
||
USART_SDI_DEinit();
|
||
Enable_SDI_RS232=1;
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1
|
||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOA时钟
|
||
USART_DeInit(USART1); //复位串口1
|
||
//Usart1 IO 配置
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
|
||
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
|
||
//Usart1 串口寄存器 配置
|
||
USART_InitStructure.USART_BaudRate = baund;
|
||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||
USART_InitStructure.USART_StopBits = USART_StopBits_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);
|
||
|
||
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启USART1的接收中断
|
||
//Usart1 NVIC 配置
|
||
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
|
||
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
|
||
USART_Cmd(USART1,ENABLE);
|
||
USART_ClearFlag(USART1,USART_FLAG_TC); //清除发送完成标志位
|
||
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART_RS232_DEinit()
|
||
* 功能说明: 串口1复位
|
||
* 输 入 :无
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART_RS232_DEinit(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
USART_Cmd(USART1,DISABLE);
|
||
USART_DeInit(USART1);
|
||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能PB端口时钟
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //IO口速度为400KHz
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
GPIO_SetBits(GPIOA,GPIO_Pin_9);
|
||
GPIO_SetBits(GPIOA,GPIO_Pin_10);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART_SDI_DEinit()
|
||
* 功能说明: 串口1复用复位
|
||
* 输 入 :无
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART_SDI_DEinit(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
USART_Cmd(USART1,DISABLE);
|
||
USART_DeInit(USART1);
|
||
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //使能PB端口时钟
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //推挽输出
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推免
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_400KHz; //IO口速度为400KHz
|
||
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_6);
|
||
GPIO_SetBits(GPIOB,GPIO_Pin_7);
|
||
}
|
||
|
||
/*
|
||
*********************************************************************************************************
|
||
* 函 数 名: USART1_IRQHandler()
|
||
* 功能说明: 串口1接收中断
|
||
* 输 入 :全局数组USART1_SDI_RX_BUF[]
|
||
* 输 出 :无
|
||
*********************************************************************************************************
|
||
*/
|
||
void USART1_IRQHandler(void)
|
||
{
|
||
u8 ucCh;//临时局部变量
|
||
if (!Enable_SDI_RS232)
|
||
{
|
||
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
|
||
{
|
||
ucCh =USART_ReceiveData(USART1);
|
||
ucCh=ucCh&0x7F;
|
||
if((USART_SDI_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
|
||
{
|
||
if(USART_SDI_RX_STA<USART1_SDI_REC_LEN) //还可以接收数据
|
||
{
|
||
USART1_SDI_RX_BUF[USART_SDI_RX_STA++]=ucCh; //记录接收到的值
|
||
}else
|
||
{
|
||
USART_SDI_RX_STA|=1<<15; //强制标记接收完成
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/***************************** END OF FILE *********************************/
|
||
|