stm32f103串口1重映射
USART1由以前PA9,PA10重映射 为PB6,PB7。串口1用于 ISP下载口,实际又想使用串口1,就可以用重映射功能,,
·

串口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; //一帧数据接收结束标志
}
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)