金牌会员
 
- 积分
- 1040
- 金钱
- 1040
- 注册时间
- 2022-4-20
- 在线时间
- 373 小时
|
发表于 2023-9-18 11:49:39
|
显示全部楼层
有点巧合了,我上个周刚刚做了一个F103的串口接收的DMA,不过使用的是标准库
- uint16_t DMA1_RX_LEN;
- void MYDMA_RX_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
- {
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
- DMA_DeInit(DMA_CHx); //将DMA的通道1寄存器重设为缺省值
- DMA1_RX_LEN=cndtr;
- DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMA外设基地址
- DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMA内存基地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存
- DMA_InitStructure.DMA_BufferSize = cndtr; //DMA通道的DMA缓存的大小
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
- DMA_Init(DMA_CHx, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
- }
- void MYDMA_RX_Enable(DMA_Channel_TypeDef*DMA_CHx)
- {
- DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 DMA1 所RX的通道
- DMA_SetCurrDataCounter(DMA_CHx,DMA1_RX_LEN);//DMA通道的DMA缓存的大小
- DMA_Cmd(DMA_CHx, ENABLE); //使能USART1 DMA1 所RX的通道
- }
复制代码
main这边是这样的,值得注意的是要记得在MYDMA_RX_Config之后要MYDMA_RX_Enable。
- MYDMA_RX_Config(DMA1_Channel5, (u32)&USART1->DR, (u32)SetcmdBUF, BIG_BUF_SIZE);//DMA1通道5,外设为串口1RX,存储器为SetcmdBUF,长度BUF_SIZE.
- MYDMA_RX_Enable(DMA1_Channel5);
复制代码
串口就是弄个空闲中断,然后使能一下接收,我是放在串口初始化里面的
- USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1的DMA接收
复制代码
最后就是中断的处理
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
- {
- USART_ReceiveData(USART1);//读取接收到的数据,这个我也不知道为什么是这样的,但是我没有改动它
- USART_ClearITPendingBit(USART1, USART_IT_IDLE);
- MYDMA_RX_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)SetcmdBUF,BIG_BUF_SIZE);//DMA1通道5,外设为串口1RX,存储器为SetcmdBUF,长度BUF_SIZE.
- MYDMA_RX_Enable(DMA1_Channel5);
- }
- }
复制代码
|
|