STM32Cube的串口配置与使用

发布者:SereneMelody最新更新时间:2019-01-15 来源: eefocus关键字:STM32Cube  串口配置 手机看文章 扫描二维码
随时随地手机看文章

1、串口的配置


1)首先打开你的工程,在STM32Cube里面找到USART1,此时串口默认是Disanle的,我们要使能它,选择Asynchronous.



2)然后点击Configuration,就会有一个串口的配置图框,点进去配置串口,如果需要用到中断,选择NVIC进去进行相关配置。



串口配置:



串口中断使能:


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


2、查看串口内的函数API


Keil工程内选择{ }Functions,然后选择你需要查看的目标源文件,展开既是该源码内的函数



串口的发送接收函数:


HAL_UART_Transmit();//串口轮询模式发送,使用超时管理机制

 

HAL_UART_Receive();//串口轮询模式接收,使用超时管理机制

 

HAL_UART_Transmit_IT();//串口中断模式发送

 

HAL_UART_Receive_IT();//串口中断模式接收

 

HAL_UART_Transmit_DMA();//串口DMA模式发送

 

HAL_UART_Receive_DMA();//串口DMA模式接收

串口相关的中断函数:


HAL_UART_TxHalfCpltCallback()://一半数据(half transfer)发送完成后,通过中断处理函数调用。

 

HAL_UART_TxCpltCallback()://发送完成后,通过中断处理函数调用。

 

HAL_UART_RxHalfCpltCallback()://一半数据(half transfer)接收完成后,通过中断处理函数调用。

 

HAL_UART_RxCpltCallback():///接收完成后,通过中断处理函数调用。

 

HAL_UART_ErrorCallback():/传输过程中出现错误时,通过中断处理函数调用。

串口有三种通信模式:


第一种是轮询的模式。CPU不断查询IO设备,如设备有请求则加以处理。例如CPU不断查询串口是否传输完成,如传输超过则返回超时错误。轮询方式会占用CPU处理时间,效率较低。


第二种就是中断控制方式。当I/O操作完成时,输入输出设备控制器通过中断请求线向处理器发出中断信号,处理器收到中断信号之后,转到中断处理程序,对数据传送工作进行相应的处理。


第三种就是直接内存存取技术(DMA)方式。所谓直接传送,即在内存与IO设备间传送一个数据块的过程中,不需要CPU的任何中间干涉,只需要CPU在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


3、在main.c文件添加printf支持

/* USER CODE BEGIN 1 */

 

#ifdef __GNUC__

 

       /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

     set to 'Yes') calls __io_putchar() */

 

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

 

#else

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

 

#endif /* __GNUC__ */

 

/**

  * @brief  Retargets the C library printf function to the USART.

  * @param  None

  * @retval None

  */

PUTCHAR_PROTOTYPE

{

 /* Place your implementation of fputc here */

  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */

  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}

 

/* USER CODE END 1 */


--------------------------------------------------------------------------------------------------------------------------------------------------------------------


4、单独串口中断的使用

1)在main函数前面添加两个数组变量


uint8_t aTxStartMessage[] = "\r\n UART-communication based on IT \r\n";

 

uint8_t aRxBuffer[20];

/* USER CODE END PV */

 


2)在main函数中添加语句接收数据10个字符,保存在数组aRxBuffer中。


HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 10);//串口接收中断使能,如果要循环使用就放到while(1)里面



3)在main.c文件添加中断接收完成回调函数。中断回调函数中将接收到的数据又通过串口发送回去。


/* USER CODE BEGIN 4 */

/**

  * @brief Rx Transfer completed callbacks

  * @param huart: uart handle

  * @retval None

  */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  /* Prevent unused argument(s) compilation warning */

  UNUSED(huart); 

 

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_UART_RxCpltCallback can be implemented in the user file

   */

    HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 10,0xFFFF);//发送10个数据给串口1

    HAL_UART_Receive_IT(&huart1,aRxBuffer,10);      // 重新使能串口1接收中断  

}

 

/* USER CODE END 4 */

----------------------------------------------------------------------------------------------------------------

5、多个串口同时使用

1)定义串口1和串口3的接收数据变量



2)中断回调函数


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

 /* Prevent unused argument(s) compilation warning */

  UNUSED(huart);

 

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_UART_RxCpltCallback can be implemented in the user file

   */

        if(huart->Instance ==  USART1)//串口1做调试

        {

           // HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer1, 10,0xFFFF);

 

             RECV_FLAG1 = 1;

 

            HAL_UART_Receive_IT(&huart1,aRxBuffer1,10);  // 再次串口接收中断使能 

        }

 

        else if(huart->Instance ==  USART2)//串口2接蓝牙

        {

           HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer2, 3,0xFFFF);

 

             RECV_FLAG2 = 1;

 

            HAL_UART_Receive_IT(&huart2,aRxBuffer2,3);  //再次串口接收中断使能  

        }   

}



3)主函数编写


Int mai(void)

{

     While(1)

    {

        if(RECV_FLAG2 == 1)

       {

          RECV_FLAG2= 0;

 

        Car_contrl(aRxBuffer2[0]);  //控制协议cmd[3]:cmd[0]=控制码  cmd[1]=0xD   cmd[2]= 0xA   

       }

 

    HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer1, 10); //串口1接收中断使能

 

    HAL_UART_Receive_IT(&huart2, (uint8_t *)aRxBuffer2, 3); //串口3接收中断使能,所以大小为3:0D 0A 01

 

    }

 

}



