历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2019年08月26日 | 5、STM32Cube的串口配置与使用

发布者:cloudy德德 来源: eefocus关键字:STM32Cube  串口  配置 手机看文章 扫描二维码
随时随地手机看文章

一、串口的配置

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


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


串口配置:

串口中断使能:


点击NVIC选项,设置优先级和分组

二、查看串口内的函数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在过程开始时向设备发出“传送块数据”的命令,然后通过中断来得知过程是否结束和下次操作是否准备就绪。


三、在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 */


四、单独串口中断的使用

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


uint8_t aTxStartMessage[] = "rn UART-communication based on IT rn";

 

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 */

五、多个串口同时使用

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  串口  配置 引用地址:5、STM32Cube的串口配置与使用

上一篇:环形缓冲区stm32例程
下一篇:STM32 HAL库 printf输出重定向

推荐阅读

同一个“错误”,没有人愿意犯两次。8月22日晚间,高通正式宣布,已经开始出样新一代骁龙SoC芯片,采用7nm工艺。 高通表示,这款7nm SoC可以搭配骁龙X50 5G基带,预计将成为首款支持 5G 功能的移动平台。  在此之前,高通从未公布过骁龙芯片的出样时间表,这一次高调公布产品节奏,看上去更像是一次“产业宣战”。一周前,三星刚刚发布了自家研发的...
31.1 初学者重要提示学习本章节前,务必优先学习第30章,RS485用到的串口FIFO也是建立在30章的基础上。了解了本章31.2和31.3小节的基础知识后,强烈推荐看此贴的两个文档,对RS485讲解的比较透彻,中文版:http://forum.armfly.com/forum.php?mod=viewthread&tid=90753 。STM32H7支持RS485的硬件流控制,即有一个专门的引脚来控制485 PHY的收发状态切换...
交通运输部部长李小鹏来到菜鸟网络总部调研。据悉,在菜鸟无人快递车前,李小鹏询问了阿里巴巴无人驾驶的新进展。他表示,无人快递车在校园等半封闭环境下发挥了作用,未来可以把聪明的路与智能的车结合起来,加快推进无人快递车更广泛的使用,可以纳入交通强国试点当中。无人驾驶是目前全球热门的研发技术,不少车企推出自动驾驶汽车进行测试,互联网、科...
ANCA高效解决方案:一机多用,轻松实现刀片磨削,准确、一致、自动化的刀片生产,实现刀具产品多样化刀具作为机床加工中使用的耗材,对工件质量和生产效率有着很大影响。随着制造业的不断升级转型,国内机床数控化率不断提升,刀具行业正快速发展。其中,整体硬质合金刀具市场竞争激烈,很难脱颖而出。而用于铣削和钻孔的刀片则优势诸多,未来增长空间广阔...

史海拾趣

问答坊 | AI 解惑

基于状态机和流水线技术的3DES加密算法及其FPGA设计

摘要: 介绍了3DES加密算法的原理并详尽描述了该算法的FPGA设计实现。采用了状态机和流水线技术,使得在面积和速度上达到最佳优化;添加了输入和输出接口的设计以增强该算法应用的灵活性。各模块均用硬件描述语言实现,最终下载到FPGA芯片Stratix E ...…

查看全部问答∨

微机原理试卷及答案

为了对付考试,自己把试卷好好的做了一下,弄成电子版,希望对大家有帮助!应该是没有什么错误答案!…

查看全部问答∨

请教

我用EVC 4编译了一个程序,如何从PC机上传送到硬件设备上,除了生成的EXE文件,还用到哪个DLL文件,请指点. 我的平台是用了WINCE 4.1模拟器,如果用VS2003开发的话除了EXE文件还需要哪个DLL文件,谢谢!…

查看全部问答∨

急急急!求wince下能浏览GIF动态图片的软件

在wince平台下怎么浏览gif格式图片啊,我试了好多软件怎么都解决不了呀?大家帮帮我啊 。…

查看全部问答∨

正弦波的驱动能力

我用MCU和DA芯片,生成了一个100Hz 0~5V的正弦波,然后通过运放调整为-2.5~+2.5V的正弦波。 再用这个波形去驱动一个6Ω的自感式传感器。   问题: 当连接上这个线圈后,正常输出的正弦波变了,变成100Hz,-120mv~+120mv的类似于方波的波 ...…

查看全部问答∨

MSP430F169如何与ADS931(一款AD芯片)连接

本人欲采用外部的AD模块进行模数转换,ADC芯片是TI的ADS931——我的办法是数据口与430的IO直接连,这样连接是否有问题?第二个问题是ADS931的CLK引脚和430该如何连接?谢谢 [ 本帖最后由 周星星在哈工程 于 2011-8-23 14:58 编辑 ]…

查看全部问答∨

STM32-IAP-can谁有资料,例程里只有USART的的啊

YJYYT777@126.COM谁有资料发我下,谢谢了!…

查看全部问答∨

四川赛区L题现场测试5.5V 时电压输出降低的同学请进

本帖最后由 paulhyde 于 2014-9-15 02:59 编辑 我们的作品在家测试一切正常,用现场的恒压源测试,高于7V都没有问题,到5.5V测试时,输出电压一下降至2.7V,用万用表测量作品输入电压仅4.6V,而恒压源显示为5.5V,有遇到这种情况的同学进来讨论。获 ...…

查看全部问答∨

BBB突然就没办法启动了

BBB突然就没办法启动了,现在插上电源,电源指示灯闪一下就灭了,我检查了下也没有短路,怎么会这样哇.正常电压如图所示,我现在的电压情况是:离GND最近的,也就是GND上面的那个是5V(图中显示正常值是5V),右侧的三个电容中中间那个是1.1v(图中显示 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved