uint8_t printf_tx_dma_save[64]={0};
uint8_t printf_rx_dma_save[64]={0};
void printf_init(void)
{
LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_4,(uint32_t)*&printf_tx_dma_save,LL_USART_DMA_GetRegAddr(USART1),LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_5,LL_USART_DMA_GetRegAddr(USART1 ), (uint32_t)*&printf_rx_dma_save, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
}
uint8_t printf_tx(char* format, ...)
{
unsigned int i = 0;
LL_DMA_ClearFlag_TC4(DMA1);
LL_DMA_DisableChannel(DMA1 ,LL_DMA_CHANNEL_4);
va_list ap; //定义一个va_list型的变量,这个变量是指向参数的指针.
va_start(ap, format); //用va_start宏初始化变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
i = vsnprintf((char*)printf_tx_dma_save, 64, format, ap); //注意,不要漏掉前面的_
va_end(ap); //用va_end宏结束可变参数的获取
LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_4,i);//DMA输出长度
LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_4);//启动DMA传输
return i; //返回参数的字符个数中间有逗号间隔
}
这是使用代码
这里是配置的内容,使用的是LL库(cube生成)
LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_4, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_4, LL_DMA_PRIORITY_LOW);
LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_4, LL_DMA_MODE_NORMAL);
LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_4, LL_DMA_PERIPH_NOINCREMENT);
LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_4, LL_DMA_MEMORY_INCREMENT);
LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_4, LL_DMA_PDATAALIGN_BYTE);
LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_4, LL_DMA_MDATAALIGN_BYTE);
感觉就像DMA根本没有开始传输,但是该打开的都打开了==
同时DMA1 第1通道循环模式搬运ADC数据,运行的很正常
怀疑有可能1通道挤占了4通道,但是我后来把1通道给关了,依旧没用==
求大佬解惑
这是cube的设置
一周热门 更多>