- TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
- TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
- TMR_TimeBaseStruct.division = 167;
- TMR_TimeBaseStruct.period = 999;
- TMR_TimeBaseStruct.repetitionCounter = 0;
- TMR_ConfigTimeBase(TMR8, &TMR_TimeBaseStruct);
- ...
- TMR_ConfigDMA(TMR8, TMR_DMA_BASE_AUTORLD, TMR_DMA_BURSTLENGTH_3TRANSFERS);
- TMR_EnableDMASoure(TMR8, TMR_DMA_SOURCE_UPDATE);
2.配置DMA2
根据F4的用户手册,将DMA配置成定时器8的更新触发,目标寄存器为定时器8的DMADDR寄存器。
- DMA_Config_T dmaConfig;
- RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_DMA2);
- dmaConfig.bufferSize = sizeof(ConfigBuf);
- dmaConfig.memoryDataSize = DMA_MEMORY_DATA_SIZE_HALFWORD;
- dmaConfig.peripheralDataSize = DMA_PERIPHERAL_DATA_SIZE_HALFWORD;
- dmaConfig.memoryInc = DMA_MEMORY_INC_ENABLE;
- dmaConfig.peripheralInc = DMA_PERIPHERAL_INC_DISABLE;
- dmaConfig.loopMode = DMA_MODE_CIRCULAR;
- dmaConfig.priority = DMA_PRIORITY_HIGH;
- dmaConfig.dir = DMA_DIR_MEMORYTOPERIPHERAL;
- dmaConfig.memoryBaseAddr = (uint32_t)ConfigBuf;
- dmaConfig.peripheralBaseAddr = (uint32_t)&TMR8->DMADDR;
- dmaConfig.channel = DMA_CHANNEL_7;
- dmaConfig.fifoMode = DMA_FIFOMODE_ENABLE;
- dmaConfig.fifoThreshold = DMA_FIFOTHRESHOLD_FULL;
- dmaConfig.peripheralBurst = DMA_PERIPHERALBURST_SINGLE;
- dmaConfig.memoryBurst = DMA_MEMORYBURST_SINGLE;
- DMA_Config(DMA2_Stream1, &dmaConfig);
- DMA_Enable(DMA2_Stream1);
3.配置数组
根据需要输出的信号,编写相应的数组。根据定时器的配置,计数器加1时间为1us。那么第一次更新后,DMA将54,0,24分别赋值到定时器8的计数值,重复计数值,比较值。那么输出的信号为为24us的高电平,32us的低电平。定时器更新后产生DMA更新信号,下一组的信号则为8us的高电平,16us的电平。后面则以此类推。这里的话将8us作为一个串口单位,则对于串口波特率为125000。
- uint16_t ConfigBuf[120] = {56,0,24,24,0,8 ,16,0,8 ,24,0,16,
- 16,0,8, 24,0,8,24,0,16 ,40,0,16,
- 24,0,16, 24,0,16, 40,0,16,
- 24,0,16, 24,0,16, 24,0,16,
- 40,0,32, 24,0,16, 64,0,16,
- 24,0,8, 24,0,16,
- 32,0,24, 16,0,8, 16,0,8, 24,0,16,
- 40,0,32, 24,0,16, 32,0,16,
- 24,0,8, 32,0,24, 40,0,16,
- 24,0,16, 24,0,16, 40,0,16,
- 24,0,8, 24,0,16,24,0,16,
- 40,0,8, 24,0,8, 999, 0 ,1000};
结果
将定时器8的输出IO引脚接到串口的Rx引脚上,波特率选择125000,8bit,无校验位。复位开发板后,可以看见串口正常接收。

结论
使用TMR和DMA输出特定波形模拟其他信号通信,具有高精度、低CPU开销、灵活性和实时性等优点。通过合理配置TMR和DMA,可以实现各种复杂的信号生成和处理任务,满足不同应用场景的需求。本文通过一个具体的例子,展示了如何使用TMR和DMA模拟125000波特率的UART信号发送,为类似的应用提供了参考。