历史上的今天
返回首页

历史上的今天

今天是:2025年05月31日(星期六)

2019年05月31日 | HAL库教程5:串口数据发送

2019-05-31 来源:eefocus

使用CubeMX配置串口1

配置引脚

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

在这里插入图片描述
在这里插入图片描述


配置串口通信参数

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


在这里插入图片描述

使能串口中断


在这里插入图片描述

查看生成的代码

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

在这里插入图片描述

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

在这里插入图片描述

  同样是串口初始化的代码,为什么要分开写?

  可能是分层思想,换板子的话,只用修改引脚与中断的函数,用户函数不用修改。比如用户关心波特率,不用关心引脚。


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

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


//main.c

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


  }

}


  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;

}



  注意在适当的地方要有huart1的外部声明。我写在了main.h中

extern UART_HandleTypeDef huart1;

  然后在主函数中可以调用printf。


//main() while(1)

    if(key)

    {

      LED1 = !LED1;

      printf("return value is %d! rn",key);

      HAL_UART_Transmit(&huart1,UART_BUF,12,0xffff);    //发送接收到的数据

    }


在这里插入图片描述


引脚复用与功能重映射

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

在这里插入图片描述

  这说明PA9和PB6都可以作为串口1的TX引脚,但不能同时用。引脚有点像外设的出口,外设可以从前门出,也可以从后门出,但不能同时从前门和后门出去。

  引脚的功能不止一个,我们可以称之为引脚的复用;比如既可以作为普通的IO,用于操作LED或按键,又可以用作串口。

  某个外设不但可以连接到引脚x,也可以用到引脚y,我们称之为重映射。STM32单片机的功能比较强大,有很多外设。外设默认对应某个引脚,可以通过重映射的方法把一个外设映射到其它的引脚上,来充分利用片内资源。

  详细的引脚重映射情况可以查看数据手册表格9。



推荐阅读

史海拾趣

Electro-Films Inc Semi-Films Div公司的发展小趣事

近年来,随着全球环保意识的提高,绿色环保和可持续发展成为各行各业关注的焦点。Semi-Films Division 也积极响应这一趋势,将绿色环保理念融入到公司的生产和经营中。公司采用环保的生产工艺和材料,减少了对环境的污染和破坏。同时,公司还积极参与各种环保活动和项目,推动整个行业的绿色发展和可持续发展。这些努力不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

Eink公司的发展小趣事
进入21世纪,E-Ink继续推动电子纸技术的发展。2000年,E-Ink与美国朗讯科技公司合作,成功开发出第一张可卷曲的电子纸和电子墨。随后,在2001年,E-Ink与日本Toppan Printing公司合作,利用Toppan的滤镜技术生产出了彩色电子纸,这是电子纸技术的一大突破。
Advanced Microelectronic Products Inc公司的发展小趣事

在电子行业竞争日益激烈的背景下,AMP公司面临着来自同行的巨大压力。为了应对这一挑战,公司进行了战略调整,将重心转向高端电子产品的研发和生产。通过不断提升产品性能和品质,AMP公司成功打造了多个高端品牌,并在细分市场中取得了显著优势。此外,公司还积极拓展新的应用领域,为未来发展奠定了坚实基础。

FCT electronic公司的发展小趣事

在环保和可持续发展成为全球共识的背景下,FCT electronic公司积极响应这一趋势,致力于推动绿色环保和可持续发展。公司采用了环保材料和工艺,减少了对环境的污染;同时,FCT electronic公司还加强了废物回收和资源利用方面的工作,实现了资源的循环利用和节约。这些努力不仅使FCT electronic公司在环保方面取得了显著成绩,也为公司的可持续发展奠定了坚实基础。

Ampire Co Ltd公司的发展小趣事

在电子行业的初期,FCT electronic公司由一群富有远见和激情的工程师创立。他们看到了挠性电路板在未来电子产品中的巨大潜力,并致力于研发出更高效、更可靠的挠性电路板解决方案。经过数年的不懈努力,FCT electronic公司终于研发出了具有革命性意义的挠性电路板技术,这一技术为公司在行业中树立了良好的口碑,也为公司的后续发展奠定了坚实的基础。

