Files
SM-1000M/RTX5_20220316/Driver/usart/usart3.c
2026-04-23 10:50:18 +08:00

139 lines
4.5 KiB
C
Raw 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 "usart3.h"
/*
************************************************************************************
变量定义
************************************************************************************
*/
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节.
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
vu16 point1 = 0;
/*
*********************************************************************************************************
* 函 数 名: USART3_Configuration()
* 功能说明: 串口3配置
* 输 入 波特率baund
* 输 出 :无
*********************************************************************************************************
*/
void USART3_Configuration(u32 baund)
{
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //使能USART3
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); //GPIOB时钟
//NVIC_Configuration();
USART_DeInit(USART3); //复位串口1
//USART3_TX PB.10 PB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
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(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
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(USART3,&USART_InitStructure);
USART_Cmd(USART3,ENABLE);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//开启USART3的接收中断
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口3中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
USART_ClearFlag(USART3,USART_FLAG_TC); //清除发送完成标志位
}
/*
*********************************************************************************************************
* 函 数 名: USART3_IRQHandler()
* 功能说明: 串口3接收中断
* 输 入 全局数组USART1_SDI_RX_BUF[]
* 输 出 :无
*********************************************************************************************************
*/
void USART3_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART3);//(USART1->DR); //读取接收到的数据
if(Res == 0x24)
{
point1 = 0;
}
USART3_RX_BUF[point1++] = Res;
if(USART3_RX_BUF[0] == '$' && USART3_RX_BUF[4] == 'M' && USART3_RX_BUF[5] == 'C') //确定是否收到"GPRMC/GNRMC"这一帧数据
{
if(Res == '\n')
{
memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length); //清空
memcpy(Save_Data.GPS_Buffer, USART3_RX_BUF, point1); //保存数据
Save_Data.isGetData = true;
point1 = 0;
memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN); //清空
}
}
if(point1 >= (USART3_MAX_RECV_LEN-1))
{
point1 = 0;
}
}
}
/*
*********************************************************************************************************
* 函 数 名: u3_printf()
* 功能说明: 串口3输出
* 输 入
* 输 出
*********************************************************************************************************
*/
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
/***************************** END OF FILE *********************************/