尊敬的 Support@ti:
我计划在 BeagleboneBlack AM3359上使用 UART1、2、3、4和5、但我没有在任何 UART 上获得任何输出。
为了便于您参考、我附上了我的代码片段、请告诉我代码中是否有任何错误。
文件:- C:\ti\AM335X_StarterWare_02_00_01_01\platform\BeagleBone/UART.c
/**
*\file uart.c
*
#include "hw_control_am335x.h"
#include "SoC_AM335x.h"
#include "hw_cm_wkup.h"
#include "hw_cm_per.h"
#include "BeagleBone.h"
#include "hw_types.h"
/**
*\brief 此函数用于选择要使用的 UART 引脚。 UART 引脚
*与 SoC 中其他外设的引脚进行多路复用
*
*\param instanceNum 要使用的 UART 的实例编号。
*
*\返回无。
*
*\请注意、此引脚复用取决于 EVM 的配置文件
*已配置。
*
空 UARTPinMuxSetup (无符号整型 instanceNum)
{
if (0 = instanceNum)
{
/* UART0 RXD */
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD (0))=
(CONTROL_CONF_UART0_RXD_CONF_UART0_RXD_PUTYPESEL |
CONTROL_CONF_UART0_RXD_CONF_UART0_RXD_RXACTIVE);
/* UART0 TXD */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_UART_TXD (1))=
CONTRAL_CONF_UART0_TXD_CONF_UART0_TXD_PUTYPESEL;
}
否则 if (1 = instanceNum)
{
/* RXD */
HWREG (SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD (1))=
(CONTROL_CONF_UART1_RXD_CONF_UART1_RXD_PUTYPESEL |
CONTROL_CONF_UART1_RXD_CONF_UART1_RXD_ACTIVE);
/* TXD */
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_UART_TXD (1))=
CONTRAL_CONF_UART1_TXD_CONF_UART1_TXD_PUTYPESEL;
}
}
/*
**此函数启用系统 L3和系统 L4_WKUP 时钟。
**这也会启用 UART0实例的时钟。
*
空 UART0ModuleClkConfig (空)
{
/*配置 L3接口时钟。 *
//写入 CM_PER_L3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)|=
CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;
//等待 MODULEMODE 位域反映写入值。 *
while (CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)和
CM_PER_L3_CLKCTRL_MODULEMODE));
//写入 CM_PER_L3_INSTR_CLKCTRL 寄存器的 MODULEMODE 字段。 *
HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)|=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;
//等待 MODULEMODE 位域反映写入值。 *
while (CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)和
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE);
//写入 CM_PER_L3_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)|=
CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
//等待 CLKTRCTRL 字段反映写入的值。 *
while (CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKSTCTRL)和
CM_PER_L3_CLKSTCTRL_CLKTRCTRL));
//写入 CM_PER_OCPWP_L3_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)|=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
/*等待 CLKTRCTRL 域反映写入的值。 *
while (CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL);
//写入 CM_PER_L3S_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)|=
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
/*等待 CLKTRCTRL 域反映写入的值。 *
while (CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
(HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)和
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL);
/*检查字段中是否有必要的值。 *
//等待 CM_PER_L3_CLKCTRL 寄存器中的 IDLEST 字段设置为0x0。 *
while (((CM_PER_L3_CLKCTRL_IDLEST_FUNC << CM_PER_L3_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)和
CM_PER_L3_CLKCTRL_IDLEST));
/*
**等待 CM_PER_L3_INSTR_CLKCTRL 寄存器中的 IDLEST 字段达到
**所需值。
*
while (((cm_per_L3_INSTR_CLKCTRL_IDLEST_FUNC <<
CM_PER_L3_INSTR_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)和
CM_PER_L3_INSTR_CLKCTRL_IDLEST);
/*
**正在等待 CM_PER_L3_CLKSTCTRL 寄存器中的 CLKACTIVITY_L3_GCLK 域
**达到所需值。
*
while (CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK!=
(HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKSTCTRL)和
CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);
/*
**等待 CM_PER_OCPWP_L3_CLKSTCTRL 中的 CLKACTIVITY_OCPWP_L3_GCLK 字段
**注册以获得所需的值。
*
while (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK!=
(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK);
/*
**正在等待 CM_PER_L3S_CLKSTCTRL 寄存器中的 CLKACTIVITY_L3S_GCLK 域
**以达到所需的值。
*
while (CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK!=
(HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)和
CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);
/*配置与唤醒区域相关的寄存器。 *
//写入 CM_WKUP_CONTRAL_CLKCTRL 寄存器的 MODULEMODE 字段。 *
HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)|=
CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE_ENABLE;
//等待 MODULEMODE 位域反映写入值。 *
while (CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE_ENABLE!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)和
CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE));
//写入 CM_PER_L3S_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)|=
CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
/*等待 CLKTRCTRL 域反映写入的值。 *
while (CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
CM_WKUP_CLKSTCTRL_CLKTRCTRL);
//写入 CM_L3_AON_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)|=
CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
/*等待 CLKTRCTRL 域反映写入的值。 *
while (CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)和
CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL);
//写入 CM_WKUP_UART0_CLKCTRL 寄存器的 MODULEMODE 字段。 *
HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)|=
CM_WKUP_UART0_CLKCTRL_MODULEMODE_ENABLE;
//等待 MODULEMODE 位域反映写入值。 *
while (CM_WKUP_UART0_CLKCTRL_MODULEMODE_ENABLE!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)和
CM_WKUP_UART0_CLKCTRL_MODULEMODE));
/*验证其他位是否设置为所需设置。 *
/*
**等待 CM_WKUP_CONTRAL_CLKCTRL 寄存器中的 IDLEST 域达到
**所需值。
*
while (((CM_WKUP_CONTRAL_CLKCTRL_IDLEST_FUNC <<
CM_WKUP_CONTRAL_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)和
CM_WKUP_CONTRAL_CLKCTRL_IDLEST));
/*
**等待 CM_L3_AON_CLKSTCTRL 中的 CLKACTIVITY_L3_AON_GCLK 字段
**注册以获得所需的值。
*
while (CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)和
CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK);
/*
**等待 CM_WKUP_L4WKUP_CLKCTRL 寄存器中的 IDLEST 域达到
**所需值。
*
while (((CM_WKUP_L4WKUP_CLKCTRL_IDLEST_FUNC <<
CM_WKUP_L4WKUP_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_L4WKUP_CLKCTRL)和
CM_WKUP_L4WKUP_CLKCTRL_IDLEST);
/*
**正在等待 CM_WKUP_CLKSTCTRL 寄存器中的 CLKACTIVITY_L4_WKUP_GCLK 字段
**以达到所需的值。
*
while (CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK);
/*
**等待 CM_L4_WKUP_AON_CLKSTCTRL 中的 CLKACTIVITY_L4_WKUP_AON_GCLK 字段
**注册以获得所需的值。
*
while (CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL)和
CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK);
/*
**等待 CM_WKUP_CLKSTCTRL 中的 CLKACTIVITY_UART0_GFCLK 字段
**注册以获得所需的值。
*
while (CM_WKUP_CLKSTCTRL_CLKACTIVITY_UART0_GFCLK!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
CM_WKUP_CLKSTCTRL_CLKACTIVITY_UART0_GFCLK);
/*
**等待 CM_WKUP_UART0_CLKCTRL 寄存器中的 IDLEST 域达到
**所需值。
*
while (((CM_WKUP_UART0_CLKCTRL_IDLEST_FUNC <<
CM_WKUP_UART0_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)和
CM_WKUP_UART0_CLKCTRL_IDLEST);
}
/********* 文件结尾 /
空 UART1模块配置(空)
{
HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)=
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
while ((HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);
HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)=
CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);
HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;
while ((HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)&
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE)!=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);
HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)=
CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;
while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKCTRL)&
CM_PER_L3_CLKCTRL_MODULEMODE)!= CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);
HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
while ((HWREG (SOC_CM_PER_regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);
HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKSTCTRL)=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;
while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);
HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKCTRL)=
CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;
while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKCTRL)&
CM_PER_L4LS_CLKCTRL_MODULEMODE)!= CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);
HWREG (SOC_CM_PER_regs + CM_PER_UART1_CLKCTRL)|= CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE;
while ((HWREG (SOC_CM_PER_Regs + CM_PER_UART1_CLKCTRL)&
CM_PER_UART1_CLKCTRL_MODULEMODE)!= CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE);
while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);
while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);
while (!(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)&
(CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));
while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
(cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_UART_GFCLK)));
//等待 MODULEMODE 位域反映写入值。 *
while (CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE!=
(HWREG (SOC_CM_PER_REGS + CM_PER_UART1_CLKCTRL)和
CM_PER_UART1_CLKCTRL_MODULEMODE));
/*
**等待 CM_WKUP_UART0_CLKCTRL 寄存器中的 IDLEST 域达到
**所需值。
*
while (((CM_PER_UART1_CLKCTRL_IDLEST_FUNC <<
CM_PER_UART1_CLKCTRL_IDLEST_SHIFT)!=
(HWREG (SOC_CM_PER_REGS + CM_PER_UART1_CLKCTRL)和
CM_PER_UART1_CLKCTRL_IDLEST));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
文件:- C:\ti\AM335X_StarterWare_02_00_01_01\examples\BeagleBone\UART/uartecho.c
/*
* Uart1.c
*
*创建日期:2021年5月18日
作者:Shubhakar
*
#include "UART_IrDA_cir.h"
#include "SoC_AM335x.h"
#include "interrupt.h"
#include "BeagleBone.h"
#include "consoleUtils.h"
#include "hw_types.h"
/*********
**内部宏定义
秘书长的报告 /
#define BAUD_RATE 115200 (115200)
#define UART_MODULE_INPUT CLK (48000000)
/*
**要发送到 UART 发送 FIFO 的数据字节数
**每一代发送空中断。 这可能需要一个最大值
** TX 触发空间的值,即"TX FIFO 大小- TX 阈值级别"。
*
#define NUM_TX_Bytes_per_trans (56)
/*********
**内部函数原型
秘书长的报告 /
静态空 UartInterruptEnable (void);
静态空 UART1AINTCConfigure (void);
静态空 UartFIFOConfigure (空);
静态空 UartBaudRateSet (void);
静态空 UARTIsr (空);
/*********
**全局变量定义
秘书长的报告 /
unsigned char txArray[]="StarterWare AM335X UART 中断应用程序\r\n";
/*用于表示应用程序向 UART TX FIFO 发送数据的标志。 *
unsigned int txEmptyFlag = false;
/*
**保存传输到的数据块字节数的变量
** UART TX FIFO,直到当前时刻。
*
unsigned int current NumTxBytes = 0;
/*********
**函数定义
秘书长的报告 /
int main()
{
unsigned int numByteChunks = 0;
unsigned int remayBytes = 0;
unsigned int bIndex = 0;
/*为 UART0实例配置系统时钟。 *
UART1模块 ClkConfig();
/*对 UART0实例执行引脚复用。 *
UARTPinMuxSetup (1);
/*执行模块重置。 *
UARTModuleReset (SOC_UART_1_regs);
/*执行 FIFO 配置。 *
UartFIFOConfigure();
/*执行波特率设置。 *
UartBaudRateSet();
/*切换到配置模式 B。*/
UARTRegConfigModeEnable (SOC_UART_1_regs、UART_REG_CONFIG_MODE_B);
/*对线路特性进行编程。 *
UARTLineCharacConfig (SOC_UART_1_regs、
(UART_FRAME_WORD_LENGTH_8 | UART_FRAME_NUM_STB_1)、
UART_parity);
/*禁用对 Divisor 锁存器的写入访问。 *
UARTDivisorLatchDisable (SOC_UART_1_regs);
/*禁用中断控制。 *
UARTBreakCtl (SOC_UART_1_regs、UART_break_COND_disable);
/*切换到 UART16x 操作模式。 *
UARTOperatingModeSelect (SOC_UART_1_regs、UART16x_Oper_mode);
/*根据编译时间检查选择控制台类型*/
控制台 UtilsSetType (console_UART);
/*执行中断配置。 *
UartInterruptEnable();
numByteChunks =(sizeof (txArray)- 1)/NUM_TX_Bytes_per_trans;
余数=(sizeof (txArray)- 1)% NUM_TX_Bytes_per_trans;
#if 0
UARTFIFOWrite (SOC_UART_1_regs、"Hello World"、0x0B);
unsigned char recv_array[11]={0}、TX_array[11]={"Hello World"};
int i = 0;
对于(i = 0;i < 11;i++){
UARTFIFOCharPut (SOC_UART_1_regs、TX_array[i]);
recv_array[i]= UARTFIFOCharGet (SOC_UART_1_regs);
}
#endif
#if 1.
while (1)
{
/*如果传输尚未完成,则输入此分支。 *
if (true == txEmptyFlag)
{
if (bIndex < numByteChunks)
{
/*以 NUM_TX_BYes_PER_TRANS 块形式传输的字节。 *
currNumTxBytes += UARTFIFOWrite (SOC_UART_1_regs、
&txArray[currNumTxBytes]、
num_tx_bytes_per_trans);
b 索引++;
}
其他
{
/*从数据块传输剩余数据。 *
currNumTxBytes += UARTFIFOWrite (SOC_UART_1_regs、
&txArray[currNumTxBytes]、
余数字节);
}
txEmptyFlag = false;
/*
**重新启用发送中断。 该中断
**在 UART ISR 的发送部分被禁用。
*
UARTIntEnable (SOC_UART_1_regs、UART_INT_THR);
}
}
#endif
}
/*
**执行 FIFO 配置的包装程序函数。
*
静态空 UartFIFOConfigure (空)
{
unsigned int fifoConfig = 0;
/*
**-发送触发级别粒度为4
**-接收器触发级别粒度为1
**-发送 FIFO 空间设置为56。 因此 TX 触发电平
**为8 (64 - 56)。 TX FIFO 大小为64字节。
**-接收器触发级别为1。
**-清除发送 FIFO。
**-清除接收器 FIFO。
**-应通过 SCR 寄存器启用 DMA 模式。
**-启用 DMA 模式0。 DMA 模式0对应于否
** DMA 模式。 有效禁用 DMA 模式。
*
FIFO 配置= UART_FIFO_CONFIG (UART_TRIG_LVL_CHARINERING_4、
UART_TRIG_LVL_粒 度_1、
UART_FCR_TX_TRIG_LVL_56、
1、
1、
1、
UART_DMA_EN_PATH_SCR、
UART_DMA_MODE_0_ENABLE);
/*配置 FIFO 设置。 *
UARTFIFOConfig (SOC_UART_1_regs、FIFO 配置);
}
/*
**执行波特率设置的包装程序函数。
*
静态空 UartBaudRateSet (空)
{
unsigned int visorValue = 0;
/*计算除数值。 *
visorValue = UARTDivisorValCompute (UART_MODULE_INPUT_CLK、
BAUD_RATE _115200、
UART16x_OPER_MODE、
UART_MI_OPAMPLING_RATE 42);
/*对分频器锁存器进行编程。 *
UARTDivisorLatchWrite (SOC_UART_1_regs、DIVORValue);
}
/*
**执行中断配置的包装程序函数。
*
静态空 UartInterruptEnable (空)
{
/*在 ARM 处理器的 CPSR 中启用 IRQ。 *
IntMasterIRQEnable();
/*配置 AINTC 以接收 UART0中断。 *
UART1AINTCConfigure();
/*启用指定的 UART 中断。 *
UARTIntEnable (SOC_UART_1_regs、(UART_INT_LINE_STAT | UART_INT_THR |
UART_INT_RHR_CTI));
// UARTIsr();
}
/*
** UART 的中断服务例程。
*
静态空 UARTIsr (空)
{
unsigned int rxErrorType = 0;
unsigned char rxByte = 0;
unsigned int ID = 0;
unsigned int idx = 0;
/*检查 UART 中断源。 *
intId = UARTIntIdentityGet (SOC_UART_1_regs);
switch (intId)
{
案例 UART_INTID_TX_THRES_REACH:
/*
**检查整个转换是否完成。 如果是这样
**条件失败,则整个传输已完成。
*
if (currNumTxBytes <(sizeof (txArray)- 1))
{
txEmptyFlag = true;
}
/*
**禁用 THR 中断。 即使是、也必须执行此操作
**传输没有完成,以防止传输
**要持续生成的空中断。
*
UARTIntDisable (SOC_UART_1_regs、UART_INT_THR);
中断;
案例 UART_INTID_RX_THRES_REACH:
rxByte = UARTCharGetNonBlocking (SOC_UART_1_regs);
UARTCharPutNonBlocking (SOC_UART_1_regs、rxByte);
中断;
案例 UART_INTID_RX_LINE_STAT_ERROR:
rxErrorType = UARTRxErrorGet (SOC_UART_1_regs);
/*检查是否发生溢出错误。 *
if (rxErrorType 和 UART_LSR_RX_OE)
{
控制台 UtilsPrintf ("\r\n 发生 UART 溢出错误。"
"读取和回传 RX FIFO 中的所有数据。\r\n);
/*读取整个 RX FIFO 和 RX 移位寄存器中的数据。 *
对于(idx = 0;idx <(RX_FIFO_SIZE + 1);idx++)
{
rxByte = UARTFIFOCharGet (SOC_UART_1_regs);
ConsoleUtilsPrintf ("%c\n"、rxByte);
UARTFIFOCharPut (SOC_UART_1_regs、rxByte);
}
中断;
}
/*检查是否发生了中断条件。 *
否则 if (rxErrorType & UART_LSR_RX_BI)
{
控制台 UtilsPrintf ("\r\n 发生 UART 中断条件。");
}
/*检查是否发生帧错误。 *
否则 if (rxErrorType & UART_LSR_RX_FE)
{
控制台 UtilsPrintf ("\r\n 发生 UART 帧错误。");
}
/*检查是否发生了奇偶校验错误。 *
否则 if (rxErrorType & UART_LSR_RX_PE)
{
ConsoleUtilsPrintf ("\r\n 发生 UART 奇偶校验错误。");
}
控制台 UtilsPrintf (" RX FIFO 顶部的数据为:");
rxByte = UARTFIFOCharGet (SOC_UART_1_regs);
ConsoleUtilsPrintf ("%c\n"、rxByte);
UARTFIFOCharPut (SOC_UART_1_regs、rxByte);
中断;
案例 UART_INTID_CHAR_TIMEOUT:
控制台 UtilsPrintf ("\r\n 发生 UART 字符超时中断。"
"读取和回传 RX FIFO 中的所有数据。\r\n);
/*读取 RX FIFO 中的所有数据。 *
while (true = UARTCharsAvail (SOC_UART_1_regs))
{
rxByte = UARTFIFOCharGet (SOC_UART_1_regs);
ConsoleUtilsPrintf ("%c\n"、rxByte);
UARTFIFOCharPut (SOC_UART_1_regs、rxByte);
}
中断;
默认值:
中断;
}
}
/*
**此函数将 AINTC 配置为接收 UART 中断。
*
静态空 UART1AINTCConfigure (空)
{
/*初始化 ARM 中断控制器。 *
IntAINTCInit();
/*注册中断服务例程(ISR)。 *
内部寄存器(SYS_INT_UART1INT、UARTIsr);
/*在 AINTC 中设置系统中断的优先级。 *
IntPrioritySet (SYS_INT_UART1INT、0、AINTC_HOSTINT_route_IRQ);
/*在 AINTC 中启用系统中断。 *
IntSystemEnable (SYS_INT_UART1INT);
}
/********* 文件结尾 /
谢谢、此致、
Shubhakara P S