历史上的今天
返回首页

历史上的今天

今天是:2024年12月10日(星期二)

正在发生

2021年12月10日 | 【STM32】串口通信---用代码与芯片对话

2021-12-10 来源:eefocus

前言

开发板:stm32f407VET6

开发环境:keil5 MDK

串口通信的相关知识,请参考这篇文章 【STM32】5分钟了解STM32的串口通信


这篇文章讲的都是基础知识,那么串口通信的代码该如何写呢?


一、串口通信基本知识

【STM32】5分钟了解STM32的串口通信


二、编程思路


usart.h

// =============================================

# @Time    : 2020-09-03

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: usart.h

# @Software: keil5 MDK

// =============================================


#ifndef __USART_H

#define __USART_H

#include "stm32f4xx_conf.h"

#include "sys.h" 

#define EN_USART1_RX 0 //使能(1)/禁止(0)串口1接收


void uart_init(u32 bound);

void Usart_Sendbyte(USART_TypeDef * USARTx , uint8_t data);

void Usart_SendString(USART_TypeDef * USARTx , char * string);


usart.c

// =============================================

# @Time    : 2020-09-03

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: usart.c

# @Software: keil5 MDK

// =============================================


#include "sys.h"

#include "usart.h"


//初始化IO 串口1 

//bound:波特率

void uart_init(u32 bound){

   //GPIO端口设置

    GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

 

//串口1对应引脚复用映射

GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1

//USART1端口配置

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉

GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10


   //USART1 初始化设置

USART_InitStructure.USART_BaudRate = bound;//波特率设置

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); //初始化串口1

    USART_Cmd(USART1, ENABLE);  //使能串口1 

USART_ClearFlag(USART1, USART_FLAG_TC);

#if EN_USART1_RX

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断


//Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、


#endif

}


 /***************** 发送一个字符 **********************/ 

void Usart_Sendbyte(USART_TypeDef * USARTx , uint8_t data)

{

  USART_SendData(USARTx,data);

while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE));

}

/***************** 发送字符串 **********************/ 

void Usart_SendString(USART_TypeDef * USARTx , char * string)

{

  char *str = string;

while(*str)

{

  Usart_Sendbyte(USARTx , *str);

str++;

}

}


main.c

// =============================================

# @Time    : 2020-09-03

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @FileName: main.c

# @Software: keil5 MDK

// =============================================


#include "stm32f4xx.h"

#include "usart.h"


void delay(uint32_t count)

{

  for( ;count!=0;count--);

}


int main()

{

    uart_init(115200);

while(1)

{

      Usart_SendString( USART1 , "Hello World");

  delay(0xffffff);

  }

}


宏定义

另外为了便于调试,也可以加上 宏定义


// =============================================

# @Time    : 2020-09-03

# @Author  : AXYZdong

# @CSDN    : https://blog.csdn.net/qq_43328313

# @Software: keil5 MDK

// =============================================


//引脚宏定义 

/*******************************************************/ 

#define DEBUG_USART  USART1

/* 不同的串口挂载的总线不一样,时钟使能函数也不一样,移植时要注意  

* 串口 1 和 6 是      RCC_APB2PeriphClockCmd  

* 串口 2/3/4/5 是    RCC_APB1PeriphClockCmd  

*/  


#define DEBUG_USART_CLK            RCC_APB2Periph_USART1

#define DEBUG_USART_BAUDRATE       115200


#define DEBUG_USART_RX_GPIO_PORT   GPIOA

#define DEBUG_USART_RX_GPIO_CLK    RCC_AHB1Periph_GPIOA

#define DEBUG_USART_RX_PIN         GPIO_Pin_10

#define DEBUG_USART_RX_AF          GPIO_AF_USART1

#define DEBUG_USART_RX_SOURCE      GPIO_PinSource10


#define DEBUG_USART_TX_GPIO_PORT   GPIOA

#define DEBUG_USART_TX_GPIO_CLK    RCC_AHB1Periph_GPIOA

#define DEBUG_USART_TX_PIN         GPIO_Pin_9

#define DEBUG_USART_TX_AF          GPIO_AF_USART1

#define DEBUG_USART_TX_SOURCE      GPIO_PinSource9


#define DEBUG_USART_IRQHandler     USART1_IRQHandler

#define DEBUG_USART_IRQ            USART1_IRQn

/************************************************************/ 


三、总结

