源文件
/*
@bef WTO file
*/
#include <stdio.h>
#include "A31G12x_int.h"
#include "A31G12x_usart1n.h"
#include "A31G12x_pcu.h"
#include "Wto_uart.h"
uint8_t Rxbuffer[RX_BUFFER_SIZE];
uint8_t Txbuffer[RX_BUFFER_SIZE];
//定义与初始化
UartHandle Usart11_Handle ={
.RxHead = 0,
.Rxtail = 0,
.RxStatus = 0,
.RxSize = 0,
.RxBuf = Rxbuffer,
.RxTim = 0;
.TxHead = 0,
.Txtail = 0,
.RxSize = 0,
.TxStatus = 0,
.TxBuf = Txbuffer,
};
void USART11_Receive_Data(void);
void USART11_Init(void);
struct __FILE {
int handle; /* Add whatever needed */ };
FILE __stdout;
FILE __stdin;
int fputc(int ch, FILE *f)
{
while( UST_CheckBusy(USART11));
UST_SendByte(USART11,ch);
return(ch);
}
/*****************************************************************************************/
/* 串口USART */
/*****************************************************************************************/
void USART11_Init(void)
{
UST_CFG_Type USTConfigStruct;
PCU_SetDirection(PD, 3, ALTERN_FUNC);
PCU_ConfigureFunction(PD, 3, FUNC1);
PCU_ConfigurePullupdown(PD,3, ENPU);
PCU_SetDirection(PD, 2, ALTERN_FUNC);
PCU_ConfigureFunction(PD, 2, FUNC1);
// 115200-8-无-1
USTConfigStruct.Mode = UST_UART_MODE;
USTConfigStruct.Baud_rate = 115200;
USTConfigStruct.Databits = UST_DATABIT_8;
USTConfigStruct.Parity = UST_PARITY_NONE;
USTConfigStruct.Stopbits = UST_STOPBIT_1;
UST_Init(USART11, &USTConfigStruct);
UST_IntConfig((USART1n_Type *)USART11, UST_INTCFG_RXC, ENABLE);
NVIC_SetPriority(USART11_IRQn, 3);
NVIC_EnableIRQ(USART11_IRQn);
EInt_MaskDisable(UST11_MASK);
UST_Enable(USART11, ENABLE);
__enable_irq();
}
void USART11_Handler(void)
{
uint32_t intsrc, tmp;
intsrc = UST_GetStatus(USART11);
tmp = intsrc & UST_SR_BITMASK;
if ((tmp & UST_SR_RXC) == UST_SR_RXC)
{
USART11_Receive_Data();
}
if ((tmp & UST_SR_TXC) == UST_SR_TXC)
{
// UST_ClearStatus(USART11, UST_STATUS_TXC);
}
}
void USART11_Receive_Data(void)
{
uint8_t date;
uint32_t rLen;
while(1)
{
rLen = UST_Receive((USART1n_Type *)USART11, &date, 1, NONE_BLOCKING);
if (rLen)
{
if( 0== Usart11_Handle.RxSize ){
Usart11_Handle.RxHead = 0;
Usart11_Handle.Rxtail = 0;
}
Usart11_Handle.RxBuf[ ++Usart11_Handle.Rxtail] = date;
if( ++Usart11_Handle.RxSize >= RX_BUFFER_SIZE )
{
Usart11_Handle.RxSize = RX_BUFFER_SIZE;
if( ++Usart11_Handle.RxHead >= RX_BUFFER_SIZE ){
Usart11_Handle.RxHead = 0;
}
}
Usart11_Handle.RxStatus = IS_BUSY; // receive data now
Usart11_Handle.RxTim = GetTickSystemTime();
}
else
{
break;
}
}
}
//获取uart的接收状态
uint8_t GetUartRxStatus( UartHandle * pxUsart_x )
{
uint32_t ticknow = GetTickSystemTime();
if( pxUsart_x->RxStatus == IS_BUSY )
{
if( ticknow > pxUsart_x->RxTim )
{
if( ( ticknow - pxUsart_x->RxTim ) >= 30 ) //30ms
{
pxUsart_x->RxStatus = IS_IDLE;
}
} else {
if( ( ( 0xffffffff - pxUsart_x->RxTim ) + ticknow ) >= 30 )
{
pxUsart_x->RxStatus = IS_IDLE;
}
}
}
return pxUsart_x->RxStatus;
}
void UsartReceiveHandle(void)
{
uint8_t rxBuf[RX_BUFFER_SIZE];
uint8_t i;
if( GetUartRxStatus() == IS_IDLE ) //判断接收为空闲30ms时,认为接收完数据
{
printf("\ndata{");
if( Usart11_Handle.RxSize )
{
for(i=0; i< Usart11_Handle.RxSize; i++ ){
rxBuf[i] = Usart11_Handle.RxBuf[i];
printf("%02d ",rxBuf[i]);
}
printf("}");
}
Usart11_Handle.RxSize = 0;
Usart11_Handle.RxHead = 0;
Usart11_Handle.Rxtail = 0;
}
}
头文件
#ifndef _WTO_UART_H_
#define _WTO_UART_H_
#define PACKET_HEADER (3)
#define PACKET_TRAILER (2)
#define PACKET_OVERHEAD (PACKET_HEADER + PACKET_TRAILER)
#define PACKET_SIZE (128)
#define PACKET_1K_SIZE (1024)
#define RX_BUFFER_SIZE (( PACKET_SIZE + PACKET_OVERHEAD ) * 2 ) //133*2=266 Bytes
#define IS_IDLE 0
#define IS_BUSY 1
typedef struct{
uint16_t RxHead;
uint16_t Rxtail;
uint16_t RxSize;
uint32_t RxTim;
uint8_t RxStatus;
uint8_t *RxBuf;
uint16_t TxHead;
uint16_t Txtail;
uint16_t TxSize;
uint8_t TxStatus;
uint8_t *TxBuf;
}UartHandle;
extern void USART11_Init(void);
extern uint8_t GetUartRxStatus(void);
extern void UsartReceiveHandle(void);
#endif
定时器
#include "A31G12x_timer2n.h"
#include "A31G12x_timer1n.h"
#include "A31G12x_int.h"
#include "stdio.h"
uint32_t Tick1MsCounts = 0;
/**********************************************************************
TIME20 定时5ms
**********************************************************************/
void TIME2_Init(void)
{
TIMER2_PERIODICCFG_Type T2n_Config ={
0};
T2n_Config.CkSel = PCLK; // SystemPeriClock=40Mhz=PCLK
T2n_Config.Prescaler = 40; // 40Mhz / 40 = 1000Khz ->1us
T2n_Config.ADR = (1000); // 1msec
T2n_Config.BDR = (0);
T2n_Config.StartLevel=START_LOW;
T2n_Config.TCLK_SEL = PCLK_CLK;
TIMER2n_Init(T20, PERIODIC_MODE2, &T2n_Config);
TIMER2n_IntConfig(T20, TIMER_CR_MATCH_INTR, ENABLE);
NVIC_SetPriority(TIMER20_IRQn, 3); //中断优先级
NVIC_EnableIRQ(TIMER20_IRQn);
EInt_MaskDisable(T20_MASK);
TIMER2n_Cmd(T20, ENABLE);
}
uint32_t GetTickSystemTime(void)
{
return Tick1MsCounts;
}
void TIMER20_Handler(void)
{
static uint16_t Tcnt =0;
if ((TIMER2n_GetStatus(T20) & TIMER_CR_MATCH_FLAG) == TIMER_CR_MATCH_FLAG)
{
TIMER2n_ClearStatus(T20, TIMER_CR_MATCH_FLAG);
Tick1MsCounts += 1;
if(++Tcnt >= 1000)
{
Tcnt = 0;
}
}
}