硬汉嵌入式论坛

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

[STM32H7] h7遇到的两个问题一个usart dma,一个时钟问题

[复制链接]

32

主题

264

回帖

365

积分

高级会员

积分
365
发表于 2018-7-8 06:40:37 | 显示全部楼层 |阅读模式
1.时钟问题
我使用cube生成的时钟代码,倍频后sys能有400M,但是我自己新建的工程,拷贝了生成的时钟初始化函数,只能倍频到128M,甚是奇怪!库是从cube考来的,就一个main函数带一个时钟初始化!代码都是一模一样!最后解决不了,把cube生成的作为基本工程修改的!

2.关于usart串口dma数据不一致性问题
使用方法dma加串口空闲中断
1.dma发送前处理一下cache可以发送数据,但是两包数据没延时发送就会有问题,我把cache弄成透写,就没问题,这边还要研究下.
2.dma接收必须先发一包数据,不然就算刷cache数据也刷不进接收数组!
3.dma发送接收的数据,100字节左右,发送稍微快一点就彻底卡死dma。做的deinit也不管用!
例程是st官方参考的,请教下硬汉
回复

使用道具 举报

32

主题

264

回帖

365

积分

高级会员

积分
365
 楼主| 发表于 2018-7-9 12:02:59 | 显示全部楼层
分享下usart  DMA 的例程,参考ST 例程完成
接收方法:使用的是DMA 加串口空闲中断,
发送方法:使用的DMA中断检测完成

注意:
1.USART1_DMA_send 函数不能发送 长度为0 的数据 ,不然会导致 移植进入 空闲中断。 所以进入mian函数循环前请一下接收完成的标志位。如果上系统,判断一下 是否存在信号量等待。
2.发送的数据过大时  需要自己处理一下 得到接收到的数据
3.HAL_UART_Transmit_DMA 完成之后,最好HAL_UART_DMAStop 一下。重新配置一下 DMA接收 HAL_UART_Receive_DMA

uart_init(&com1); 初始化函数
测试波特率:921600 无校验,理论传输速度没毫秒 92个字节,测试毫秒100个字节收发循环测试,测试半个小时,没出现问题。

        printf_dma("hello WORLD!!!\r\n");
        printf_dma("I‘m a test board!!\r\n");       
       
        receive_flag = 0;
        while (1)
        {               
                if(receive_flag == 1)
                {
                        receive_flag = 0;
                        if(USART1_RX_COUNT < USART_REC_LEN)
                        {               
                                SCB_InvalidateDCache_by_Addr((uint32_t*)USART_RX_BUF,USART1_RX_COUNT);                                         //接收完成后清理一下cache
                               
                                USART1_DMA_send(USART_RX_BUF,USART1_RX_COUNT);
                                               
//                                printf_dma("%s\r\n",USART_RX_BUF);
//                                memset(USART_RX_BUF,0,USART1_RX_COUNT);
//                                SCB_CleanDCache_by_Addr((uint32_t*)USART_RX_BUF,USART_REC_LEN);
                        }
                        else                                                                        //DMA出错的时候,USART1_RX_COUNT 会等于 USART_REC_LEN ,但有时候也会等于 1
                        {
                                uart_reinit(&com1);
                        }
                }
        }

usart.c

9.14 KB, 下载次数: 71

usart.h

2.43 KB, 下载次数: 62

回复

使用道具 举报

2

主题

569

回帖

575

积分

金牌会员

积分
575
发表于 2018-7-8 06:50:23 | 显示全部楼层
dma 空闲中断,407所有串口都用上了,都是用这种方法没什么问题。看来H7还有待研究啊…
回复

使用道具 举报

32

主题

264

回帖

365

积分

高级会员

积分
365
 楼主| 发表于 2018-7-8 07:38:30 | 显示全部楼层
leiyitan 发表于 2018-7-8 06:50
dma 空闲中断,407所有串口都用上了,都是用这种方法没什么问题。看来H7还有待研究啊…

我f7也没问题,但是h7就会出现问题
回复

使用道具 举报

692

主题

3576

回帖

5677

积分

论坛元老

积分
5677
发表于 2018-7-8 09:55:12 | 显示全部楼层
在水一方 发表于 2018-7-8 07:38
我f7也没问题,但是h7就会出现问题

usart 接收地址需要无效化吧 ?
回复

使用道具 举报

32

主题

264

回帖

365

积分

高级会员

积分
365
 楼主| 发表于 2018-7-8 11:17:41 | 显示全部楼层
hpdell 发表于 2018-7-8 09:55
usart 接收地址需要无效化吧 ?

不需要,只需要接收的时候指定一个数组!完了之后,刷下cache
回复

使用道具 举报

1

主题

7

回帖

37

积分

新手上路

积分
37
发表于 2018-8-26 14:52:26 | 显示全部楼层
时钟只倍频到128M,看一下你的stm32h7xx_hal_conf.h文件里面定义的HSE_VALUE是不是25M。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-12 13:51 , Processed in 0.047667 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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