dimoniche f74fdcceac первый коммит
первый коммит
2019-05-27 23:42:26 +03:00

107 lines
2.8 KiB
C
Raw Blame History

#include <includes.h>
#include "uart1.h"
void Uart1_Send(unsigned char *buf, int len)
{
while (len--) Uart1_WrByte(*buf++);
}
int Uart1_Receive(unsigned char *buf, int len, int timeout)
{
while (len--)
{
if (!Uart1_RdByteWithTimeOut(buf++, timeout)) return 0;
}
return 1;
}
void Uart1_Init(CPU_INT32U baud_rate)
{
float div_fp; /* Baud rate divisor floating point precision */
CPU_INT16U div_int; /* Baud rate divisor floating point precision */
CPU_INT08U divlo;
CPU_INT08U divhi;
CPU_INT32U pclk_freq;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
OS_ENTER_CRITICAL();
pclk_freq = BSP_CPU_PclkFreq(PCLK_UART1); /* Get peripheral clock frequency */
div_fp = (pclk_freq / 16.0 / baud_rate); /* Compute divisor for desired baud rate */
div_int = (CPU_INT16U)(div_fp + 0.5); /* Round the number up */
divlo = div_int & 0x00FF; /* Split divisor into LOW and HIGH bytes */
divhi = (div_int >> 8) & 0x00FF;
PCONP_bit.PCUART1 = 1; /* Enable the power bit for UART0 */
U1LCR = 0x80; /* Enable acces to Divisor latches */
U1DLL = divlo; /* Load divisor */
U1DLM = divhi;
U1FDR = 0x10;
U1LCR = 0;
U1MCR = 0;
U1ACR = 0;
U1FCR_bit.FCRFE = 1; // enable fifo
U1LCR_bit.WLS = 0x03; // 8 bit
U1LCR_bit.SBS = 0; // 1 stop bit
U1IER = 0;
PINSEL4_bit.P2_0 = 0x2;
PINSEL4_bit.P2_1 = 0x2;
PINMODE4_bit.P2_0 = 0;
PINMODE4_bit.P2_1 = 0;
FIO2DIR_bit.P2_0 = 1;
FIO2DIR_bit.P2_1 = 0;
FIO2MASK_bit.P2_0 = 1;
FIO2MASK_bit.P2_1 = 1;
OS_EXIT_CRITICAL();
}
void Uart1_WrByte(CPU_INT08U tx_byte)
{
while (!U1LSR_bit.THRE) {
OSTimeDly(1);
}
U1THR = tx_byte;
}
void Uart1_Purge(void)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
U1FCR_bit.RFR = 1;
}
int Uart1_RdByteWithTimeOut(CPU_INT08U *byte, CPU_INT32U timeout)
{
CPU_INT32U ctr = 0;
while (!U1LSR_bit.DR) {
OSTimeDly(1);
if (++ctr > timeout) return 0;
}
//error = U1LSR;
*byte = (CPU_INT08U)(U1RBR & 0x00FF); /* Remove the data from the holding register */
return 1;
}