stm32f407单片机底层应用程序_usart1

usart1.c

#include "usart1.h"



void My_USART1_Init(USART_TypeDef* USARTx,u32 bound)
{
	GPIO_InitTypeDef     GPIO_InitStructure;
	USART_InitTypeDef   USART_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
		
	//GPIO	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,  GPIO_AF_USART1); 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);  
		
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
			
	//USART
	USART_InitStructure.USART_BaudRate = bound;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode =  USART_Mode_Rx | USART_Mode_Tx;	
	USART_Init(USARTx,&USART_InitStructure);
	

	
		
	USART_DMACmd(USARTx, USART_DMAReq_Rx, ENABLE);	
	USART_DMACmd(USARTx, USART_DMAReq_Tx, ENABLE);	
	USART_ITConfig(USARTx, USART_IT_IDLE, ENABLE); 
	
	USART_Cmd(USARTx,ENABLE);
	

}

void USART_DMA_IDLE_Interrupt_Init(u8 IRQCh,u8 prePriority,u8 subPriority,u8 enstate)
{
	 NVIC_InitTypeDef NVIC_InitStructure;
	
	 NVIC_InitStructure.NVIC_IRQChannel = IRQCh;
	 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = prePriority;
	 NVIC_InitStructure.NVIC_IRQChannelSubPriority = subPriority;
	 NVIC_InitStructure.NVIC_IRQChannelCmd = enstate;
	 NVIC_Init(&NVIC_InitStructure);
}


/*usart1_tx*/
void My_USART_DMA_RX_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{ 
 
	DMA_InitTypeDef  DMA_InitStructure;
//	NVIC_InitTypeDef NVIC_InitStruct;
	
	if((u32)DMA_Streamx>(u32)DMA2)  //得到当前stream是属于DMA2还是DMA1
	{
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);  //DMA2时钟使能 
		
	}else 
	{
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
	}
	
	
	  DMA_DeInit(DMA_Streamx);
		
		while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置 
		
	  /* 配置 DMA Stream */
	  DMA_InitStructure.DMA_Channel = chx;               //通道选择
	  DMA_InitStructure.DMA_PeripheralBaseAddr = par;    //DMA外设地址
	  DMA_InitStructure.DMA_Memory0BaseAddr = mar;     //DMA 存储器0地址
	  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//存储器到外设模式
	  DMA_InitStructure.DMA_BufferSize = ndtr;        //数据传输量 
	  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_High;  //中等优先级
	  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
	  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;        //存储器突发单次传输
	  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
	  DMA_Init(DMA_Streamx, &DMA_InitStructure);   //初始化DMA Stream
			

	  DMA_Cmd(DMA_Streamx,ENABLE);  
  
} 

void My_USART_DMA_TX_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{ 
 
	DMA_InitTypeDef  DMA_InitStructure;
/*	
	NVIC_InitTypeDef NVIC_InitStructure;
*/	
	if((u32)DMA_Streamx>(u32)DMA2)  //得到当前stream是属于DMA2还是DMA1
	{
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);  //DMA2时钟使能 
		
	}else 
	{
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
	}
	
 
	
	 DMA_DeInit(DMA_Streamx);
	
	while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //等待DMA可配置 
	
	  /* 配置 DMA Stream */
	  DMA_InitStructure.DMA_Channel = chx;               //通道选择
	  DMA_InitStructure.DMA_PeripheralBaseAddr = par;    //DMA外设地址
	  DMA_InitStructure.DMA_Memory0BaseAddr = mar;     //DMA 存储器0地址
	  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
	  DMA_InitStructure.DMA_BufferSize = ndtr;        //数据传输量 
	  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_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
	  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;        //存储器突发单次传输
	  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
	  DMA_Init(DMA_Streamx, &DMA_InitStructure);   //初始化DMA Stream
	  
	  DMA_ITConfig(DMA_Streamx, DMA_IT_TC, ENABLE); 
/*		
	 //NVIC
	 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream7_IRQn;
	 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
	 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	 NVIC_Init(&NVIC_InitStructure);
*/	
     //  DMA_Cmd(DMA_Streamx,ENABLE);
     //DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE); 
	 
  
} 

void USART_DMA_TC_Interrupt_Init(u8 IRQN,u8 prePriority,u8 subPriority,u8 enstate)
{
	 NVIC_InitTypeDef NVIC_InitStructure;
	
	 NVIC_InitStructure.NVIC_IRQChannel = IRQN;
	 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = prePriority;
	 NVIC_InitStructure.NVIC_IRQChannelSubPriority = subPriority;
	 NVIC_InitStructure.NVIC_IRQChannelCmd = enstate;
	 NVIC_Init(&NVIC_InitStructure);
}

usart1.h

#ifndef __USART1_H
#define __USART1_H
#include "sys.h"


void My_USART1_Init(USART_TypeDef* USARTx,u32 bound);
void USART_DMA_IDLE_Interrupt_Init(u8 IRQCh,u8 prePriority,u8 subPriority,u8 enstate);
void My_USART_DMA_RX_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr,u32 DMA_Priority_level);
void My_USART_DMA_TX_Init(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr,u32 DMA_Priority_level);
void USART_DMA_TC_Interrupt_Init(u8 IRQN,u8 prePriority,u8 subPriority,u8 enstate);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值