STM32---串口初始化

2023-05-16

u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//bit15, 接收完成标志//bit14, 接收到0x0d//bit13~0, 接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记  
/*
函数:uart_init
功能:串口初始化配置
参数:Baud:波特率
备注:GPIO/USART1/NVIC初始化,开启串口中断,使能串口中断(中断处理函数)
步骤:
   1---GPIO/USART1/NVIC初始化结构体定义
   2---开启串口USART,GPIO端口时钟
   3---复位串口
   4---USART1_TX/USART1_RX  串口接受/发送端口配置寄存器结构体参数配置
   5---NVIC 中断控制器配置
   6---USART 初始化设置
   7---开启中断
   8---使能中断
*/
void uart_init(u32 Baud)

{
 
    //GPIO/USART1/NVIC初始化结构体
 
    GPIO_InitTypeDef GPIO_InitStructure;                      //GPIO端口配置寄存器结构体
   USART_InitTypeDef USART_InitStructure;                     //串口配置寄存器结构体
   NVIC_InitTypeDef NVIC_InitStructure;                      //中断配置寄存器结构体
 
   //开启串口USART,GPIO端口时钟
 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);   //使能USART1,GPIOA时钟
 
   //复位串口1
 
    USART_DeInit(USART1);                               //复位串口1
 
   //USART1_TX   PA.9 串口发送端口配置寄存器结构体参数配置
 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                    //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                //时钟速率: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;                                      //PA.10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;              //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);                      //初始化PA10

    //Usart1 NVIC 中断控制器配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                 //中断类型:串口1 USART1接受中断
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;             //抢占优先级3
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                  //IRQ通道使能
   NVIC_Init(&NVIC_InitStructure);                          //初始化NVIC寄存器
 
    //USART 初始化设置

  USART_InitStructure.USART_BaudRate = Baud;                     //一般设置为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);                      //初始化串口 USART1
  
  //开启中断
  
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                   //开启中断(串口1接受中断)
  
  //使能中断
  
    USART_Cmd(USART1, ENABLE);                                       //使能串口
}
/*
函数:USART1_IRQHandler
功能:中断处理函数
参数:
备注:
步骤:
*/
void USART1_IRQHandler(void)                       //串口1中断服务程序
{
 u8 Res;
 
 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;//接收数据错误,重新开始接收  
     }  
    }
   }     
  }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32---串口初始化 的相关文章

