263|9

128

帖子

1

TA的资源

纯净的硅(初级)

【STM32H7S78-DK】④串口收发数据(中断方式) [复制链接]

本篇,我们来到很基础的串口通讯,串口主要常用于程序调试。

 

查看开发板手册得知,ST—Link的虚拟串口,对应UART4(PD0、PD1)

 

image.png  

 

image.png  

 

我们新建一个空白的工程:

 

image.png  

开启UART4(习惯用APPLI),配置好IO口,UART4默认端口不是PD0/PD1,需要在GPIO重新设置。

 

设置好波特率:9600

image.png  

 

开启中断:

 

image.png  

 

然后生成代码:

可以看到main.c中都设置好了参数。

 

image.png  

 

UART串口收发数据,有4种方式:

1.    轮询:阻塞式,比较占用CPU资源

2.    中断:非阻塞式,需要CPU参与,解放CPU

3.    DMA:非阻塞式,无需CPU参与

4.    基于RTOS嵌入式操作系统,高端玩法

 

本例将演示:轮询和中断方式

1. 轮询发送

添加头文件及定义字符串:

#include "stm32h7rsxx_hal_uart.h"
unsigned char UART_BUF[] = "大江东去,浪淘尽,千古风流人物。故垒西边,人道是:三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间、樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。";

 

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MPU Configuration--------------------------------------------------------*/
  MPU_Config();

  /* MCU Configuration--------------------------------------------------------*/

  /* Update SystemCoreClock variable according to RCC registers values. */
  SystemCoreClockUpdate();

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART4_Init();
  /* USER CODE BEGIN 2 */


  //HAL_UART_Receive_IT(&huart4, UART_BUF1,sizeof(UART_BUF1));


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	HAL_Delay(1000);
	HAL_UART_Transmit(&huart4, UART_BUF, sizeof(UART_BUF),100);


  }
  /* USER CODE END 3 */
}

 

 

 

 

在while(1)函数中加入:

HAL_Delay(1000);

HAL_UART_Transmit(&huart4, UART_BUF, sizeof(UART_BUF),100);

 

运行结果:

image.png  

 

2. 中断收发

 

添加头文件及定义字符串(接收到的数据放在这个数组中):

#include "stm32h7rsxx_hal_uart.h"

unsigned char UART_BUF1[45];

 

main.c函数添加接收中断,同时while(1)函数为空白。

 

int main(void)

{



/* USER CODE BEGIN 1 */



/* USER CODE END 1 */



/* MPU Configuration--------------------------------------------------------*/

MPU_Config();



/* MCU Configuration--------------------------------------------------------*/



/* Update SystemCoreClock variable according to RCC registers values. */

SystemCoreClockUpdate();



/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();



/* USER CODE BEGIN Init */



/* USER CODE END Init */



/* USER CODE BEGIN SysInit */



/* USER CODE END SysInit */



/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_UART4_Init();

/* USER CODE BEGIN 2 */





HAL_UART_Receive_IT(&huart4, UART_BUF1,sizeof(UART_BUF1));





/* USER CODE END 2 */



/* Infinite loop */

/* USER CODE BEGIN WHILE */

while (1)

{

}

核心是这句:

HAL_UART_Receive_IT(&huart4, UART_BUF1,sizeof(UART_BUF1));

 

stm32h7rsxx_it.c

中添加串口接收中断函数,并将收到的数据发送出去。

 

image.png  

核心代码为:


 

extern uint8_t UART_BUF1[45];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Transmit_IT(&huart4,UART_BUF1,sizeof(UART_BUF1));   //将接收到的数据发送出去

	HAL_UART_Receive_IT(&huart4, UART_BUF1,sizeof(UART_BUF1));   //再次开启接收中断
}

运行结果为:

image.png  

 

 

 

 

本次的分享就到这里。

 

题外话:看到有的坛友在分享STM32H7S78-DK的开发经验时,对每个模块(如GPIO、UART……),深钻寄存器,每个细节都仔仔细细,

