145 lines
4.8 KiB
C
145 lines
4.8 KiB
C
|
|
/*----------------------------------------------------------------------------------------------------
|
|
INCLUDE HEADE FILES
|
|
----------------------------------------------------------------------------------------------------*/
|
|
|
|
#include "Includes.h"
|
|
|
|
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: Init_uart
|
|
- 函数功能: UART初始化
|
|
- 输入参数: 初始化串口号(0:uart0 1:uart1); 波特率
|
|
- 创建日期: 2016-05-26
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void Init_uart(uint32_t ch , uint32_t baud)
|
|
{
|
|
uint32_t val;
|
|
|
|
__write_hw_reg32(CPR_RSTCTL_SUBRST_SW , (1<<(16+ch))); //复位uart模块
|
|
__write_hw_reg32(CPR_RSTCTL_SUBRST_SW , ((1<<(16+ch))|(1<<ch)));//解复位uart模块
|
|
|
|
__read_hw_reg32(CPR_LP_CTL , val);
|
|
val &= ~(1<<(1-ch));
|
|
__write_hw_reg32(CPR_LP_CTL , val); //关闭uartx时钟保护
|
|
|
|
val = (1<<(16+ch+4)) | (1<<(ch+4));
|
|
__write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL , val); //打开uartx pclk
|
|
__write_hw_reg32(CPR_UARTx_CLK_GRCTL(ch), 0x110018);
|
|
//__write_hw_reg32(CPR_UARTx_CLK_CTL(ch), 0x480271);
|
|
__write_hw_reg32(CPR_UARTx_CLK_CTL(ch), baud>>4);
|
|
|
|
__write_hw_reg32(UARTx_TCR(ch) , 0x80); //使能DLAB位
|
|
//__write_hw_reg32(UARTx_DLL(ch) , baud);
|
|
__write_hw_reg32(UARTx_DLL(ch) , baud&0x0F);
|
|
__write_hw_reg32(UARTx_DLH(ch) , 0);
|
|
|
|
__write_hw_reg32(UARTx_TCR(ch) , 0x03); //清零DLAB位,8个BIT位
|
|
__write_hw_reg32(UARTx_FCR(ch) , 0xb7); //接收FIFO半满报中断, 并使能FIFO中断
|
|
__write_hw_reg32(UARTx_IER(ch) , 0x01); //打开接收中断
|
|
val = UART0_IRQn + ch;
|
|
NVIC_EnableIRQ((IRQn_Type)val);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: UART0_Handler
|
|
- 函数功能: UART0中断处理函数
|
|
- 输入参数: 无
|
|
- 创建日期: 2016-05-26
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void UART0_Handler(void)
|
|
{
|
|
uint32_t iWK = 0 ;
|
|
uint8_t tWK = 0 ;
|
|
|
|
__read_hw_reg32(UART0_IIR , iWK);
|
|
iWK &= 0x0F;
|
|
|
|
if((iWK != 0x04) && (iWK != 0x0c)) return;
|
|
|
|
__read_hw_reg32(UART0_RBR , tWK);
|
|
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: UART1_Handler
|
|
- 函数功能: UART1中断处理函数
|
|
- 输入参数: 无
|
|
- 创建日期: 2016-05-26
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void UART1_Handler(void)
|
|
{
|
|
uint32_t iWK = 0 ;
|
|
uint8_t tWK = 0 ;
|
|
|
|
__read_hw_reg32(UART1_IIR , iWK);
|
|
iWK &= 0x0F;
|
|
|
|
if((iWK != 0x04) && (iWK != 0x0c)) return;
|
|
|
|
__read_hw_reg32(UART1_RBR , tWK);
|
|
#if 1
|
|
Uart_Send_Char(1,'R');
|
|
Uart_Send_Char(1,'e');
|
|
Uart_Send_Char(1,'v');
|
|
Uart_Send_Char(1,':');
|
|
Uart_Send_Char(1,tWK);
|
|
Uart_Send_Char(1,'\n');
|
|
#endif
|
|
|
|
}
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: Uart_Send_Char
|
|
- 函数功能: Uart发送一个字符
|
|
- 输入参数: 串口号; 要发送的字符
|
|
- 创建日期: 2016-05-26
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void Uart_Send_Char(uint32_t ch, uint8_t c)
|
|
{
|
|
unsigned int status;
|
|
for(; ;)
|
|
{
|
|
__read_hw_reg32(UARTx_TSR(ch), status);
|
|
status &= 0x20;
|
|
if(status == 0x20) break;
|
|
}
|
|
__write_hw_reg32(UARTx_THR(ch), c);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: Uart_Send_String
|
|
- 函数功能: Uart发送一个字符串
|
|
- 输入参数: 串口号; 要发送的字符串
|
|
- 创建日期: 2016-05-26
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void Uart_Send_String(uint32_t ch, uint8_t *s)
|
|
{
|
|
while(*s != '\0')
|
|
{
|
|
Uart_Send_Char(ch, *s++);
|
|
}
|
|
}
|
|
/* ---------------------------------------------------------------------------------------------------
|
|
- 函数名称: Uart_Send_Buf
|
|
- 函数功能: Uart发送一个长度为length的uint8_t类型的数组
|
|
- 输入参数: 串口号; 要发送的数组,数组长度
|
|
- 创建日期: 2019-04-02
|
|
- 作 者:陈俊伟
|
|
----------------------------------------------------------------------------------------------------*/
|
|
extern void Uart_Send_Buf(uint32_t ch, uint8_t *s,uint32_t length)
|
|
{
|
|
while(length--)
|
|
{
|
|
Uart_Send_Char(ch, *s++);
|
|
}
|
|
}
|
|
|
|
|
|
extern void test_uart(void)
|
|
{
|
|
gpio_mux_ctl(0,0);gpio_fun_inter(0,0);gpio_fun_sel(0,UART1_RX);
|
|
gpio_mux_ctl(1,0);gpio_fun_inter(1,0);gpio_fun_sel(1,UART1_TX);
|
|
Init_uart(1, BAUD_57600);
|
|
Uart_Send_String(1,"I am uart1...\n");
|
|
}
|