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

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

我是用的原子的寄存器版的,

串口部分初始化部分加入这个

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传输

就可以了

这是一个中断服务程序,每次中断发生时,才会执行,因此函数里面的局部变量USART_RX_counter每次都会被置0,因此这个缓存USART_RX_BUF里面只会有一个数据;应该把变量USART_RX_counter定位为全局变量,才可以。

u8 USART_RX_counter=0   //全局变量定义

void USART1_IRQHandler(void)  

{

   裂凯吵 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  

    {

USART_RX_BUF[USART_RX_counter]=USART_ReceiveData(USART1)

if(USART_RX_counter==0&&USART_RX_BUF[0]!=0x55) 

    return

USART_RX_counter++

if(USART_RX_counter==11) 

   肆侍   孙扮   USART_RX_counter=0

         USART_ClearITPendingBit(USART1,USART_IT_RXNE)

         USART_RX_flag=1

}

    }

}

调用该函数后,USART1的传送速率是多少?--115200 ,因为肢戚大 USART_BaudRate = 115200

调用该函数后,USART1在数据传送过程中有无进行奇偶历竖校验?--无仔消,因为USART_Parity = USART_Parity_No


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12259300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存