主题中讨论的其他器件: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)。 配置中是否需要校正?