深感佩服的同时,发表点不同的看法:

STM32H7S78-DK这么强大的开发板,拥有如此便利的图形化配置界面CubeMX,以及强大的HAL库。

个人认为要想快速学习,高效应用,最好适应CubeMX+HAL的方式,直接钻研寄存器感觉更适用于8位、16位单片机,硬件资源有限,直接操作寄存器效率更高。

而我们的STM32H7S78-DK,这么强大的硬件以及软件配套,必要性就不大了。

600MHz, 64KB Bootflash, 620KB SRAM, with DSP, cache, USB HS PHY, NeoChrom GPU, TFT-LCD. 

 

此帖出自stm32/stm8论坛

最新回复

正在进行电路开发设计中,学习参考借签,不错,感谢分享!   详情 回复 发表于 5 天前

回复
举报

5773

帖子

6

TA的资源

版主

现在的厂商也是不断的想要让使用者跳过底层,多多进行应用开发,不过中断的工程师还是喜欢对寄存器进行更多的了解,主要就是学习上都是这么过来的

此帖出自stm32/stm8论坛

点评

有道理  现在基本上各家MCU都是图形化界面自动配置寄存器了。 比如ST、NXP、Microchip、Renesas等等  详情 回复 发表于 2024-10-2 17:53
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引


回复

128

帖子

1

TA的资源

纯净的硅(初级)

秦天qintian0303 发表于 2024-10-2 11:41 现在的厂商也是不断的想要让使用者跳过底层,多多进行应用开发,不过中断的工程师还是喜欢对寄存器进行更多 ...

有道理 

现在基本上各家MCU都是图形化界面自动配置寄存器了。

比如ST、NXP、Microchip、Renesas等等

此帖出自stm32/stm8论坛

点评

让咱们方便的同时,实际上也是弱化能力,对单一品牌的依赖性会更高  详情 回复 发表于 2024-10-2 20:01

回复

5773

帖子

6

TA的资源

版主

cc1989summer 发表于 2024-10-2 17:53 有道理  现在基本上各家MCU都是图形化界面自动配置寄存器了。 比如ST、NXP、Microchip、Renes ...

让咱们方便的同时,实际上也是弱化能力,对单一品牌的依赖性会更高

此帖出自stm32/stm8论坛
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引


回复

709

帖子

5

TA的资源

纯净的硅(高级)

串口通信是嵌入式开发常用的技术,楼主分享的技术非常详细,很有实用价值

此帖出自stm32/stm8论坛

点评

谢谢捧场   详情 回复 发表于 2024-10-2 20:47

回复

128

帖子

1

TA的资源

纯净的硅(初级)

chejm 发表于 2024-10-2 20:06 串口通信是嵌入式开发常用的技术,楼主分享的技术非常详细,很有实用价值

谢谢捧场 

此帖出自stm32/stm8论坛

回复

8

帖子

0

TA的资源

一粒金砂(中级)

谢谢,正在学习单片机开发,好文,希望有所成。

此帖出自stm32/stm8论坛

点评

  多谢支持!  详情 回复 发表于 7 天前

回复

128

帖子

1

TA的资源

纯净的硅(初级)

zgnasd1950 发表于 2024-10-3 03:27 谢谢,正在学习单片机开发,好文,希望有所成。

  多谢支持!

此帖出自stm32/stm8论坛

回复

31

帖子

0

TA的资源

一粒金砂(中级)

正在进行电路开发设计中,学习参考借签,不错,感谢分享!

此帖出自stm32/stm8论坛

点评

 嘿嘿  详情 回复 发表于 5 天前

回复

128

帖子

1

TA的资源

纯净的硅(初级)

zxcvbnm751120 发表于 2024-10-5 17:07 正在进行电路开发设计中,学习参考借签,不错,感谢分享!

 嘿嘿

此帖出自stm32/stm8论坛

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表