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.

[参考译文] TM4C129ENCPDT:如何在 FreeRTOS 中使用中断方法为 UART 配置 UDMA

Guru**** 2386600 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1307178/tm4c129encpdt-how-to-configure-udma-for-uart-using-interrupt-method-in-freertos

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:EK-TM4C1294XL

您好!

我需要使用中断方法为 UART 启用 uDMA。 我可以使用轮询方法建立通信、但当我转到中断方法时、它不会进入回调。 我在下面附上代码供参考。

#包含
#包含
#包含
#include "main.h"
#include "drivers/pinout.h"
#include "drivers/uart.h"

// TivaWare 包含
#include "driverlib/sysctl.h"
#include "driverlib/debug.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"

#include "inc/hw_memmap.h"
#include "inc/hw_uart.h"
#include "inc/hw_ints.h"
#include "driverlib/udma.h"
#include "driverlib/uart.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"

// FreeRTOS 包括
#include "FreeRTOSConfig.h"
#include "freertos.h"
#include "task.h"

#define table_size 1024

//为 uDMA 控制表分配空间
//uint8_t udmaControlTable[table_size];
//#pragma DATA_ALIGN (udmaControlTable、table_size)


//您的数据数组
char data[]="您好,这是使用 DMA 和 FreeRTOS 通过 UART 发送的测试消息。\n\n";

void vTaskfun (void *pvParameter)
{
uDMAChannelTransferSet (uDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT、
udma_mode_basic、(void *) data、
(void *)(UART0_BASE + UART_O_DR)、strlen (data));
uDMAChannelEnable (uDMA_CHANNEL_UART0TX);
while (1)
{
uDMAChannelTransferSet (uDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT、
udma_mode_basic、(void *) data、
(void *)(UART0_BASE + UART_O_DR)、strlen (data));
uDMAChannelEnable (uDMA_CHANNEL_UART0TX);
vTaskDelay (1000);


void UART_DMA_IRQHandler (void)
{
//清除中断状态
uDMAIntClear (uDMA_CHANNEL_UART0TX);

空 ConfigureUART (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);

UARTConfigSetExpClk (UART0_BASE、SYSTEM_CLOCK、115200、
UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
uart_config_PAR_NONE);

void ConfigureDMA (void)
{
//为 uDMA 控制表分配空间
静态 uint8_t udmaControlTable[table_size];
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);

//初始化 uDMA 控制器
uDMAControlBaseSet (udmaControlTable);
uDMAEnable();

//启用 UART TX DMA 通道
uDMAChannelAssign (UDMA_CHANNEL_UART0TX);
uDMAChannelControlSet (uDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT、
udma_size_8 | udma_SRC_INC_8 | udma_dst_INC_none |
uDMA_ARB_4);

//配置 UART TX DMA 传输
uDMAChannelTransferSet (uDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT、
udma_mode_basic、(void *) data、
(void *)(UART0_BASE + UART_O_DR)、strlen (data));

//启用 UART TX DMA 中断
IntEnable (uDMA_CHANNEL_UART0TX);

//为 TX 启用 UART DMA 模块
UARTDMAEnable (UART0_BASE、UART_DMA_TX);

//在 UART 模块中启用 UART TX DMA 中断
UARTIntEnable (UART0_BASE、UART_INT_DMATX);

//启用 uDMA 中断
IntEnable (INT_UDMA);

//注册 UART 中断处理程序
IntRegister (INT_UDMA、UART_DMA_IRQHandler);


int main (空)
{
basetype_t xReturn = pdPass;

//将时钟设置为120 MHz
uint32_t output_clock_rate_Hz = SysCtlClockFreqSet (
(SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、
system_clock);
assert (output_clock_rate_Hz = system_clock);

//初始化外设、DMA 和 UART
ConfigureUART();
ConfigureDMA();

//启用全局中断
IntMasterEnable();

//创建任务
xReturn = xTaskCreate (vTaskfun、"UART 任务"、configMINIMAL_STACK_SIZE、NULL、1、 null);

如果(xReturn == pdPASS)
{
//启动调度程序
vTaskStartScheduler();

//代码永远不会达到此点
while (1)
{

在上述代码中、程序未到达处理程序函数 UART_DMA_IRQHandler (void)。 配置中是否需要校正?

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

    您好!

     请参阅 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\udma_demo\udma_demo.c 示例。 您需要使用 UART 中断、而不是 uDMA 中断来处理 UART 的 uDMA 传输。 请查看 示例中的 UART1IntHandler ()。  

     另请注意,这是一个美国节日周。 响应将延迟。