-----------------------------------------------------------------------END--------------------------------------------------------------------------



关键字:STM32Cube  串口配置 引用地址:STM32Cube的串口配置与使用

上一篇:STM32的时钟系统体系结构
下一篇:STM32Cube的时钟配置步骤

推荐阅读最新更新时间:2024-03-16 16:22

【STM32Cube_21】使用DAC输出任意指定电压
本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的DAC外设,输出任意指定电压值。 1. 准备工作 硬件准备 开发板 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 万用表 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; 2.生成MDK工程 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32L431RCT6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在System Core中
[单片机]
【STM32Cube_21】使用DAC输出任意指定电压
STM32CUBE HAL库 关于串口usart收发的一个问题
最近项目中遇到了一个问题,因为开始用freertos,然后想加入串口收发功能。打印正常,但是加入接收中断后,开始出bug,最后锁定接收中断挂掉了。 原因:HAL库的串口接收发送函数有bug,就是收发同时进行的时候,会出现锁死的现象。 解决:需要注释掉 HAL_UART_Receive_IT 和 HAL_UART_Transmit_IT 中的 __HAL_LOCK(huart) 函数 -----------------------------------------------------------------------------------------------------------------------
[单片机]
STM32Cube工具学习笔记(一)Cube配置
前几周接触到了STM32CubeMX这个工具,以下简称Cube,先简单介绍一下这个工具吧。 STM32CubeMX是ST出的一款免费的开发工具,近几年ST也在一直大力推这个工具,也在推行新的HAL库(an STM32 abstraction layer embedded software ensuring maximized portability across the STM32 portfolio)硬件抽象层API。使用HAL库开发的好处是方便用户在不同的芯片平台上移植代码。 Cube的作用是通过图形化的配置生成基础的工程文件,生成的文件包含了芯片初始化代码,现支持IAR、MDK、TureSTUDIO等IDE, 对于用
[单片机]
<font color='red'>STM32Cube</font>工具学习笔记(一)Cube<font color='red'>配置</font>
STM32串口寄存器库函数配置方法
1、参考资料 《STM32F1开发指南-库函数版本》- 5.3 usart串口文件夹介绍 -第9章 串口实验 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 2、串口通信基本原理 ·常用的串口相关寄存器 ·USART_SR状态寄存器 ·USART_DR数据寄存器 ·USART_BRR波特率寄存器 ·串口操作相关寄存器(省略入口参数): void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 void USA
[单片机]
STM32<font color='red'>串口</font>寄存器库函数<font color='red'>配置</font>方法
STM8L101系列单片机串口配置详解(基于IAR自带库)
STM8L101f3p6 有一个串口如图 本历程基于库操作 不讨论具体寄存器操作 有兴趣的同学可以自行参考编程手册 下面看一下手册的了解一下特点 本人英语是个小白只可意会不可言传了 内部结构了由于是基于库函数的所以不做寄存器的分析了 库函数的好处就是可以在不了解单片机寄存器的前提下 可以快速开发应用 下面举个例子 波特率 9600 8位字长停止位一位 无校验 串口模式为收发模式 查询发送 中断接收 在初始化串口之前 应该先初始化 串口对应的IO口 由手册可知串口对应的IO为PC2(USART_RX)和PC3(USART_TX)。 首先宏定义下IO 方便理解和配置 #define TXD_GPIO_P
[单片机]
基于STM32Cube USB设备库应用的几个常见问题
1、如何动态地修改设备描述符或字符串描述符? 在文件usbd_desc.c里,与设备和字符串相关的描述符可以通过GetDescriptor的回调函数进行动态调整。 2、如何让大容量存储类驱动支持多个逻辑盘【LUN】? 在文件usbd_msc_storage_xxx.c中修改STORAGE_LUN_NBR。【xxx代表使用的存储介质】 STORAGE_Inquirydata数组里包含了每个LUN的标准查询数据【inquiry data】。 比如用到2个LUN。 constint8_t STORAGE_Inquirydata = { /*LUN 0 */ 0x00, 0x80, 0x02, 0
[单片机]
stm32Cube生成103c8t6的usb驱动
开发板是用的stm32f103c8t6的核心板淘宝上最便宜最常见的那种(还是上图吧) stm32f1系列的hal驱动库中把usb驱动放在了“Middlewares(中间件)”文件夹下,且有“STM32_USB_Device_Library”和“STM32_USB_Host_Library”两个驱动库。若是想直接利用驱动库新建工程可在这两个库的目录下复制Core文件夹和Class文件夹下所需文件。 使用stm32cube直接生成工程: 先勾选Peripherals的USB- Device才能在MiddleWares下的USB_Devics下选择IP核,下拉后有六个选项,分别对应USB设备的六大分类: 分类 功能
[单片机]
用<font color='red'>stm32Cube</font>生成103c8t6的usb驱动
STM32Cube开发-PWM
上一章我们讲解了定时器的基本应用,以及定时器中断。这一章我们讲解通过定时器控制管脚输出PWM信号,控制LED实现呼吸灯。 1. PWM简介 脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制, PWM 原理如图所示: 上图就是一个简单的 PWM 原理示意图。图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT CCRx 时,输出 0,当 CNT =CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候, IO 输出低电平(0),当
[单片机]
<font color='red'>STM32Cube</font>开发-PWM
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved