zoukankan      html  css  js  c++  java
  • STM32串口——中断方式的一般配置方法

    #include "stm32f10x.h"
    
    
    /************************************************
    该程序讲解串口程序的一般配置方法:
    步骤为:
            1、先对端口进行复用或者重映射操作(该程序中是对端口进行复用操作)
            2、串口复位,函数为USART_DeInit();
            3、串口初始化:USART_Init();
            4、中断初始化:    NVIC_Init();
            5、串口使能:USART_Cmd();
            6、开启中断:USART_ITConfig();
            7、编写中断处理函数:void USART1_IRQHandler(void)    
            
                                                                                    briangooole@gmail.com
                                                                                       于2017年06月29日
    -------------------------
    USART_TX     |    PA9
    -------------------------
    USART_RX     |    PA10
    -------------------------
    ************************************************/
    
    
    void MY_USART_Init(void)
    {
    
        
        GPIO_InitTypeDef GPIO_InitStrue;     //在GPIO_Init函数调用时需定义一个GPIO_InitTypeDef结构体类型变量
        USART_InitTypeDef USART_InitStrue;    //USART_Init函数调用时需定义一个USART_InitTypeDef结构体类型变量
        NVIC_InitTypeDef NVIC_InitStrue;    //USART_Init函数调用时需定义一个NVIC_InitTypeDef结构体类型变量
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
            //RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
            //由于串口功能是GPIO的第二功能,所以要对端口进行复用操作,
            //一般步骤为:GPIO时钟使能-》复用的外设时钟使能-》将端口按照复用的功能进行模式配置
        
        USART_DeInit(USART1);    //串口复位
        
            GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    //复用功能推挽输出模式
            GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;    //PA9
            GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;    //设置输出速度
        GPIO_Init(GPIOA,&GPIO_InitStrue);
        
            GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;    //浮空输入模式
            GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;    //PA10
        GPIO_Init(GPIOA,&GPIO_InitStrue);
        
    
        
        USART_InitStrue.USART_BaudRate=9600;//设置波特率9600
        USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制,相关寄存器为CR3
        USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//模式为接收和发送
        USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位0x0000,相关寄存器为SR1的PS位
        USART_InitStrue.USART_StopBits=USART_StopBits_1;    //1个停止位
        USART_InitStrue.USART_WordLength=USART_WordLength_8b;    //数据长度为8位
        USART_Init(USART1,&USART_InitStrue);    //串口初始化
        
        
        NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //串口1对应的中断名称
        NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;    //使能该中断通道
        NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级为2,因为此程序只有一个中断,故可任意设置
        NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//响应优先级为1,因为此程序只有一个中断,故可任意设置
        NVIC_Init(&NVIC_InitStrue);    //中断初始化
        
        USART_Cmd(USART1,ENABLE); //串口使能  就是将寄存器CR1中的UE位置1
        
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口中断,也叫开启串口中断,第二个参数是设置具体开启哪种中断,具体为寄存器SR
    
    }
    
    //在stm32f10x_it.文件
    void USART1_IRQHandler(void)        //中断函数
    {
        u16 DATA;
        if(USART_GetITStatus(USART1,USART_IT_RXNE))//判断如果收到了数据,收到数据CR1中RXNE位为1,该函数的返回值为1,则执行if包含的语句
        {
        DATA=USART_ReceiveData(USART1);//读取数据
        USART_SendData(USART1,DATA);//发送读到的数据
        }
    
    }
    
    int main(void) //主函数
     {   
    SystemInit(); //系统时钟设置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    //进行中断分组,分为2组:2位抢占优先级,2位响应优先级 MY_USART_Init(); //调用串口初始化函数 while(1);  //等待中端发生 }

    转载自:https://www.cnblogs.com/brianblog/p/7095410.html

    功能如下图所示:

    mcu在中断中接收到数据后,立刻发送回pc

  • 相关阅读:
    数据挂载
    LVS学习与测试——NAT模式
    VirtualBox 网络设置 VirtualBox中客机与主机互通
    [原]两个android程序间的相互调用(apk互调)
    [置顶] Android Service与Activity之间通信的几种方式
    [置顶] android 开发中判断网络是否连接的代码
    [置顶] 判断时间格式是否正确
    [置顶] 输出map信息
    [置顶] checkEmail判断邮箱格式
    [置顶] checkPhone判断手机号格式
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/9739286.html
Copyright © 2011-2022 走看看