串口1​用于 ISP下载口,​​​​实际又想使用串口1,就可以用重映射功能,,

 USART1由以前   PA9,PA10   重映射 为  PB6,PB7   

上代码:

unsigned char rx1_data[256]={0};
unsigned char rx1_n=0;
unsigned char flag_usart1=0;//帧接收完成标志

//串口1重映射配置函数
//USART1_TX,PA9----->>>PB6----TX
//USART1_RX,PA10---->>>PB7----RX
void init_remap_usart1(u32	bound)
{
    GPIO_InitTypeDef Gpio_Init;
    NVIC_InitTypeDef Nvic_Init;
    USART_InitTypeDef Usart_Init;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);    //打开串口1和要映射到的那个1端口和复用时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
//1.需要用到外设的重映射功能时
//2.用到外部中断(EXTI)中与AFIO有关的寄存器时,它们是用来选择EXTIx外部中断的输入脚之用。	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);	
    
    Gpio_Init.GPIO_Pin = GPIO_Pin_6;        //把PB6设置为USART1--TX,
    Gpio_Init.GPIO_Mode = GPIO_Mode_AF_PP;    
    Gpio_Init.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(GPIOB, &Gpio_Init);
    
    Gpio_Init.GPIO_Pin = GPIO_Pin_7;    //把PB7设置为USART1--RX,
    Gpio_Init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &Gpio_Init);
    GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);        //引脚映射初始化
     
    Usart_Init.USART_BaudRate = bound;
    Usart_Init.USART_WordLength = USART_WordLength_9b;	
    Usart_Init.USART_StopBits = USART_StopBits_1;
    Usart_Init.USART_Parity = USART_Parity_Even;		//偶校验
    Usart_Init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	
    Usart_Init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;	
    USART_Init(USART1, &Usart_Init);
    USART_Cmd(USART1, ENABLE);
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);		//设置接收字节中断
	USART_ITConfig(USART1,USART_IT_IDLE, ENABLE);		//设置接收帧中断(串口空闲中断)
	
//   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    Nvic_Init.NVIC_IRQChannel = USART1_IRQn;        
    Nvic_Init.NVIC_IRQChannelCmd = ENABLE;
    Nvic_Init.NVIC_IRQChannelPreemptionPriority = 7;
    Nvic_Init.NVIC_IRQChannelSubPriority = 0;
    NVIC_Init(&Nvic_Init);	
}
 

void send1_buff(u8 *p, u8 len)
{	
	USART_ClearFlag( USART1, USART_FLAG_TC );	//防止第一个字节丢失
	while(len--)
			{	
			USART_SendData(USART1, *(p++));         //向串口1发送数据
			while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
			}	
}


//UART1 接收中断
void USART1_IRQHandler(void)
{
		u8	clear;	
		clear=clear;		//消除KEIL编译报警
		if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)	//USART_IT_RXNE=接收中断标志位,读操作会清零
			{	
			rx1_data[rx1_n] = USART_ReceiveData(USART1);
			rx1_n++;
			}
		else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)	//空闲帧中断
			{							
			clear =USART1->DR;  //先读取接收缓存中数据,目的是清空闲中断标志位 (USART_IT_IDLE=0)
			clear = USART1->SR;	
			flag_usart1=1;				//一帧数据接收结束标志
		    }	

}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