首页 > 其他分享 >stm32f407VET6 串口(usart1)基本操作,【发送数据 + 接收数据】

stm32f407VET6 串口(usart1)基本操作,【发送数据 + 接收数据】

时间:2022-12-10 23:34:18浏览次数:58  
标签:USART InitStruct NVIC 串口 发送数据 GPIO 接收数据 USART1

完整代码 :

#include "stm32f4xx.h"
#include "delay.h"
#include "led.h"
#include "usart.h"    
/*
*说明:
*串口程序
*实现发送任意一个字节数据给电脑
*电脑发送 00 / ff 控制单片机 开灯 / 关灯
*/

int main()
{
    LED_Init();//加了一个状态灯,可以没有
    delay_init(168);//初始化延时函数 (如果用到延时操作)  
        
/**一、配置串口***/
    //1、使能串口及复用引脚外设的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    
/**二、串口引脚复用映射***/
    //映射Tx
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); 
    //映射Rx
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
    
/**三、定义GPIO结构体变量,初始化引脚模式为复用,复用为Pin_10: rx、Pin_9:tx***/
    GPIO_InitTypeDef GPIO_InitStructure_usart1;
    
    GPIO_InitStructure_usart1.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;
    GPIO_InitStructure_usart1.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure_usart1.GPIO_Speed = GPIO_High_Speed;
    GPIO_InitStructure_usart1.GPIO_OType = GPIO_OType_PP; //推挽复用输出
    GPIO_InitStructure_usart1.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_Init(GPIOA,&GPIO_InitStructure_usart1);
    
/**四、定义串口结构体,初始化串口:这里初始化 USART1***/
    USART_InitTypeDef USART_InitStruct;
    USART_InitStruct.USART_BaudRate = 9600;  
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 
    USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; 
    USART_InitStruct.USART_Parity = USART_Parity_No; 
    USART_InitStruct.USART_StopBits = USART_StopBits_1; 
    //配置 :9600波特率、8位字长、无校验、1位停止位、物流控、发送和接收模式
    USART_Init(USART1, &USART_InitStruct);
    
/**五、使能串口***/
    USART_Cmd(USART1,ENABLE);
    
/**六、配置接收中断 ***/

    //1、中断方法
    //1.1、配置串口中断(开启标志位到NVIC的输出)
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    //1.2、配置NVIC中断向量(中断优先级)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组
    //1.3、初始化中断
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn ; //中断是:串口1中断
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 3; //子优先级
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    
    NVIC_Init(&NVIC_InitStruct);  


/**七、发送数据(一个字节)***/
    uint8_t byte = 0xAD;
    USART_SendData(USART1,byte);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET) ;
    
    
/**八、接收数据    ***/
    //1、查询方法(在while中不断的查询,去掉下方的注释就行)
//    uint16_t rece = 0x00;
    while(1)
    {
        
        
//        if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){
//            rece = USART_ReceiveData(USART1);
//            USART_SendData(USART1,rece);
//            while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
//            if(rece==0x00){
//                GPIO_ResetBits(GPIOA,GPIO_Pin_6);
//            }else if(rece==0xff){
//                GPIO_SetBits(GPIOA,GPIO_Pin_6);
//            }
//            
//        }    
        
    }
}
    

    //2、串口接收中断服务函数
void USART1_IRQHandler(void){
    
    uint16_t rece = 0x10;
    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){
        
        rece = USART_ReceiveData(USART1);
        USART_SendData(USART1,rece);
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
        if(rece==0x00){
            GPIO_ResetBits(GPIOA,GPIO_Pin_6);
        }else if(rece==0xff){
            GPIO_SetBits(GPIOA,GPIO_Pin_6);
        }
            
    }    
}

 

给电脑端发送的数据:

 

 

 

电脑发送 0x00 控制单片机开灯:

 

标签:USART,InitStruct,NVIC,串口,发送数据,GPIO,接收数据,USART1
From: https://www.cnblogs.com/RedWetPlace/p/16972608.html

相关文章