打印
[技术问答]

HK32F030M最快GPIO翻转速度

[复制链接]
5272|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 shushi007 于 2020-8-3 23:14 编辑

各位好!我用HK32F030M的单片机来驱动恒流LED芯片,GPIO翻转速度要达到8M左右,但是自己使用HK32F030M单片机最快的翻转速度只有5.5M。
如下是代码和波形测试图片,麻烦查看一下是不是我没有注意好关键的地方导致的!



代码我配置HCLK=PCK=SYSCLK=HSI=32M
翻转GPIO的代码如上,一条str指令占用两个时钟周期,一高一低32M/4=8M 但是实际GPIO只有5.5M,麻烦各位看还有什么遗漏的地方没有,GPIO驱动能力是50M速度翻转。


使用特权

评论回复

相关帖子

沙发
shushi007|  楼主 | 2020-8-3 23:29 | 只看该作者
目前 已经解决了。问题是flash初始化的时候等待周期为2,改为0等待周期 gpio速度可以达到8.3M,但是代码初始化哪里有提示说16-32M频率使用1个等待周期 32-48M使用两个等待周期 32M的时候0等待周期没有问题吗?

使用特权

评论回复
板凳
xyz549040622| | 2020-8-4 08:08 | 只看该作者
shushi007 发表于 2020-8-3 23:29
目前 已经解决了。问题是flash初始化的时候等待周期为2,改为0等待周期 gpio速度可以达到8.3M,但是代码初 ...

尽量提高代码的执行速度,比如再次精简代码,提高执行速度,这个flash等待周期不要乱动,否则容易有跑飞的危险。

使用特权

评论回复
地板
annko2005| | 2020-8-4 08:40 | 只看该作者
采用直接操作ODR寄存器也可以:例如:GPIOA->ODR ^= GPIO_Pin_0;

使用特权

评论回复
5
shushi007|  楼主 | 2020-8-4 23:14 | 只看该作者
annko2005 发表于 2020-8-4 08:40
采用直接操作ODR寄存器也可以:例如:GPIOA->ODR ^= GPIO_Pin_0;

不确定在没有使用-o3优化的时候,GPIOA->ODR ^= GPIO_Pin_0的操作是否是gpio最快翻转操作,要从ODR读取一次在写回到ODR寄存器,有两次外设寄存器存储操作ldr和str,这样高低电平操作共四次存储操作,一个存储操作占两个时钟周期,32M时钟的时候最大翻转频率是4M.
还有老哥你提供的example代码里面有gpio复用 的代码吗,我现在使用TSSOP20封装,好像PB5,PD4引脚不能作为GPIO操作,复用功能设置不知道怎么关闭,能提供实例代码吗?

使用特权

评论回复
6
shushi007|  楼主 | 2020-8-4 23:16 | 只看该作者
xyz549040622 发表于 2020-8-4 08:08
尽量提高代码的执行速度,比如再次精简代码,提高执行速度,这个flash等待周期不要乱动,否则容易有跑飞 ...

翻转GPIO操作已经是代码最快了,反汇编看到都是一条str指令就置高低电平操作了。不动存储周期,好像32M的HSI跑的时候由于在等待取指令实际单片机只跑在20M左右的样子。

使用特权

评论回复
7
xyz549040622| | 2020-8-5 09:29 | 只看该作者
shushi007 发表于 2020-8-4 23:16
翻转GPIO操作已经是代码最快了,反汇编看到都是一条str指令就置高低电平操作了。不动存储周期,好像32M的 ...

32M的主频,IO翻转能达到20M已经很好了。

使用特权

评论回复
8
xyz549040622| | 2020-8-5 09:29 | 只看该作者
shushi007 发表于 2020-8-4 23:16
翻转GPIO操作已经是代码最快了,反汇编看到都是一条str指令就置高低电平操作了。不动存储周期,好像32M的 ...

32M的主频,IO翻转能达到20M已经很好了。

使用特权

评论回复
9
annko2005| | 2020-8-5 13:53 | 只看该作者
shushi007 发表于 2020-8-4 23:14
不确定在没有使用-o3优化的时候,GPIOA->ODR ^= GPIO_Pin_0的操作是否是gpio最快翻转操作,要从ODR读取一 ...

我已将把我们的HK32F030M的最新版的参考案例上传到论坛了,你可以直接下载。例程中有PD5,PB5做普通IO的例子。

使用特权

评论回复
10
幽恋梦涟| | 2020-8-5 15:50 | 只看该作者
要求这么高的速度,为什么不考虑使用其他外设去实现呢,比如这个驱动芯片,要是调光就用定时器的pwm模式,要是传输数据 这种芯片协议一般SPI改改都能靠的上吧,都要比直接反转io要好

使用特权

评论回复
11
shushi007|  楼主 | 2020-8-6 00:29 | 只看该作者
幽恋梦涟 发表于 2020-8-5 15:50
要求这么高的速度,为什么不考虑使用其他外设去实现呢,比如这个驱动芯片,要是调光就用定时器的pwm模式, ...

不行哦  一起要控制5个引脚  和spi一起的另外一个gpio无法一起同步

使用特权

评论回复
12
shushi007|  楼主 | 2020-8-6 00:30 | 只看该作者
xyz549040622 发表于 2020-8-5 09:29
32M的主频,IO翻转能达到20M已经很好了。

我是说32M的主频  实际CPU由于指令等待的问题  实际只跑了20M  ,32M主频理论上gpio翻转频率只能做到8M

使用特权

评论回复
13
shushi007|  楼主 | 2020-8-6 00:31 | 只看该作者
annko2005 发表于 2020-8-5 13:53
我已将把我们的HK32F030M的最新版的参考案例上传到论坛了,你可以直接下载。例程中有PD5,PB5做普通IO的例 ...

感谢

使用特权

评论回复
14
wangshujun| | 2020-8-21 22:25 | 只看该作者
shushi007 发表于 2020-8-3 23:29
目前 已经解决了。问题是flash初始化的时候等待周期为2,改为0等待周期 gpio速度可以达到8.3M,但是代码初 ...

有没有尝试把这个反转io的代码放到ram里面跑,在ram是零等待的

使用特权

评论回复
15
wangshujun| | 2020-8-21 22:27 | 只看该作者
是ws2812类似的led吗,这类led最好用dma+spi来刷,程序简单,时序也稳定,而且cpu可以空闲做很多其他事情

使用特权

评论回复
评论
joyall 2021-1-31 16:19 回复TA
用SPI怎么刷?求指点 
16
答案很长吧| | 2021-2-24 08:35 | 只看该作者
这个例子不错的,很棒,了解了。

使用特权

评论回复
17
34af9uc| | 2021-2-27 13:24 | 只看该作者
告诉你一个办法可以提到2/32,     比如说输出寄存器叫pa
while(1)
{
pa=1;
pa=0;

pa=1;
pa=0;

pa=1;
pa=0;

pa=1;
pa=0;
//尽量重复多写pa=1;pa=0;比如说写100遍
}

使用特权

评论回复
18
34af9uc| | 2021-2-27 13:27 | 只看该作者
34af9uc 发表于 2021-2-27 13:24
告诉你一个办法可以提到2/32,     比如说输出寄存器叫pa
while(1)
{

cpu是1机器周期1指令,明白没?

使用特权

评论回复
19
htmlme| | 2021-3-6 21:50 | 只看该作者
设置io高速呢   

使用特权

评论回复
20
yujielun| | 2021-3-6 21:50 | 只看该作者
驱动高度ADC还不行啊   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

26

帖子

0

粉丝