Files
2026-04-23 10:50:18 +08:00

197 lines
7.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*****************************************************************
头文件
*****************************************************************
*/
#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 *********************************/