This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM3359:Starterware AM3358 UART1、UART2、UART3、UART4和 UART5

Guru**** 2539500 points
Other Parts Discussed in Thread: AM3359

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1002141/am3359-starterware-am3358-uart1-uart2-uart3-uart4-and-uart5

器件型号:AM3359

尊敬的 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shubhakara、您好!

    这是旧的 Starterware 版本还是 Processor SDK 版本中包含的 Starterware (如 pdk<>/packages/ti/starterware 下的 Starterware)? 请提供详细信息吗?

    我们不支持传统 Starterware。 您可能需要安装 Processor SDK 并检查是否可以在 PDK 软件中获取 UART。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Aravind、

    这是 Processor SDK 发行版中包含的 Starterware,我已经解决了 UART1的这个问题,我正在 UART2上工作,我在 UartInterruptEnable()函数上遇到了卡滞。 为了便于您参考、我将在此处粘贴我的代码、如果代码中有任何错误、请告诉我。

    文件:-  C:\ti\AM335X_StarterWare_02_00_01_01\platform\BeagleBone/UART.c  

    /**
    *\file uart.c
    *
    *\brief 此文件包含特定于平台的函数
    UART 的*配置。
    *

    /*
    *版权所有(C) 2010德州仪器(TI)公司- http://www.ti.com/
    *
    /*
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    *源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随提供的文档和/或其他材料
    *分发。
    *
    *德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"以及任何明示或暗示的保证、包括但不包括
    *仅限于对适销性和适用性的暗示保证
    *一项特定目的不予承认。 在任何情况下、版权均不得
    *所有者或贡献者应对任何直接、间接、偶然或
    *特殊、惩戒性或后果性损害(包括但不包括)
    *仅限于采购替代货物或服务;丧失使用、
    *数据或利润;或业务中断)
    *责任理论、无论是合同责任、严格责任还是侵权行为
    *(包括疏忽或其他)因使用而以任何方式产生
    *、即使被告知可能会发生此类损坏。
    *
    *


    #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;

    //由 shubhakar 添加
    否则 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;

    否则 if (2 == instanceNum)

    /* RXD */
    HWREG (SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD (2)=
    (CONTROL_CONF_UART2_RXD_CONF_UART2_RXD_PUTYPESEL |
    CONTROL_CONF_UART2_RXD_CONF_UART2_RXD_RXACTIVE);

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_UART_TXD (2)=
    CONTRAL_CONF_UART2_TXD_CONF_UART2_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模块配置(空)

    #if 1.
    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));
    #endif

    #if 0
    HWREG (SOC_PRCM_regs + CM_PER_UART1_CLKCTRL)|=
    CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE;

    while ((HWREG (SOC_PRCM_regs + CM_PER_UART1_CLKCTRL)&
    CM_PER_UART1_CLKCTRL_MODULEMODE)!= CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE);

    while (!(HWREG (SOC_PRCM_regs + CM_PER_L4LS_CLKSTCTRL)&
    (cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
    CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_UART_GFCLK)));
    #endif


    空 UART2ModuleClkConfig (空)

    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_UART2_CLKCTRL)|= CM_PER_UART2_CLKCTRL_MODULEMODE_ENABLE;


    while ((HWREG (SOC_CM_PER_Regs + CM_PER_UART2_CLKCTRL)&
    CM_PER_UART2_CLKCTRL_MODULEMODE)!= CM_PER_UART2_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_UART2_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_UART2_CLKCTRL)和
    CM_PER_UART2_CLKCTRL_MODULEMODE));

    /*
    **等待 CM_WKUP_UART0_CLKCTRL 寄存器中的 IDLEST 域达到
    **所需值。
    *
    while (((CM_PER_UART2_CLKCTRL_IDLEST_FUNC <<
    CM_PER_UART2_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_UART2_CLKCTRL)和
    CM_PER_UART2_CLKCTRL_IDLEST);

    文件:- DEX_Uart2.c (main)

    /*
    * DEX_Uart2.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);
    静态空 UART2AINTCConfigure (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;

    /*为 UART2实例配置系统时钟。 *
    UART2ModuleClkConfig();

    /*对 UART2实例执行引脚复用。 *
    UARTPinMuxSetup (2);

    /*执行模块重置。 *
    UARTModuleReset (SOC_UART_2_regs);

    /*执行 FIFO 配置。 *
    UartFIFOConfigure();

    /*执行波特率设置。 *
    UartBaudRateSet();

    /*切换到配置模式 B。*/
    UARTRegConfigModeEnable (SOC_UART_2_regs、UART_REG_CONFIG_MODE_B);

    /*对线路特性进行编程。 *
    UARTLineCharacConfig (SOC_UART_2_regs、
    (UART_FRAME_WORD_LENGTH_8 | UART_FRAME_NUM_STB_1)、
    UART_parity);

    /*禁用对 Divisor 锁存器的写入访问。 *
    UARTDivisorLatchDisable (SOC_UART_2_regs);

    /*禁用中断控制。 *
    UARTBreakCtl (SOC_UART_2_regs、UART_break_COND_disable);

    /*切换到 UART16x 操作模式。 *
    UARTOperatingModeSelect (SOC_UART_2_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_2_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_2_regs、TX_array[i]);
    recv_array[i]= UARTFIFOCharGet (SOC_UART_2_regs);

    #endif

    #if 1.

    while (1)

    /*如果传输尚未完成,则输入此分支。 *
    if (true == txEmptyFlag)

    if (bIndex < numByteChunks)

    /*以 NUM_TX_BYes_PER_TRANS 块形式传输的字节。 *
    currNumTxBytes += UARTFIFOWrite (SOC_UART_2_regs、
    &txArray[currNumTxBytes]、
    num_tx_bytes_per_trans);

    b 索引++;

    其他

    /*从数据块传输剩余数据。 *
    currNumTxBytes += UARTFIFOWrite (SOC_UART_2_regs、
    &txArray[currNumTxBytes]、
    余数字节);

    txEmptyFlag = false;

    /*
    **重新启用发送中断。 该中断
    **在 UART ISR 的发送部分被禁用。
    *
    // UARTIntEnable (SOC_UART_2_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_2_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_2_regs、DIVORValue);

    /*
    **执行中断配置的包装程序函数。
    *

    静态空 UartInterruptEnable (空)

    /*在 ARM 处理器的 CPSR 中启用 IRQ。 *
    IntMasterIRQEnable();

    /*配置 AINTC 以接收 UART0中断。 *
    UART2AINTCConfigure();

    /*启用指定的 UART 中断。 *
    UARTIntEnable (SOC_UART_2_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_2_regs);

    switch (intId)

    案例 UART_INTID_TX_THRES_REACH:

    /*
    **检查整个转换是否完成。 如果是这样
    **条件失败,则整个传输已完成。
    *
    if (currNumTxBytes <(sizeof (txArray)- 1))

    txEmptyFlag = true;

    /*
    **禁用 THR 中断。 即使是、也必须执行此操作
    **传输没有完成,以防止传输
    **要持续生成的空中断。
    *
    UARTIntDisable (SOC_UART_2_regs、UART_INT_THR);

    中断;

    案例 UART_INTID_RX_THRES_REACH:
    rxByte = UARTCharGetNonBlocking (SOC_UART_2_regs);
    UARTCharPutNonBlocking (SOC_UART_2_regs、rxByte);
    中断;

    案例 UART_INTID_RX_LINE_STAT_ERROR:

    rxErrorType = UARTRxErrorGet (SOC_UART_2_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_2_regs);
    ConsoleUtilsPrintf ("%c\n"、rxByte);
    UARTFIFOCharPut (SOC_UART_2_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_2_regs);
    ConsoleUtilsPrintf ("%c\n"、rxByte);
    UARTFIFOCharPut (SOC_UART_2_regs、rxByte);

    中断;

    案例 UART_INTID_CHAR_TIMEOUT:

    控制台 UtilsPrintf ("\r\n 发生 UART 字符超时中断。"
    "读取和回传 RX FIFO 中的所有数据。\r\n);

    /*读取 RX FIFO 中的所有数据。 *
    while (true = UARTCharsAvail (SOC_UART_2_regs))

    rxByte = UARTFIFOCharGet (SOC_UART_2_regs);
    ConsoleUtilsPrintf ("%c\n"、rxByte);
    UARTFIFOCharPut (SOC_UART_2_regs、rxByte);

    中断;

    默认值:
    中断;

    /*
    **此函数将 AINTC 配置为接收 UART 中断。
    *

    静态空 UART2AINTCConfigure (空)

    /*初始化 ARM 中断控制器。 *
    IntAINTCInit();

    /*注册中断服务例程(ISR)。 *
    内部寄存器(SYS_INT_UART2INT、UARTIsr);

    /*在 AINTC 中设置系统中断的优先级。 *
    IntPrioritySet (SYS_INT_UART2INT、0、AINTC_HOSTINT_route_IRQ);

    /*在 AINTC 中启用系统中断。 *
    IntSystemEnable (SYS_INT_UART2INT);

    /********* 文件结尾 /

    文件:- DEX_Uart1.c (main)

    /*
    * DEX_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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shubhakara、您好!  

    我叫 Andrew、我很乐意帮助您解决这个问题。  感谢您提供的信息。 我  现在正在就此与我的同事进行磋商,我们将在今后24-48小时内为您提供答复/后续行动。

    此致、

    Andrew

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、感谢 Andrew。

    此致、

    Shubhakara P S

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shubhakara、您好!

    我最诚挚的歉意、您是否能够上传文件而不是发布文本?  我们很难用您提供的代码段重新创建您的问题。

    与此同时,我将继续对此进行调查。

    此致、

    Andrew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shubhakara、您好!  

    只需办理入住手续、您是否仍有此问题?  如果是、您是否能够上传相关 文件?

    此致、

    Andrew