利用串口助手,可以发现,上述代码运行后,串口助手每隔一段时间会收到 Hello World

有可能你的串口助手会出现 乱码 的现象,先把串口助手的波特率调成程序中设定的波特率(上述程序设定的是115200),如果还是出现乱码,具体解决方法请参考这篇文章 【STM32】串口通信出现乱码(使用官方标准库)

如果串口助手没有收到 Hello World ,请检查连接 TX 、RX 端子的杜邦线是否松动。


【参考文献】


[1] 《零死角玩转 STM32—基于野火 F407[霸天虎]开发板 》

推荐阅读

史海拾趣

ALTERA(阿尔特拉)公司的发展小趣事

阿尔特拉(Altera Corporation)是一家以可编程逻辑器件(FPGA)和相关技术为主的半导体公司,成立于1983年,总部位于美国加利福尼亚州的圣塔克拉拉。以下是关于阿尔特拉公司发展的五个相关故事:

  1. 创立与早期发展:阿尔特拉公司由Robert Hartmann和Michael Magranet等人于1983年创立,最初致力于设计和制造电可擦除可编程只读存储器(EEPROM)。1984年,公司推出了业界第一个商用FPGA产品,即EP300系列,标志着阿尔特拉在FPGA领域的开创性突破。随后,公司不断扩大产品线,加大研发投入,逐步成为FPGA领域的领军企业之一。

  2. FPGA技术创新:阿尔特拉公司在FPGA技术方面持续进行创新。1992年,公司推出了基于静态随机存储器(SRAM)的FPGA器件,使得FPGA在速度和灵活性方面有了显著提升。此后,阿尔特拉不断推出新的器件系列和工具软件,以满足客户对于性能和可编程性的不断提升的需求。

  3. 与竞争对手的竞争:在FPGA市场,阿尔特拉与Xilinx是两大主要竞争对手。两家公司之间展开了激烈的竞争,包括技术研发、产品性能、市场份额等方面。为了在市场上取得优势,阿尔特拉不断加大研发投入,推出了一系列领先的产品和解决方案,并通过全球销售网络拓展市场。

  4. 收购与合并:阿尔特拉公司在发展过程中进行了多次收购与合并,以扩大市场份额和提升技术实力。2015年,英特尔公司以约160亿美元的价格收购了阿尔特拉,将其并入英特尔旗下成为其子公司。这一收购使得英特尔得以整合阿尔特拉的FPGA技术和产品,进一步巩固了其在半导体行业的地位。

  5. 公司发展与创新:作为英特尔的子公司,阿尔特拉继续致力于技术创新和业务拓展。公司不仅持续改进现有产品的性能和功能,还积极投入到新兴领域的研发与应用,如数据中心、人工智能、物联网等。阿尔特拉通过不断推出创新产品和解决方案,保持了在半导体行业的领先地位。

以上是关于阿尔特拉公司发展的五个相关故事,这些故事展示了阿尔特拉从创立初期到被英特尔收购的发展历程,以及其在FPGA技术领域的技术创新、市场竞争和业务拓展等方面的重要进展。

Compensated Devices Inc公司的发展小趣事

Compensated Devices Inc(简称CDI)最初是一家小型电子元件制造商,专注于生产高精度电阻器。随着科技的飞速发展,传统电阻器已无法满足新兴市场的需求。CDI的创始人李先生敏锐地洞察到这一点,决定投入大量资源进行研发,推出了具有温度补偿和自动校准功能的新型电阻器。这一创新产品迅速获得了市场的认可,CDI也因此逐渐在电子行业中崭露头角。

GarrettCom公司的发展小趣事

并购:2011年,全球领先的信号传输解决方案提供商Belden成功收购了GarrettCom。这一并购标志着GarrettCom正式成为Belden大家庭的一员,也为其带来了更广阔的发展空间和资源支持。

融合:加入Belden后,GarrettCom继续发挥其在工业通信领域的专长,并与Belden的其他业务线形成协同效应。双方共同为客户提供更全面的信号传输和通信解决方案,进一步提升了市场竞争力。

Helium_Systems__Inc.公司的发展小趣事

