硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8532|回复: 16
收起左侧

[CMSIS-Driver] 基于STM32H7的CMSIS-Driver驱动实现串口DMA和串口中断两种方式案例【已发布】

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
发表于 2020-8-5 10:30:33 | 显示全部楼层 |阅读模式
说明:
1、做这里例子有两个意义,一个是RL-USB的虚拟串口使用,另一个是ESP32和ESP8266的驱动使用。
2、H7版的串口DMA方式不支持串口不定长,即CMSIS-Driver未做支持,而F4版本的是支持的。
3、中断方式例子做了一个简单的回环,接收一个字符后,发送回去。
4、DAM方式也是一个回环方式,固定接收32个字节后,发送回去。
     使用DMA方式有一点要特别注意,如果开启了串口缓冲区所在RAM的Cache,用于串口的DMA发送缓冲和接收缓冲务必设置为32字节整数倍,且缓冲地址必须32字节对齐。     
     调用那个发送和接收DMA函数要是32字节整数倍,否则会自动按照串口中断方式收发。
5、用的是V7板子,串口波特率115200,8bit数据,1个停止位,无奇偶校验位。

例程下载:
基于STM32H7的CMSIS-Driver驱动实现串口DMA.rar (7.99 MB, 下载次数: 974)
基于STM32H7的CMSIS-Driver驱动实现串口中断.rar (8 MB, 下载次数: 602)

注意下面的这几个软件包要都安装当前的最新版:
6.png


CMSIS-Driver框图:




回复

使用道具 举报

608

主题

3041

回帖

4885

积分

至尊会员

积分
4885
发表于 2020-8-5 10:45:02 | 显示全部楼层
期待期待呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2020-8-6 01:31:01 | 显示全部楼层

更新完毕。
回复

使用道具 举报

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2020-8-16 23:50:07 | 显示全部楼层
下载了历程 上位机每隔10ms下发hello world 过一段时间就会死机
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2020-8-17 00:01:06 | 显示全部楼层
yenext 发表于 2020-8-16 23:50
下载了历程 上位机每隔10ms下发hello world 过一段时间就会死机


这个例子不能随便发,没有做DMA不定长传输。

固定32字节的发送和接收。

而串口中断方式做的是单字节的接收处理,建议简单研究下使用,CMSIS-Driver做了专门的help文档可以学习。



回复

使用道具 举报

0

主题

34

回帖

34

积分

新手上路

积分
34
发表于 2020-8-27 20:56:04 | 显示全部楼层
如果想用H7 CMSIS-Driver的串口去驱动ESP32或ESP8266  或者 驱动EC20后PPP拨号,都不支持任意长度接收咋搞
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2020-8-28 00:45:33 | 显示全部楼层
登云钓月 发表于 2020-8-27 20:56
如果想用H7 CMSIS-Driver的串口去驱动ESP32或ESP8266  或者 驱动EC20后PPP拨号,都不支持任意长度接收咋搞

任意长度接收用串口中断方式。
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2021-3-2 12:53:15 | 显示全部楼层
请教硬汉,这个驱动里调用USARTdrv->PowerControl(ARM_POWER_FULL);初始化串口和DMA,在最后
回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2021-3-2 12:54:44 | 显示全部楼层
请教硬汉,这个驱动里调用USARTdrv->PowerControl(ARM_POWER_FULL);初始化串口和DMA,在最后
      HAL_UART_MspInit (uart->h);
      // UART peripheral reset
      UART_PeripheralReset (uart->reg);
最后调用 UART_PeripheralReset (uart->reg);不是把前面的初始化又都复位了嘛?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2021-3-2 14:09:49 | 显示全部楼层
shibinjie 发表于 2021-3-2 12:54
请教硬汉,这个驱动里调用USARTdrv->PowerControl(ARM_POWER_FULL);初始化串口和DMA,在最后
      HAL_UA ...

这个就是要复位。配置在后面呢
  /* 配置异步,波特率115200,数据位8,奇偶校验位无,停止位1 */
    USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
                      ARM_USART_DATA_BITS_8 |
                      ARM_USART_PARITY_NONE |
                      ARM_USART_STOP_BITS_1 |
                      ARM_USART_FLOW_CONTROL_NONE, 115200);

    /* 使能发送和接收 */
    USARTdrv->Control (ARM_USART_CONTROL_TX, 1);
    USARTdrv->Control (ARM_USART_CONTROL_RX, 1);

回复

使用道具 举报

22

主题

93

回帖

159

积分

初级会员

积分
159
发表于 2021-3-2 16:54:01 | 显示全部楼层
eric2013 发表于 2021-3-2 14:09
这个就是要复位。配置在后面呢
  /* 配置异步,波特率115200,数据位8,奇偶校验位无,停止位1 */
     ...

哦,我搞错了。我以为HAL_UART_MspInit对GPIO也复位了
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-6-19 16:28:28 | 显示全部楼层
请问硬汉,我想通过 ARM_USART_EVENT_RX_TIMEOUT 这个event来实现不定长数据接收,
但是程序进不去这个中断,后来发现USART_STM32H7xx.c中的Capabilities结构体的event_rx_timeout 是0。

1)请问这是因为现在的cmsis-driver还没有实现这个功能吗?

2)请问现在怎么才能实现不定长数据的接收呢?谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2022-6-21 01:25:33 | 显示全部楼层
gallop020142 发表于 2022-6-19 16:28
请问硬汉,我想通过 ARM_USART_EVENT_RX_TIMEOUT 这个event来实现不定长数据接收,
但是程序进不去这个中 ...

H7这个驱动做不定长不方便,而F4的很方便,可以参考。

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
https://www.armbbs.cn/forum.php? ... 3714&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-3-23 12:02:21 | 显示全部楼层
请教硬汉哥, 这种cmsis_driver的方式好像不支持arm-gcc的那套开发环境吗? 我感觉硬汉的教程也没有讲gcc的开发环境那一套, 我刚刚开始使用stm32开发项目, 感觉使用makefile构建这一套才是最清晰最舒服的, 但是大多数教程啥的还是用mdk, iar那种开发环境的人多, 很多框架的移植什么的也只有mdk什么的教程比较多...
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2023-3-24 10:19:07 | 显示全部楼层
576262501 发表于 2023-3-23 12:02
请教硬汉哥, 这种cmsis_driver的方式好像不支持arm-gcc的那套开发环境吗? 我感觉硬汉的教程也没有讲gcc的开 ...

CMSIS-Driver源码都是纯C的,本身设计是支持IAR,MDK和GCC,你可以移植源码自己使用。
回复

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
发表于 2023-10-14 22:09:51 | 显示全部楼层
到目前,H7的CMSIS-Driver,DMA方式还是不支持串口不定长吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106557
QQ
 楼主| 发表于 2023-10-16 07:09:25 | 显示全部楼层
ifree 发表于 2023-10-14 22:09
到目前,H7的CMSIS-Driver,DMA方式还是不支持串口不定长吗?

对。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-25 04:26 , Processed in 0.219360 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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