IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 10、串口DMA(第9写的太烂了,稍微整理一下) -> 正文阅读

[嵌入式]10、串口DMA(第9写的太烂了,稍微整理一下)

UART1_DMA.c

char Uart1_DMA_Rxdata[DMA_DATA_LEN];
char Uart1_DMA_Txdata[DMA_DATA_LEN];
u16 DMA_Rx_LEN = 0;



void Usart1_Config(u32 bound)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	USART_InitTypeDef USART1_nitStructure;
	NVIC_InitTypeDef USART1_NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	USART_DeInit(USART1);
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART1_nitStructure.USART_BaudRate=bound;
	USART1_nitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART1_nitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
	USART1_nitStructure.USART_Parity=USART_Parity_No;
	USART1_nitStructure.USART_StopBits=USART_StopBits_1;
	USART1_nitStructure.USART_WordLength=USART_WordLength_8b;
	USART_Init(USART1,&USART1_nitStructure);
	USART_Cmd(USART1,ENABLE);
	
	USART1_NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	USART1_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=15;
	USART1_NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	USART1_NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收(非空)中断
//	USART_ITConfig(USART1, USART_IT_TC, ENABLE);//发送为空
	USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);//串口空闲中断
	NVIC_Init(&USART1_NVIC_InitStructure);

}


//重定义fputc函数
int fputc(int ch, FILE *f)
{
		USART_SendData(USART1, (uint8_t) ch);
		while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);			
		return (ch);
}
int fgetc(FILE *f)
{
		while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
		return (int)USART_ReceiveData(USART1);
}



void Usart1_DMA1_Config(u32 Tx_Addr,u16 Tx_Addr_DataNumber,u32 Rx_Addr,u16 Rx_Addr_DataNumber)
{
	
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
	DMA_InitTypeDef DMA_InitStruct;
	NVIC_InitTypeDef DMA1_NVIC_InitStruct;
	
	DMA1_NVIC_InitStruct.NVIC_IRQChannel=DMA1_Channel4_IRQn;
	DMA1_NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=14;
	DMA1_NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;
	DMA1_NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);
	NVIC_Init(&DMA1_NVIC_InitStruct);

	
	DMA_InitStruct.DMA_MemoryBaseAddr=Tx_Addr;
	DMA_InitStruct.DMA_PeripheralBaseAddr=(u32)&USART1->DR;
	DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
	DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;
	DMA_InitStruct.DMA_BufferSize=Tx_Addr_DataNumber;
	DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
	DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
	DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
	DMA_InitStruct.DMA_Priority=DMA_Priority_VeryHigh;
	DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
	DMA_Init(DMA1_Channel4,&DMA_InitStruct);
		
	DMA_InitStruct.DMA_MemoryBaseAddr=Rx_Addr;
	DMA_InitStruct.DMA_PeripheralBaseAddr=(u32)&USART1->DR;
	DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
	DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralSRC;
	DMA_InitStruct.DMA_BufferSize=Rx_Addr_DataNumber;
	DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
	DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
	DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
	DMA_InitStruct.DMA_Priority=DMA_Priority_VeryHigh;
	DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
	USART_DMACmd(USART1,USART_DMAReq_Tx|USART_DMAReq_Rx,ENABLE);
//	DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
	DMA_Init(DMA1_Channel5,&DMA_InitStruct);
	DMA_Cmd(DMA1_Channel4,ENABLE);
	DMA_Cmd(DMA1_Channel5,ENABLE);	
}

void DMA1_Enable(DMA_Channel_TypeDef* DMAy_Channelx,u16 DataNumber)
{
	DMA_Cmd(DMAy_Channelx,DISABLE);
	DMA_SetCurrDataCounter(DMAy_Channelx,DataNumber);
	DMA_Cmd(DMAy_Channelx,ENABLE);
}

stm32f10x_it.c【疑问:在写中断函数名时候,不知道去哪里找】

void USART1_IRQHandler(void)
{
	
	if(USART_GetITStatus(USART1, USART_IT_IDLE) == 1 )//接收空闲中断//接收完成
	{

		DMA_Cmd(DMA1_Channel5,DISABLE);//关闭接收
		DMA_Rx_LEN =200-DMA_GetCurrDataCounter(DMA1_Channel5);//实际接收数据大小(动态求数据量)
		
//		DMA_Cmd(DMA1_Channel4,DISABLE);
//		DMA_SetCurrDataCounter(DMA1_Channel4,DMA_Rx_LEN);//设置发送数据
//		DMA_Cmd(DMA1_Channel4,ENABLE);//使能发送
		
		DMA1_Enable(DMA1_Channel4,DMA_Rx_LEN);//等效前面3句
	
		USART1->SR;
		USART1->DR;//必须先读SR,再读DR,才能清除接收空闲标志位
		USART_ClearITPendingBit(USART1,USART_IT_IDLE);
	}
}
void DMA1_Channel4_IRQHandler(void)
{

	if(DMA_GetITStatus(DMA1_IT_TC4) == 1 )//发送完成
	{
		
		DMA_Cmd(DMA1_Channel4,DISABLE);	//关闭发送
//		DMA_Cmd(DMA1_Channel5,DISABLE);//关闭接收
//		DMA_SetCurrDataCounter(DMA1_Channel5,200);//配置接收
//		DMA_Cmd(DMA1_Channel5,ENABLE);//使能接收
		
		DMA1_Enable(DMA1_Channel5,200);//等效前面3句
		DMA_ClearITPendingBit(DMA1_IT_TC4);
	}

}	

main.c

int main(void)
{	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);	
	SysTick_Config(SystemCoreClock/1000);
	LED_GPIO_Config();
	Usart1_Config(115200);
	Usart1_DMA1_Config((u32) Uart1_DMA_Rxdata,(u16)sizeof(Uart1_DMA_Rxdata),(u32) Uart1_DMA_Rxdata,(u16) sizeof(Uart1_DMA_Rxdata));
	
	while(1)
	{
		if(SysTickTime>=1000)//1S流水灯
		{
		
			
			GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)?
			GPIO_ResetBits(GPIOC, GPIO_Pin_13),
			SysTickTime=0: 
			GPIO_SetBits(GPIOC, GPIO_Pin_13),
			SysTickTime=0;
			

			printf("\r\nDMA_Rx_LEN=%d\r\n",DMA_Rx_LEN);
			DMA_Rx_LEN=0;//清空接收数据大小
		}

	}
}

数据量太小了 传输进度没搞出来

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:38:55  更:2022-01-17 11:38:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:25:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码