Files
2026-08-05 19:07:52 +08:00

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");
}