[技术问答] M451 外部晶振 CPU时钟能到达72M吗 还有IO翻转速度能达多少

[复制链接]
 楼主| 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 输出是高翻转速度
其中手册提到有个寄存器是可以控制每个端口的翻转速度的,具体是如何的高速,没有太多解释。
598330983 发表于 2017-2-19 19:18 | 显示全部楼层
通常你做什么应用才需要高速的IO翻转速度呢?
598330983 发表于 2017-2-19 19:18 | 显示全部楼层
系统默认的应该是基本转换速度,如果需要支持高速可以配置那个高速翻转的寄存器。
heisexingqisi 发表于 2017-2-19 23:46 | 显示全部楼层
只有两种模式可以选择,楼主可以试试用PLL跑最快速度,看看能达到多少。
yiyigirl2014 发表于 2017-2-20 00:14 | 显示全部楼层
应该可以更高通过PLL。
 楼主| s290484188 发表于 2017-2-20 08:28 | 显示全部楼层
598330983 发表于 2017-2-19 19:18
通常你做什么应用才需要高速的IO翻转速度呢?

gpio模拟SPI从机,因为主机的SPI是非标准的,在CS高电平时也有数据,所以要用IO模拟接收并且返回
 楼主| s290484188 发表于 2017-2-20 09:50 | 显示全部楼层
734774645 发表于 2017-2-19 18:05
CPU的速度通常用PLL来达到72Mhz

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

不知道是我设置的问题,还是本身就达不到
 楼主| s290484188 发表于 2017-2-20 09:50 | 显示全部楼层
734774645 发表于 2017-2-19 18:23
高翻转速率控制控制
0 = Px.n 输出是基本转换速度
1 = Px.n 输出是高翻转速度

设置了高速模式,根低速没什么区别
john_lee 发表于 2017-2-20 10:33 | 显示全部楼层
你应该这样:
  1. while(1)
  2. {
  3.   PE1 = 1;
  4.   PE1 = 0;
  5.   PE1 = 1;
  6.   PE1 = 0;
  7.   PE1 = 1;
  8.   PE1 = 0;
  9.   PE1 = 1;
  10.   PE1 = 0;
  11.   PE1 = 1;
  12.   PE1 = 0;
  13.   PE1 = 1;
  14.   PE1 = 0;
  15.   PE1 = 1;
  16.   PE1 = 0;
  17.   PE1 = 1;
  18.   PE1 = 0;
  19. }
 楼主| 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的时间接受第一位数据
 楼主| 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左右
稳稳の幸福 发表于 2017-2-20 16:06 | 显示全部楼层
不是很了解这个速度问题,也没时钟控制,也没遇到过需要太高速的翻转需求,如果实在要求翻转,可以用PWM做50%占空比嗄
643757107 发表于 2017-2-20 19:16 | 显示全部楼层
好像有个翻转IO的指令,直接用指令测试。你添加for循环或者while循环实际上是不准确的,每次都要多消耗几个周期 。
598330983 发表于 2017-2-20 19:27 | 显示全部楼层
s290484188 发表于 2017-2-20 08:28
gpio模拟SPI从机,因为主机的SPI是非标准的,在CS高电平时也有数据,所以要用IO模拟接收并且返回 ...

你要用的SPI的频率很高吗
john_lee 发表于 2017-2-21 09:00 | 显示全部楼层
s290484188 发表于 2017-2-20 14:29
修改了下代码
只对cs进行判断,然后再等待18个spi_clk,将数据保存;

这样应该还可以快一点:
  1. void GPE_IRQHandler(void)
  2. {
  3.   uint_fast8_t n = 19;
  4.   uint_fast32_t data = 0;
  5.   do {
  6.     data <<= 1;
  7.     while (PE3 != 0);
  8.     data |= PE4;
  9.     while (PE3 == 0);
  10.   } while (--n != 0);
  11.   GPIO_CLR_INT_FLAG(PE, BIT1);
  12.   n = id;
  13.   save[n] = data;
  14.   if (++n >= 35)
  15.     n = 0;
  16.   id = n;
  17. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

16

主题

54

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部