Thread 中讨论的其他器件:EK-TM4C1294XL
工具/软件:
您好、
我使用 TImer2A 作为 DMA 触发器、将数据块移动到 GPIO 端口。 如果计时器处于 TIMER_CFG_A_PERIODENT 模式、则一切都正常运行。
方法是通过并行通信将数据传输到外围器件。 其中一个位用作锁存信号、用于让外设知道数据已就绪。 通过这种方法、我必须重复存储器中的每个字节、以允许锁存信号在中间变化。
为了改善机制并避免重复、我认为将 Timer2A 更改为 PWM 模式并将 PWM 信号输出到 T2CCP0 (PA4)、并使用 PWM 输出作为锁存信号。
但是、一旦我切换到 PWM 模式、DMA 就会停止工作。
我没有忘记在 PWM 模式下调用 TImerMatchSet ()。
我还将 PA4 正确配置为 T2CCP0、并且在这个引脚上看到了 PWM 信号。 这意味着 Timer2 PWM 可以工作、但不再与 DMA 一起工作。
以下是我的代码:
#define LED_CLK_PORT  SYSCTL_PERIPH_GPIOA 
#define LED_CLK_BASE GPIO_PORTA_BASE   
#define LED_CLK      GPIO_PIN_4 
#define LED_DATA_PORT  SYSCTL_PERIPH_GPIOD 
#define LED_DATA_BASE GPIO_PORTD_BASE   
#define LED_R1      GPIO_PIN_0 
#define LED_G1      GPIO_PIN_1 
#define LED_B1      GPIO_PIN_2 
#define LED_R2      GPIO_PIN_3 
#define LED_G2      GPIO_PIN_4 
#define LED_B2      GPIO_PIN_5 
#define LED_CLKE  GPIO_PIN_6 
#define LED_LAD GPIO_PIN_7 
#define LED_DATA_PINS  (LED_R1 | LED_G1 | LED_B1 | LED_R2 | LED_G2 | LED_B2 | LED_CLKE) 
#define LED_LAD_ON      GPIOPinWrite (LED_DATA_BASE、LED_LAD、0xff) 
#define LED_LAD_OFF   GPIOPinWrite (LED_DATA_BASE、LED_LAD、0x00) 
#define LED_CTRL_PORT  SYSCTL_PERIPH_GPIOE 
#define LED_CTRL_BASE GPIO_PORTE_BASE   
#define LED_A   GPIO_PIN_0 
#define LED_B   GPIO_PIN_1 
#define LED_C   GPIO_PIN_2 
#define LED_D   GPIO_PIN_3 
#define LED_OE GPIO_PIN_4 
#define LED_CTRL_PINS (LED_A | LED_B | LED_C | LED_D | LED_OE) 
#define LED_ROW_SEL (x)   GPIOPinWrite (LED_CTRL_BASE、LED_CTRL_PINS、LED_OE |(x)) 
#define LED_ROW_ON      GPIOPinWrite (LED_CTRL_BASE、LED_OE、0x00) 
Void 
dmaInit() 
{ 
  //************************************************************************************ 
  SysCtlPeripheralEnable (LED_DATA_PORT); 
  SysCtlPeripheralEnable (LED_CTRL_PORT); 
  HWREG (LED_DATA_BASE + GPIO_O_LOCK)= 0x4C4F434B; 
  HWREG (LED_DATA_BASE + GPIO_O_CR)= 0xff; 
  GPIOPinTypeGPIOOutput (LED_DATA_BASE、LED_DATA_PINS | LED_LAD); 
  GPIOPadConfigSet (LED_DATA_BASE、LED_DATA_PINS | LED_LAD、GPIO_strength_2mA、GPIO_PIN_TYPE_STD); 
  GPIOPinWrite (LED_DATA_BASE、LED_DATA_PINS | LED_LAD、0x00); 
  HWREG (LED_DATA_BASE + GPIO_O_LOCK)= 0xaaaaaaaaaa; 
  GPIOPinTypeGPIOOutput (LED_CTRL_BASE、LED_CTRL_PINS); 
  GPIOPadConfigSet (LED_CTRL_BASE、LED_CTRL_PINS、GPIO_strength_4mA、GPIO_PIN_TYPE_STD); 
  GPIOPinWrite (LED_CTRL_BASE、LED_CTRL_PINS、LED_OE); 
  SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER2); 
  while(!SysCtlPeripheralReady (SYSCTL_PERIPH_TIMER2)){} 
  TimerConfigure (TIMER2_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PERIODENT); 
  TimerDisable (TIMER2_BASE、TIMER_A);//配置前禁用 
  TimerLoadSet (TIMER2_BASE、TIMER_A、20); 
  TimerMatchSet (TIMER2_BASE、TIMER_A、10); 
  TimerControlLevel (TIMER2_BASE、TIMER_A、0); 
  //使计时器能够在超时时触发 DMA 
  TimerDMAEventSet (TIMER2_BASE、TIMER_DMA_TIMEOUT_A); 
  GPIOPinConfigure (GPIO_PA4_T2CCP0); 
  GPIODirModeSet (LED_CLK_BASE、LED_CLK、GPIO_DIR_MODE_HW); 
  GPIOPadConfigSet (LED_CLK_BASE、LED_CLK、GPIO_strength_2mA、GPIO_PIN_TYPE_STD); 
  SysCtlPeripheralEnable (SYSCTL_PERIPH_UDMA); 
  while(!SysCtlPeripheralReady (SYSCTL_PERIPH_UDMA)){} 
  uDMAEnable(); 
  uDMAControlBaseSet (DmaControlTable); 
  uDMAChannelAssign (UDMA_CH14_TIMER2A);//确保这是 Timer0A 的正确通道 
  uDMAChannelControlSet (UDMA_CH14_TIMER2A | UDMA_PRI_SELECT、 
             UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); 
  uDMAChannelAttributeDisable (UDMA_CH14_TIMER2A、UDMA_ALT_SELECT | UDMA_ATTR_HIGH_Priority | UDMA_ATTR_REQMASK); 
  TimerEnable (TIMER2_BASE、TIMER_A); 
  SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER3); 
  while(!SysCtlPeripheralReady (SYSCTL_PERIPH_TIMER3)){} 
  TimerDisable (TIMER3_BASE、TIMER_A);//配置前禁用 
  TimerConfigure (TIMER3_BASE、TIMER_CFG_PERIODENT);//或 TIMER_CFG_PERIODY_UP 
  TimerLoadSet (TIMER3_BASE、TIMER_A、SysClock / 60 - 1);//4 位颜色 
  IntPrioritySet (INT_TIMER3A、WATCHDOG_PERIORITY); 
  IntEnable (INT_TIMER3A); 
  TimerIntEnable (TIMER3_BASE、TIMER_TIMA_TIMEOUT); 
  TimerEnable (TIMER3_BASE、TIMER_A); 
} 
Void 
Timer3aIsr () 
{ 
  TimerIntClear (TIMER3_BASE、TIMER_TIMA_TIMEOUT); 
  uDMAChannelTransferSet (UDMA_CH14_TIMER2A | UDMA_PRI_SELECT、 
                UDMA_MODE_BASIC、 
                帧、 
                (void *)(LED_DATA_BASE +(GPIO_O_DATA +(0x7f << 2)))、 
                LED_FRAME_LEN); 
  uDMAChannelEnable (UDMA_CH14_TIMER2A); 
  ... 
}
 
				 
		 
					 
				