ACL staticide公司的发展小趣事

FCT electronic公司始终坚持以客户需求为导向的服务理念。为了更好地满足客户的需求,公司不断推出新的服务模式和解决方案。例如,公司推出了定制化服务,根据客户的具体需求提供个性化的电路板解决方案;同时,FCT electronic公司还加强了售后服务体系建设,确保客户在使用过程中能够得到及时、专业的技术支持和服务。这些创新的服务模式使FCT electronic公司在客户中赢得了良好的口碑和信任。

问答坊 | AI 解惑

MP3之死

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 深圳华发北路上,人来人往,熙熙攘攘。走进专门经营MP3产品的电子市场里,你会看到有人正忙着将柜台上堆积着的零部件组装成一部新的MP3,有人正在小心打磨略显粗糙的iPod样式的外壳,有人飞快 ...…

查看全部问答>

新手求助 大家好的DAT文件在PB5里面打开时是乱码怎样解决?

大家好:        新手求助 大家好的DAT文件在PB5里面打开时是乱码怎样解决? 友善的mini2440 bsp        HZRecog.dat 文件 打开时是乱码 有没有办法看到里面内容? 谢谢!!!…

查看全部问答>

ce6.0 r3 + s3c2450 运行 coreplayer ,串口输出报错信息

Exception \'Undefined Instruction\' (1): Thread-Id=04c80006(pth=82b474d4), Proc-Id=04c70006(pprc=87ac0bac) \'PLAYER.EXE\', VM-active=04c70006(pprc=87ac0bac) \'PLAYER.EXE\' PC=00079ba0(PLAYER.EXE+0x00069ba0) RA=000797c4(PLAYER.EXE ...…

查看全部问答>

SMDK2440bsp for WINDOW MOBILE移植问题?

    我是wince菜鸟经过几个月的潜水修炼中自觉可以出来提些问题。最近公司将上马window mobile所以我先找公司借了块扬创的开发板来移植练手。     我所用的开发板配置: (1)S3C2440A:32bit ARM920T 内核,标称工作频率:400 ...…

查看全部问答>

急求专家解决!从计算机体系结构的角度比较Dell PowerEdge R200和HP ProLiant DL 145 G3 411596-AA1两台服务器

急求牛人协助!!! 从计算机体系结构的角度比较Dell PowerEdge R200和HP ProLiant DL 145 G3 411596-AA1两台服务器 网上很少有比较专业的资料,希望高手能出手帮忙。 分析越详尽越好,小弟不甚感激! …

查看全部问答>

wince 时间问题

更改2410的BSP,具体为: 在文件Platform\\SMDK2410\\kernel\\hal\\oemioctl.c中将     case IOCTL_HAL_INIT_RTC:      // The kernel has detected a cold-boot.           ...…

查看全部问答>

AVRMEGA8 串口求救

串口求救 #include #include #include #include \"IPGA204.h\" #define fosc 8000000//晶振8M #define baud 9600//波特率9600 void putchar(unsigned char c); unsigned char getchar(void); int puts(char *s); void puts_hh(char *s ...…

查看全部问答>

LED驱动电源的隔离与非隔离之分

     目前在一般的LED照明市场上,存在非隔离设计和隔离型驱动电源之分。非隔离设计仅限于双绝缘产品,例如灯泡的替代产品,其中LED和整个产品都集 成并密封在非导电塑料中,因此,最终用户并没有任何触电的危险。二级产品都 ...…

查看全部问答>

430开发板下载问题

板载TUSB3410的430 如何下载程序?能通过usb经TUSB3410下吗?…

查看全部问答>

共享以前收集到MSP430F5529开发板的资料

先上点F5529实验的PPT讲解文档(中文的) MSP-EXP430F5529开发板实验指导书: [ 本帖最后由 IC爬虫 于 2013-2-25 15:55 编辑 ]…

查看全部问答>