• 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);
      }
    }
  • 相关阅读:
    CSharpGL(36)通用的非托管数组排序方法
    CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
    CSharpGL(34)以从零编写一个KleinBottle渲染器为例学习如何使用CSharpGL
    CSharpGL(33)使用uniform块来优化对uniform变量的读写
    CSharpGL(32)矩阵与四元数与角度旋转轴的相互转换
    CSharpGL(31)[译]OpenGL渲染管道那些事
    CSharpGL(30)用条件渲染(Conditional Rendering)来提升OpenGL的渲染效率
    Go如何使用数据库、缓存
    Go内置常用包
    从零开始基于go-thrift创建一个RPC服务
  • 原文地址:https://www.cnblogs.com/nasduc/p/4691363.html
Copyright © 2020-2023  润新知