ST意法半导体
直播中

fdvcxhtg

8年用户 1022经验值
擅长:嵌入式技术
私信 关注
[问答]

如何优化GPIO数据总线速度?

最近接触了STM32,到目前为止相处得很好!后悔没有早点这样做,所以有大量的追赶和“学习做”(这里是机械工程背景)。
特别是学习;我想调查专业人员将如何为低端 mcu 实施优化的数据总线(例如 STM32F1x/预算限制)。以下是我到目前为止编写的代码,顺便说一句,效果很好,但是我觉得性能相当欠缺,某处某处。
有没有其他方法可以更快地获得 16 位???
附言。#define DATAOUT ( i) 似乎是瓶颈
感谢您提供的任何推荐/替代方法,我真诚地感谢您的帮助
  • //LCD.H
  • #define DATAOUT(i) {
  • GPIOA->BSRR = 0b0001000011111111 << 16;
  • GPIOA->BSRR = (((i) & (1<<0)) << 0)
  •                            | (((i) & (1<<1)) << 0)
  •                            | (((i) & (1<<2)) << 0)
  •                            | (((i) & (1<<3)) << 0)
  •                            | (((i) & (1<<4)) << 0)
  •                            | (((i) & (1<<5)) << 0)
  •                            | (((i) & (1<<6)) << 0)
  •                            | (((i) & (1<<7)) << 0)
  •                            | (((i) & (1<<12)) << 0);
  • GPIOB->BSRR = 0b1110111100000000 << 16;
  • GPIOB->BSRR = (((i) & (1<<8)) << 0)
  •                            | (((i) & (1<<9)) << 0)
  •                            | (((i) & (1<<10)) << 0)
  •                            | (((i) & (1<<11)) << 0)
  •                            | (((i) & (1<<13)) << 0)
  •                            | (((i) & (1<<14)) << 0)
  •                            | (((i) & (1<<15)) << 0);
  • }
  • //LCD.C
  • static void WriteData(uint16_t data)
  • {
  •         //elapsed_time_start(0);
  •         DATAOUT(data);                //elapsed_time@72Mhz -> 81 ticks(?!)
  •         //elapsed_time_stop(0);
  • }








回帖(1)

秦文汶

2023-2-8 09:49:06
81 个滴答声似乎很多。但这将非常依赖于您的优化设置。显然,其中的一些操作,如“<< 0”,可以被删除。
您可以将这些操作组合成一个,并且只访问 BSRR 一次。它是易变的,因此 CPU 无法优化访问。也就是说,假设您只想根据参数中的位设置 BSRR,而不是切换它两次。


  • const uint32_t mask = 0b0001000011111111;
  • GPIOA->BSRR = (mask << 16) | (mask & i);

我会这样做,然后查看反汇编代码以查看编译器在做什么。
还可以考虑使用 DMA 将值移入 BSRR。那是假设您可以提前计算出这些。否则这样的事情就足够了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分