STM32串口1寄存器配置。
寄存器配置比较难入门。
void USART1_Init(u32 pclk2,u32 bound)  ////USART1使用PCLK2(最高72MHz),其它USART使用PCLK1(最高36MHz)
{ 
 float temp;
	u16 mantissa;
	u16 fraction;	
//--- 计算串口波特率--- 
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
  mantissa<<=4;
	mantissa+=fraction; 
   
  //--- usart 1 串口 A9 T,A10 R ---
	RCC->APB2ENR|=1<<2;       //使能Port A端口时钟
	RCC->APB2ENR|=1<<14;     //使能串口1时钟
	GPIOA->CRH&=0XFFFFF00F;  //IO状态设置
	GPIOA->CRH|=0X000008B0;  //IO状态设置 A9推挽输出50MHz A10上拉输入
  
	RCC->APB2RSTR|=1<<14;  //复位串口1
	RCC->APB2RSTR&=~(1<<14);  //停止复位	
  
 	USART1->BRR=mantissa;  // 波特率设置
	USART1->CR1 |= 0X200C;  //无校验位.
	USART1->CR2 &= 0<<12;  //1位停止
  
	
	USART1->CR1 |= 1<<5;     //RXNE 接收缓冲区非空中断使能
	USART1->CR1 |= 1<<4;     //IDLE 空闲中断使能
  USART1->CR1 |= 1<<3;     //TE   使能发送
  USART1->CR1 |= 1<<2;     //RE   使能接收
NVIC_Init_DMA(2,2,USART1_IRQn,2);//组2,最低优先级
}
//串口中断函数
void USART1_IRQHandler(void) //串口1中断服务程序
{
	if(USART1->SR&(1<<5))	//接收到数据
	{	
			U1RxBuff[U1RxCounter++] = USART_ReceiveData(USART1);
	}
  else if(USART1->SR&(1<<4))	//空闲中断
  {
    USART1->SR;//先读SR
		USART1->DR;//再读DR 
//此处处理接收数据
  }
}
//中断优先级配置
//NVIC_Group:NVIC分组 0~4 总共5组 
void NVIC_PriorityGroupConfig_DMA(u8 NVIC_Group)	
{ 
	  u32 temp,temp1;	  
	  temp1=(~NVIC_Group)&0x07;//取后三位
	  temp1<<=8;
	  temp=SCB->AIRCR;  //读取先前的设置
	  temp&=0X0000F8FF; //清空先前分组
	  temp|=0X05FA0000; //写入钥匙
	  temp|=temp1;	   
	  SCB->AIRCR=temp;  //设置分组	    	  				   
}
//-------------------- 设置NVIC --------------------
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority       :响应优先级
//NVIC_Channel           :中断编号
//NVIC_Group             :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组0:0位抢占优先级,4位响应优先级
//组1:1位抢占优先级,3位响应优先级
//组2:2位抢占优先级,2位响应优先级
//组3:3位抢占优先级,1位响应优先级
//组4:4位抢占优先级,0位响应优先级
//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先	   
void NVIC_Init_DMA(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)	 
{ 
  u32 temp;	
  NVIC_PriorityGroupConfig_DMA(NVIC_Group);//设置分组
  temp=NVIC_PreemptionPriority<<(4-NVIC_Group);	  
  temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
  temp&=0xf;//取低四位  
  if(NVIC_Channel<32)
     NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
  else NVIC->ISER[1]|=1<<(NVIC_Channel-32);    
     NVIC->IP[NVIC_Channel]|=temp<<4;//设置响应优先级和抢断优先级   	    	  				   
}
                
            
        
浙公网安备 33010602011771号