新手上路 
 
	- 积分
 - 36
 
        - 金钱
 - 36 
 
       - 注册时间
 - 2014-11-18
 
      - 在线时间
 - 3 小时
 
 
 
 | 
 
 
 楼主 |
发表于 2014-11-20 10:11:19
|
显示全部楼层
 
 
 
void uart_init(u32 pclk2,u32 bound)
 {  	 
 	float temp;
 	u16 mantissa;
 	u16 fraction;	   
 	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 	mantissa=temp;				 //得到整数部分
 	fraction=(temp-mantissa)*16; //得到小数部分	 
     mantissa<<=4;
 	mantissa+=fraction; 
 	RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
 	RCC->APB2ENR|=1<<14;  //使能串口时钟 
 	GPIOA->CRH&=0XFFFFF00F; 
 	GPIOA->CRH|=0X000008B0;//IO状态设置
 		  
 	RCC->APB2RSTR|=1<<14;   //复位串口1
 	RCC->APB2RSTR&=~(1<<14);//停止复位	   	   
 	//波特率设置
  	USART1->BRR=mantissa; // 波特率设置	 
 	USART1->CR1|=0X200C;  //1位停止,无校验位.
 #ifdef EN_USART1_RX		  //如果使能了接收
 	//使能接收中断
 	USART1->CR1|=1<<8;    //PE中断使能
 	USART1->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
 	MY_NVIC_Init(3,3,USART1_IRQChannel,2);//组2,最低优先级 
 #endif
 }
 串口2例程
 void USART2_Init(u32 pclk1,u32 bound)
 {  	 		 
 	RCC->APB2ENR|=1<<2;   	//使能PORTA口时钟  
 	GPIOA->CRL&=0XFFFF00FF;	//IO状态设置
 	GPIOA->CRL|=0X00008B00;	//IO状态设置	 
 	RCC->APB1ENR|=1<<17;  	//使能串口时钟 	 
 	RCC->APB1RSTR|=1<<17;   //复位串口2
 	RCC->APB1RSTR&=~(1<<17);//停止复位	   	   
 	//波特率设置
  	USART2->BRR=(pclk1*1000000)/(bound);// 波特率设置	 
 	USART2->CR1|=0X200C;  	//1位停止,无校验位.
 	USART2->CR3=1<<7;   	//使能串口2的DMA发送
 	UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF 
 #ifdef USART2_RX_EN		  	//如果使能了接收
 	//使能接收中断
 	USART2->CR1|=1<<8;    	//PE中断使能
 	USART2->CR1|=1<<5;    	//接收缓冲区非空中断使能	    	
 	MY_NVIC_Init(2,3,USART2_IRQChannel,2);//组2,优先级2,3 
 	TIM4_Init(999,7199);	//100ms中断
 	USART2_RX_STA=0;		//清零
 	TIM4_Set(1);			//关闭定时器4
 #endif										  	
 }
 二个串口对比程序。UART2是不是有问题呢? |   
 
 
 
 |