UART 串口相关库函数

串口的各种函数,其实都是围绕对CR1到CR3这几个寄存器进行配置,串口有很多功能,都没用到,这里先列一些平时会用到的函数。

以下是串口初始化的一个参考函数:

void uart_init(u32 bound){
   
    GPIO_InitTypeDef GPIO_InitStructure; //对GPIO进行配置
    USART_InitTypeDef USART_InitStructure; //对串口进行配置
    NVIC_InitTypeDef NVIC_InitStructure;  //对串口中断进行配置
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口时钟
 
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //配置GPIO的AF功能
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //配置GPIO的AF功能
    
     //GPIO初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; // 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// 配置成AF模式
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    // 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 
    GPIO_Init(GPIOA,&GPIO_InitStructure); //调用GPIO初始化函数

   //USART1 初始化
    USART_InitStructure.USART_BaudRate = bound;//设置波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//设置有效数据长度
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//没有流控
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
    USART_Init(USART1, &USART_InitStructure); //调用串口初始化函数
    
    USART_Cmd(USART1, ENABLE);  //使能串口1
    
    USART_ClearFlag(USART1, USART_FLAG_TC);
    
    #if EN_USART1_RX    
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能串口中断
    //USART_IT_RXNE: Receive Data register not empty interrupt

//Usart1 NVIC 中断配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;// 要配置的是串口1的中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能 NVIC_Init(&NVIC_InitStructure); //调用中断初始化函数 #endif }

定义串口中断函数:void USART1_IRQHandler(void) 。这个函数的名字不是随便取的,在startup_stm32f40_41xxx.s中有定义:

        DCD     USART1_IRQHandler                 ; USART1

如果串口发生了中断,就会跳到这个函数,这个函数的处理是要用户自己定义的。

另外用到的几个函数:

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
//调用方法例如:
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //发生了RXNE中断

串口是有很多中断源的,传入参数UASRT_IT_RXNE,就是判断接收是不是产生了这个类型的中断,这个函数做的就是对串口控制寄存器CR1,CR2,CR3某些位,结合SR寄存器,做出的判断。但是CR寄存器是在哪里赋值的呢?

 其余函数介绍:

1/ void USART_DeInit(USART_TypeDef* USARTx)

操作RCC_APB2RSTR寄存器,对串口进行复位。
void USART_DeInit(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));

  if (USARTx == USART1)
  {
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, ENABLE);  // 操作RCC_APB2RSTR寄存器,对串口进行复位,

RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1, DISABLE); }
else if (USARTx == USART2) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE); } else if (USARTx == USART3) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE); } else if (USARTx == UART4) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART4, DISABLE); } else if (USARTx == UART5) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART5, DISABLE); } else if (USARTx == USART6) { RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART6, DISABLE); } else if (USARTx == UART7) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART7, DISABLE); } else { if (USARTx == UART8) { RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, ENABLE); RCC_APB1PeriphResetCmd(RCC_APB1Periph_UART8, DISABLE); } } }

2、void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

这个太长了,不摘录了,就是根据传入的串口配置参数,比如数据长,奇偶校验等,配置串口控制寄存器和波特率寄存器

3、void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)

串口使能控制

void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  
  if (NewState != DISABLE)
  {
    /* Enable the selected USART by setting the UE bit in the CR1 register */
    USARTx->CR1 |= USART_CR1_UE;
  }
  else
  {
    /* Disable the selected USART by clearing the UE bit in the CR1 register */
    USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE);
  }
}
原文地址:https://www.cnblogs.com/nasduc/p/4691363.html