随机推荐

  • 从零开始搭二维激光SLAM --- 激光雷达数据效果对比

    我们知道 xff0c 不同品牌的激光雷达产生的数据是不一样的 xff0c 那这些不同点是如何影响建图效果的呢 xff1f 这篇文章就是来分析这个问题 xff0c 将从不同光强下的点云效果 xff0c 不同夹角下的点云效果 xff0c 以及
  • 海上垂直无人机垂直起降平台

    无人机的降落要实现对飞行轨迹和飞行状态的精确控制 xff0c 对目标地点的精确定位与识别 xff0c 而海上无人机降落具有更多不确定因素 xff0c 现提出一些有效方案 xff0c 以使得无人机海上起降成为可能 无人机起降条件 xff1a
  • 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块

    前言 前段时间跟着LOLI大神的教程制作了LOLI三代控 xff0c 效果很好 但是 xff0c 由于LOLI三代控的接收机带有数据回传功能 xff0c 也就是接收机的无线模块也承担了发射数据功能 xff0c 所以接收机也要使用带有功率放大
  • linux下TCP/IP通讯实例

    下面是server端源码 xff1a include lt stdio h gt include lt stdlib h gt include lt string h gt include lt unistd h gt include lt
  • STM32 USART 一些问题

    SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13
  • 数据缓冲策略 —— 无缓冲、行缓冲、全缓冲(缓冲区大小测试)

    printf打印数据时 xff0c 一般会先把数据放入C缓冲区 xff0c 然后再刷新到内核缓冲区 xff0c 最后再写入硬件 这个过程中 xff0c 数据从C缓冲区迁移到内核缓冲区的操作我们称为缓冲 xff08 也可以理解为刷新 xff0
  • K210 FreeRTOS多任务多核系统调度

    一 目的 众所周知 xff0c K210这款AI新品是一款64bit 双核芯片 xff0c 其支持裸机编程 xff0c 并且官方也提供freertos sdk xff0c 方便开发者在其上进行多任务应用开发 那么如何进行任务创建和多核开发呢
  • keil如何添加h文件_KEIL 那些编辑技巧与方法

    当然了 xff0c 很多人现在更多的是使用 VSCode 或者 SI 等软件进行编辑 xff0c 但不可否认的是 xff0c 还有很多道友还是选择 KEIL 作为编辑软件的 xff0c 本篇笔记作为一个编辑技巧的总结 关于 KEIL 软件的
  • 关于keil C51 案例 加入头文件

    1 先在工程下面建立一个 h文件 xff0c 例如delay h 在其中写入要加入的函数声明 xff0c 或者其他的一些预定义 xff1a ifndef DELAY H define DELAY H include lt reg52 h g
  • "extern C", 你真的懂了吗?

    在c 43 43 prime书中看到过 xff0c 在DLL和lib中看到过 xff0c 但是每次看过就不求甚解地一扫而过 心里知道有extern c这个语句 xff0c 却不知道该用在哪里 xff0c 又能起到什么作用 唉 xff0c 想
  • 内存或寄存器定义和赋值

    在嵌入式中 xff0c 会经常遇到寄存器 内存的数据传输 xff0c 如何向寄存器中写入数据呢 xff1f 现举例说明 xff1a define rDISRC0 volatile unsigned 0x4b000000 DMA 0 Init
  • Makefile的文件格式,详解规则

    构建规则都写在Makefile文件里面 xff0c 要学会如何Make命令 xff0c 就必须学会如何编写Makefile文件 1 概述 Makefile文件由一系列规则 xff08 rules xff09 构成 每条规则的形式如下 xff
  • 只声明而不定义变量

    如果想声明一个变量而不定义它 xff0c 就在变量前面添加关键字extern xff0c 而且不要显式地初始化变量 extern int i 声明i而非定义i extern int j 61 0 定义 int k 声明并且定义 注意 xff
  • vector 与 智能指针使用注意事项

    看以下代码 xff0c 执行时会有什么问题 xff1f include lt vector gt include lt stdio h gt include lt stdlib h gt include lt memory gt class
  • SystemV 共享内存(一)—— 共享内存的创建与释放(shmget / shmctl)

    匿名管道和命名管道都是基于文件 的进程间通信 xff0c SystemV方案是在OS内核层面 专门为进程间通信设计的一个方案 xff0c 然后通过系统调用 xff08 system call xff09 给用户提供通信接口 SystemV方
  • TTL 485 232 全双工 半双工 单工---精简总结

    全双工 xff1a 双向2车道 半双工 xff1a 双向1车道 单工 xff1a 单向车道 1 从单片机软件编程角度来说 xff0c RS232 RS485都是转换为TTL电平方式与单片机通信 xff08 CAN收发器把差分信号转化为TTL
  • STM32F4-ADC-常规通道-转换模式配置-总结

    STM32F4 ADC常规通道转换的模式配置 模式选择 此寄存器定义 xff1a 是否自动循环 这两个寄存器定义 xff1a Scan mode xff08 是否轮询序列 xff09 和Discontinuous mode xff08 是否
  • 单片机 裸机 架构

    以前是 while xff08 1 xff09 43 软件定时器 43 中断标志 的框架 xff0c 现在的项目我想尝试一下新的框架 xff0c 简单来说是 主状态机 43 大量子状态机 43 软件定时器 的方式 xff0c 这其中状态机和
  • USART---串口发送数据

    xfeff xfeff while USART1 gt SR amp 0X40 61 61 0 等待发送结束 解析 xff1a USART1 gt SR xff1a 串口 状态 寄存器 USART1 gt SR amp 0X40 即串口状态
  • STM32---串口初始化

    u8 USART RX BUF USART REC LEN 接收缓冲 最大USART REC LEN个字节 bit15 xff0c 接收完成标志 bit14 xff0c 接收到0x0d bit13 0 xff0c 接收到的有效字节数目 u1