永发信息网

STM32的usart的DMA方式发送 一个数 ,程序怎么写?

答案:3  悬赏:50  手机版
解决时间 2021-11-25 06:30
  • 提问者网友:無理詩人
  • 2021-11-25 00:33
STM32的usart的DMA方式发送 一个数 ,程序怎么写?
最佳答案
  • 五星知识达人网友:持酒劝斜阳
  • 2021-11-25 01:29
我是用的原子的寄存器版的,

串口部分初始化部分加入这个
USART1->CR3=1<<7; //使能串口1的DMA发送
这是初始化
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)TData,32);//DMA1通道4,外设为串口1,存储器为SendBuff,长度32.
下面是DMA.C文件里的配置

u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度
//DMA1的各通道配置
//这里的传输形式是固定的,这点要根据不同的情况来修改
//从存储器->外设模式/8位数据宽度/存储器增量模式
//DMA_CHx:DMA通道CHx
//cpar:外设地址
//cmar:存储器地址
//cndtr:数据传输量
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
u32 DR_Base; //做缓冲用,不知道为什么.非要不可
RCC->AHBENR|=1<<0;//开启DMA1时钟
DR_Base=cpar;
DMA_CHx->CPAR=DR_Base; //DMA1 外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
DMA_CHx->CCR=0x00000000;//复位
DMA_CHx->CCR|=1<<1; //TCIE:允许传输完成中断
DMA_CHx->CCR|=1<<4; //从存储器读
DMA_CHx->CCR|=0<<5; //普通模式
DMA_CHx->CCR|=0<<6; //外设地址非增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=0<<8; //外设数据宽度为8位
DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
DMA_CHx->CCR|=1<<12; //中等优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
MY_NVIC_Init(2,1,DMA1_Channel4_IRQChannel,3); //抢占优先级3,响应优先级0,组3
}

//开启一次DMA传输
void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
{
DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
DMA_CHx->CCR|=1<<0; //开启DMA传输
}

void DMAChannel4_IRQHandler(void)
{
if (DMA1->ISR & (1<<13)) {
DMA1->IFCR|=1<<13;//清除通道4传输完成标志

}
}

然后每次使用调用一次这个
MYDMA_Enable(DMA1_Channel4);//开始一次DMA传输
就可以了追问额,我的问题已经解决过了,不过有新问题了,就是把从DMA接收到的数再发送给串口助手这里,发送到串口助手的数总是一个数(04)和DMA接收到的数不一样,不知道你有什么建议?追答不知道你是不是取地址时取错了。。追问额,应该怎么取地址啊?追答额。。谢谢
全部回答
  • 1楼网友:三千妖杀
  • 2021-11-25 03:47
自己配置?那就是有地方配置错了
  • 2楼网友:鸠书
  • 2021-11-25 02:20
写出你的配置过程
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