打印
[技术问答]

M451 外部晶振 CPU时钟能到达72M吗 还有IO翻转速度能达多少

[复制链接]
1227|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
s290484188|  楼主 | 2017-2-18 15:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
while(1)
{
PE1 ^= 1;
}
执行以上代码 ,高低电平时间为142ns
while(1)
{
PE1 ^= 1;
cnt++;
cnt++;
cnt++;
cnt++;
cnt++;
cnt++;
cnt++;
cnt++;
}
执行以上代码,高低电平时间各为846ns
(846-142)/8 = 88
我理解成执行cnt++ 需要88ns
看keil中,这条语句执行了5条汇编
0x000005AA 4840      LDR           r0,[pc,#256]  ; @0x000006AC
0x000005AC 8800      LDRH          r0,[r0,#0x00]
0x000005AE 1C40      ADDS          r0,r0,#1
0x000005B0 493E      LDR           r1,[pc,#248]  ; @0x000006AC
0x000005B2 8008      STRH          r0,[r1,#0x00]
那执行一条汇编大概为17ns,按17ns算的话,CPU工作时钟才58Mhz
这样的话,IO翻转的速度才7M?
沙发
734774645| | 2017-2-19 18:05 | 只看该作者
IO的速度有个IO 时钟的配置,那个就是速度。

使用特权

评论回复
板凳
734774645| | 2017-2-19 18:05 | 只看该作者
CPU的速度通常用PLL来达到72Mhz

使用特权

评论回复
地板
734774645| | 2017-2-19 18:23 | 只看该作者
高翻转速率控制控制
0 = Px.n 输出是基本转换速度
1 = Px.n 输出是高翻转速度
其中手册提到有个寄存器是可以控制每个端口的翻转速度的,具体是如何的高速,没有太多解释。

使用特权

评论回复
5
598330983| | 2017-2-19 19:18 | 只看该作者
通常你做什么应用才需要高速的IO翻转速度呢?

使用特权

评论回复
6
598330983| | 2017-2-19 19:18 | 只看该作者
系统默认的应该是基本转换速度,如果需要支持高速可以配置那个高速翻转的寄存器。

使用特权

评论回复
7
heisexingqisi| | 2017-2-19 23:46 | 只看该作者
只有两种模式可以选择,楼主可以试试用PLL跑最快速度,看看能达到多少。

使用特权

评论回复
8
yiyigirl2014| | 2017-2-20 00:14 | 只看该作者
应该可以更高通过PLL。

使用特权

评论回复
9
s290484188|  楼主 | 2017-2-20 08:28 | 只看该作者
598330983 发表于 2017-2-19 19:18
通常你做什么应用才需要高速的IO翻转速度呢?

gpio模拟SPI从机,因为主机的SPI是非标准的,在CS高电平时也有数据,所以要用IO模拟接收并且返回

使用特权

评论回复
10
s290484188|  楼主 | 2017-2-20 09:50 | 只看该作者
734774645 发表于 2017-2-19 18:05
CPU的速度通常用PLL来达到72Mhz

外部22.1184M晶振,配置PLL分配,输出72Mhz,但是实际并没有达到
我是测了下执行i++;需要88ns,

不知道是我设置的问题,还是本身就达不到

使用特权

评论回复
11
s290484188|  楼主 | 2017-2-20 09:50 | 只看该作者
734774645 发表于 2017-2-19 18:23
高翻转速率控制控制
0 = Px.n 输出是基本转换速度
1 = Px.n 输出是高翻转速度

设置了高速模式,根低速没什么区别

使用特权

评论回复
12
john_lee| | 2017-2-20 10:33 | 只看该作者
你应该这样:
while(1)
{
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
  PE1 = 1;
  PE1 = 0;
}

使用特权

评论回复
13
s290484188|  楼主 | 2017-2-20 13:28 | 只看该作者


30ns切换一次,有33Mhz
   165:         PE5 = 1;
0x00000594 2001      MOVS          r0,#0x01
0x00000596 6008      STR           r0,[r1,#0x00]
   166:         PE5 = 0;
0x00000598 2000      MOVS          r0,#0x00
0x0000059A 6008      STR           r0,[r1,#0x00]
时钟周期有66M左右,理论上这个速度也够快了

但是我去GPIO模拟SPI从机的时候
中断响应CS下降沿,还是来不及,我有500ns的时间接受第一位数据

使用特权

评论回复
14
s290484188|  楼主 | 2017-2-20 14:29 | 只看该作者

修改了下代码
只对cs进行判断,然后再等待18个spi_clk,将数据保存;
  • void GPE_IRQHandler(void)
  • {
  •         save[id] = 0;
  •         for(i = 18; i >= 0;i--)//一个CS共19个clk
  •         {
  •                 while(PE3);//下降沿
  •                  sta = PE4;
  •                 save[id] |= (sta<<i);
  •                 while(PE3 == 0);//上升沿
  •         }
  •         id ++;
  •         if(id >= 35)
  •                 id = 0;
  •         GPIO_CLR_INT_FLAG(PE, BIT1);
  • }
这样速度应该是最快的吧,测试了下数据正常,但是感觉还是很慢,
每次判断出下降沿到读到PE4(7和8两行代码)需要花600ns左右

使用特权

评论回复
15
稳稳の幸福| | 2017-2-20 16:06 | 只看该作者
不是很了解这个速度问题,也没时钟控制,也没遇到过需要太高速的翻转需求,如果实在要求翻转,可以用PWM做50%占空比嗄

使用特权

评论回复
16
643757107| | 2017-2-20 19:16 | 只看该作者
好像有个翻转IO的指令,直接用指令测试。你添加for循环或者while循环实际上是不准确的,每次都要多消耗几个周期 。

使用特权

评论回复
17
598330983| | 2017-2-20 19:27 | 只看该作者
s290484188 发表于 2017-2-20 08:28
gpio模拟SPI从机,因为主机的SPI是非标准的,在CS高电平时也有数据,所以要用IO模拟接收并且返回 ...

你要用的SPI的频率很高吗

使用特权

评论回复
18
john_lee| | 2017-2-21 09:00 | 只看该作者
s290484188 发表于 2017-2-20 14:29
修改了下代码
只对cs进行判断,然后再等待18个spi_clk,将数据保存;

这样应该还可以快一点:
void GPE_IRQHandler(void)
{
  uint_fast8_t n = 19;
  uint_fast32_t data = 0;
  do {
    data <<= 1;
    while (PE3 != 0);
    data |= PE4;
    while (PE3 == 0);
  } while (--n != 0);
  GPIO_CLR_INT_FLAG(PE, BIT1);
  n = id;
  save[n] = data;
  if (++n >= 35)
    n = 0;
  id = n;
}

使用特权

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

本版积分规则

16

主题

52

帖子

0

粉丝