• STM32串口的设置和库函数的介绍


    串口设置的一般步骤可以总结为如下几个:
    1) 串口时钟使能, GPIO时钟使能 
    2) 串口复位
    3)GPIO 端口模式设置
    4) 串口参数初始化 
    5) 开启中断并且初始化 NVIC(如果需要开启中断才这个步骤) (如果需要开启中断才这个步骤)
    6) 使能串口 使能串口

    7) 编写中断处理函数 


    下面,我们就简单介绍这几个与串口基本配置直接相关的固件库函数。这些函数和 定义主要分布在 stm32f10x_usart.h ,stm32f10x_usart.c 文件中。 

    1.串口时钟使能。串口是挂载在APB2上的,所以使能函数为:

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1)

    2.串口复位。当外设出现异常的时候可以通过复位置 ,实现该外设的复位,然后重新配置这个外设让其重新工作的目。一般在系统刚开始配置时候,都会先执行复位该这个外 设达到让其重新工作的目。复位是在函数 USART_DeInit()完成:

    void USART_DeInit(USART_TypeDef* USARTx)

    3串口参数初始化

    void USART_Init()函数: 

         voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);

    作用:

              根据指定参数初始化相应串口(波特率,字长,停止位,奇偶校验,硬件流控制等)

               主要是用来初始化寄存器BRR以及CR1,CR2,CR3控制寄存器

    使用范例:

             USART_InitTypeDefUSART_InitStructure;  

             USART_InitStructure.USART_BaudRate= 9600;//波特率设置;

            USART_InitStructure.USART_WordLength= USART_WordLength_8b;//字长为8位数据格式

            USART_InitStructure.USART_StopBits= USART_StopBits_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);//初始化串口



    4.void USART_Cmd()函数: 

    原型:

          voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);

    作用:

                使能相应的串口,用来设置寄存器CR1的串口使能位

     使用范例:

               USART_Cmd(USART1,ENABLE);                    //使能串口1


    5.void USART_ITConfig()函数: 
    原型:     voidUSART_ITConfig(USART_TypeDef*USARTx,

        uint16_t    USART_IT, FunctionalStateNewState);

     作用:开启串口相应中断,设置串口控制寄存器
      使用范例:

                USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //开启读数据寄存器非空中断

    6.USART_SendData()函数: 
    原型:

           voidUSART_SendData(USART_TypeDef* USARTx, uint16_t Data);

      作用:

                发送数据到串口。

     使用范例:

              USART_SendData(USART1,0x12);                    

    7.uint16_tUSART_ReceiveData()函数: 
    原型: uint16_t USART_ReceiveData(USART_TypeDef*USARTx)

    获取串口最新接受的值。

     使用范例:

         USART_ReceiveData(USART1);

    8.四个状态标志相关的函数:


    FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USART_FLAG);
    void USART_ClearFlag(USART_TypeDef*USARTx,uint16_t USART_FLAG);

    ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_t USART_IT);

    void USART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT);

    以下是一个完整的初始化串口函数和一个中断服务函数:
    //初始化IO 串口1 
    //bound:波特率
    void uart_init(u32 bound){
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;
     
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
       USART_DeInit(USART1);  //复位串口1
    //USART1_TX   PA.9
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
       
        //USART1_RX  PA.10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


       //Usart1 NVIC 配置


        NVIC_InitStructure.NVIC_IRQChannel = USART1_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 初始化设置


    USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStructure.USART_StopBits = USART_StopBits_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_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
        USART_Cmd(USART1, ENABLE);                    //使能串口 


    }


    void USART1_IRQHandler(void)                 //串口1中断服务程序
    {
    u8 Res;
    #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
    OSIntEnter();    
    #endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
    Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据

    if((USART_RX_STA&0x8000)==0)//接收未完成
    {
    if(USART_RX_STA&0x4000)//接收到了0x0d
    {
    if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
    else USART_RX_STA|=0x8000; //接收完成了 
    }
    else //还没收到0X0D
    {
    if(Res==0x0d)USART_RX_STA|=0x4000;
    else
    {
    USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
    USART_RX_STA++;
    if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收  
    }  
    }
    }    
         } 
    #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
    OSIntExit();    
    #endif
    }
  • 相关阅读:
    du命令、df命令、磁盘分区
    du命令、df命令、磁盘分区
    C#中类和结构体的区别
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    JAVA并查集
    JAVAPrim最小生成树
    自媒体创业怎么起步?如何选择自媒体平台?
    如何在互联网创业?有什么好的技巧?
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/8051672.html
Copyright © 2020-2023  润新知