找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 770|回复: 0
打印 上一主题 下一主题
收起左侧

STM32串口教程

[复制链接]
跳转到指定楼层
楼主
ID:882115 发表于 2021-2-1 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用CubeMX配置串口1配置引脚

  我的板子上使用插针引出了串口1,串口1连接PA8与PA9。

配置串口通信参数

  使能串口1,并配置为同步模式,波特率为115200,模式8N1。

使能串口中断

查看生成的代码

  引脚与中断的初始化在stm32f4xx_hal_msp.c

  而通信用到的参数,如波特率校验方式等初始化在main.c。

  同样是串口初始化的代码,为什么要分开写?
  可能是分层思想,换板子的话,只用修改引脚与中断的函数,用户函数不用修改。比如用户关心波特率,不用关心引脚。

按键控制串口发送代码编写

  通过串口打印按键的信息。

//main.cint main(void){  /* USER CODE BEGIN 2 */  u8 UART_BUF[12 = "you press A!";  u8 key;  /* USER CODE END 2 */  while (1)  {    key = KEY_Scan(0);    switch(key)    {      case KEY_A_PRES:  UART_BUF[10 = 'A'; break;      case KEY_B_PRES:  UART_BUF[10 = 'B'; break;      case KEY_C_PRES:  UART_BUF[10 = 'C'; break;      case KEY_D_PRES:  UART_BUF[10 = 'D'; break;      default: break;         }    if(key)    {      LED1 = !LED1;      HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);       }    /* USER CODE END WHILE */  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

  HAL_UART_Transmit是HAL库提供的串口发送函数。在HAL库的手册中,或者在代码中跳转到函数可以找到函数的说明信息。

  根据说明,这个发送函数是阻塞式的。参数Timeout是超时时间,代表某次执行函数,最多占用串口的时间,单位是毫秒。简单来说,在本次数据发送完之前,不能发送别的数据。所以,调用函数的时候要指明参数,本次发送占用多长时间,在此期间,由于串口资源被独占,不能成功调用发送函数。如果在规定的时间内,数据发送完毕,那就释放占用的串口资源;如果到了时间,即便数据还没有发送完毕,(比如数据量很大),仍需要归还串口资源的控制权,让别人来用。
  在正确连接硬件,并配置串口助手以后,可以看到按键信息如下,说明串口数据发送成功。

  需要说明的是,HAL库提供的发送函数不止一个,还有中断方式和DMA方式,这是这个函数用法最简单。

重映射Printf功能

  在刚刚的例子中,需要把字符装填到数组中,再通过数组来发送数据,比较麻烦,能否直接打印字符串?可以通过重映射C语言中的printf函数来实现。
  建立一个UART.c文件,添加到工程中。输入以下代码:

#include "stdio.h"#include "main.h"#ifdef __GNUC_#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endif//重映射printf的功能PUTCHAR_PROTOTYPE{  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);   return ch;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

  注意在适当的地方要有huart1的外部声明。我写在了main.h中
extern UART_HandleTypeDef huart1;
  然后在主函数中可以调用printf。

//main() while(1)    if(key)    {      LED1 = !LED1;      printf("return value is %d! \r\n",key);      HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);    //发送接收到的数据    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

引脚复用与功能重映射

  如果在STM32CubeMX中将PB6设置为串口功能,可以发现PA9变为了普通引脚。

  这说明PA9和PB6都可以作为串口1的TX引脚,但不能同时用。引脚有点像外设的出口,外设可以从前门出,也可以从后门出,但不能同时从前门和后门出去。
  引脚的功能不止一个,我们可以称之为引脚的复用;比如既可以作为普通的IO,用于操作LED或按键,又可以用作串口。
  某个外设不但可以连接到引脚x,也可以用到引脚y,我们称之为重映射。STM32单片机的功能比较强大,有很多外设。外设默认对应某个引脚,可以通过重映射的方法把一个外设映射到其它的引脚上,来充分利用片内资源。
  详细的引脚重映射情况可以查看数据手册表格9。

引用链接:https://blog.csdn.net/geek_monke ... 1001.2014.3001.5501


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表