进入21世纪后,海曼电子意识到单一市场已无法满足其快速增长的需求。于是,公司开始实施全球化战略,首先在欧洲市场建立了多个分支机构,随后逐步向亚洲、北美等地拓展。为了提升品牌知名度,海曼电子积极参加国际电子展会,与全球客户建立联系,并通过高质量的产品和服务赢得了良好的口碑。同时,公司还加大了在市场营销和品牌建设上的投入,成功塑造了“精准、可靠、创新”的品牌形象。

Davico Industrial Ltd公司的发展小趣事

为了更好地适应全球市场的变化,海曼电子不断深化其国际化战略。公司在全球范围内建立了完善的研发、生产和销售网络,确保能够快速响应客户需求。同时,公司还加大了对海外市场的投入,通过本地化运营和定制化服务,赢得了更多海外客户的信赖和支持。此外,海曼电子还积极参与国际标准的制定和推广工作,提升了公司在全球电子行业的影响力。

Cygnal Integrated Products Inc公司的发展小趣事

为了加快技术发展和市场拓展的步伐,Cygnal积极寻求与其他公司的战略合作。通过与半导体制造商、软件开发商等公司的合作,Cygnal获得了更多的技术支持和市场资源。这些合作不仅提升了Cygnal的技术实力和市场竞争力,还为其未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

很好的单片机学习课件!

下面是我在网上淘到的单片机学习课件,讲得很好,有很直观的演示图片,易学易懂! [ 本帖最后由 wscsyyych 于 2008-10-6 16:28 编辑 ]…

查看全部问答>

严酷环境下专用 超酷“手套机”电话

很遗憾到目前为止这只是个概念产品,设计者说,通过蓝牙连接手机,它可以实现手机的任何功能。不明白,为啥不直接集成一部手机呢?   貌似专门为那些在严苛的工作环境下的人士准备,比如登山运动员,营救队等等,戴着厚厚的手套拿手机实在不方便 ...…

查看全部问答>

去上海面试后的总结

有半个月没有上论坛了,期间去上海面试了两家公司,然后就在那里等消息,具体哪两家公司就不说了。就说说自己的感想好了。第一家是在手机行业比较厉害的公司,笔试,然后三面。前两面是技术面,后一面是经理面。觉得技术面的时候,没有什么好说的, ...…

查看全部问答>

为什么大部分710系统的地址总线A0不用????????

    我参考了很多电路图,发现系统使用外扩存储器时地址总线最低位A0没有用上,都时将A1作为最低位,这时为什么啊?????    这样使用有什么好处么,和正常接法(单片机A0接外界存储器A0,A1接A1.....)在使用 ...…

查看全部问答>

哪位达人帮忙解释一下,谢谢!

MOV FLASH_DUKR,#$0AE     NOP   MOV FLASH_DUKR,#$56;解锁     NOP     NOP   BTJF FLASH_IAPSR,#03,WRITEE1;检测是否解锁(????)   ...…

查看全部问答>

MDK安装的疑问

本人安装的是MDK4.1(就是keil 的UV4),为什么在安装目录keil下只有ARM选项而没有51的选项啊?如果我既有STM32的系统又有STM8的系统,该怎么办?…

查看全部问答>

菜鸟求助,一个概念 google、百度了半天都找不到

为了满足欧美得能耗新标准,最近公司产品电源中的同步整流想改用MOS管,加紧学习IR、Infineon、NXP几位大佬的MOS产品和技术。网上几个地方看到有关Infineon OptiMOS 25V器件系列的描述中都提到:“通过大幅降低三个关键的能效优值(FOM),使这种全 ...…

查看全部问答>

我坦白

模拟套装 发货记录上写着当天就发货了,可12月1日还在北京转悠。上午忙着拍一些烂照片又弄午饭,没来得及发,现在发已经刚刚收到了我坦白,我没有什么公司(我网站临时页面很含糊吧,没说是公司),更不是有什么头衔,我穷光蛋一个,写公司职务 ...…

查看全部问答>

帅哥进!

有没有知道wm8978录音配置的,求教啊,帅哥,就救!…

查看全部问答>

【跟TI学电源】系列------易电源SIMPLE SWITCHER设计资料资源一览无余

对于那些需要高至 75V的高输入电压以及高达 5A 之输出电流的应用,SIMPLE SWITCHER 稳压器系列可在性能、易用性和灵活性之间实现最佳平衡。 该稳压器系列的最新产品是纤巧型 SIMPLE SWITCHER LMR 纳米稳压器系列,它是深受欢迎的 SIMPLE SWITCHER ...…

查看全部问答>