UART1的初始化设置
void UART_Init()
{
/* GPIO初始化参数*/
GPIO_InitTypeDef GPIO_InitStruct;
/* UART初始化参数*/
USART_InitTypeDef USART_InitStruct;
/* 复位UART1*/
USART_DeInit(USART1);
/* 开启USART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 开启GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
USART_InitStruct.USART_BaudRate = 128000;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/* 初始化GPIO*/
GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 初始化UART1*/
USART_Init(USART1, &USART_InitStruct);
/* 使能UART1*/
USART_Cmd(USART1, ENABLE);
}
解析:
1、UART1和复用的IO都在时钟APB2上,所以先开启UART1和GPIOA时钟
2、对GPIO参数进行设置,注意发送和接收IO对应的工作模式
3、初始化UART参数,依次为波特率、数据长度、停止位、校验位、模式设置(全双工)、硬件数据流控制开关。
4、初始化GPIO与UART1
5、使能UART1
发送数据可使用USART_SendData(USART1,DATA);
使用while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);查询数据是否发送完成。
寄存器初始化:
void USART1_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;//IO状态设置
GPIOA->CRH|=0X000004B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->SR; //防首字符丢失
}
//串口2初始化
void USART2_Init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
NVIC_InitTypeDef NVIC_InitStructure;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口2时钟
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00004B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //收发使能
USART2->SR; //防首字符丢失
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
}
UART1的初始化设置
void UART_Init()
{
/* GPIO初始化参数*/
GPIO_InitTypeDef GPIO_InitStruct;
/* UART初始化参数*/
USART_InitTypeDef USART_InitStruct;
/* 复位UART1*/
USART_DeInit(USART1);
/* 开启USART1时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 开启GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
USART_InitStruct.USART_BaudRate = 128000;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
/* 初始化GPIO*/
GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 初始化UART1*/
USART_Init(USART1, &USART_InitStruct);
/* 使能UART1*/
USART_Cmd(USART1, ENABLE);
}
解析:
1、UART1和复用的IO都在时钟APB2上,所以先开启UART1和GPIOA时钟
2、对GPIO参数进行设置,注意发送和接收IO对应的工作模式
3、初始化UART参数,依次为波特率、数据长度、停止位、校验位、模式设置(全双工)、硬件数据流控制开关。
4、初始化GPIO与UART1
5、使能UART1
发送数据可使用USART_SendData(USART1,DATA);
使用while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);查询数据是否发送完成。
寄存器初始化:
void USART1_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;//IO状态设置
GPIOA->CRH|=0X000004B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
USART1->SR; //防首字符丢失
}
//串口2初始化
void USART2_Init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
NVIC_InitTypeDef NVIC_InitStructure;
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB1ENR|=1<<17; //使能串口2时钟
GPIOA->CRL&=0XFFFF00FF;//IO状态设置
GPIOA->CRL|=0X00004B00;//IO状态设置
RCC->APB1RSTR|=1<<17; //复位串口2
RCC->APB1RSTR&=~(1<<17);//停止复位
//波特率设置
USART2->BRR=mantissa; // 波特率设置
USART2->CR1|=0X200C; //收发使能
USART2->SR; //防首字符丢失
//Usart2 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
}
举报