STM32
直播中

建立建利12

9年用户 1393经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

如何对STM32串口UART1进行初始化设置呢

如何对STM32串口UART1进行初始化设置呢?

如何对STM32串口UART1的寄存器进行初始化呢?

回帖(1)

黄璨

2021-12-9 11:35:41
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);//开启串口接受中断
   
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分