[ZLG-MCU] 请问周工:lm3s6xx 读写IO的速度

[复制链接]
2922|11
 楼主| lidawei1 发表于 2008-3-2 16:43 | 显示全部楼层 |阅读模式
lm3s6xx,软件读或写io脚需几个时钟周期?<br />如假设运行于50M的频率,连续读或写io脚能达到什么频率?<br />STM32F10x据说运行于72M时只能输出18M的方波。<br />望拿出实际数据以便比较,最好有个类似“LPC214x_user_cn.pdf”P101、P102页的输出15.38M方波的图表例子。
zlgmcu 发表于 2008-3-3 11:43 | 显示全部楼层

LM3S运行于50MHz时GPIO管脚可以输出25MHz的方波

我以前测试过,但忘记程序放在那里了,下午贴一个新的。<br /><br />(zlgmcu_wdx)
zlgmcu 发表于 2008-3-3 14:17 | 显示全部楼层

刚才写了个测试程序,GPIO管脚确实可以产生高达25MHz的方波

<br />下面的例程在EasyARM615开发板上测试通过,用示波器观察PC6或PD5管脚,会看到25MHz的方波。此时内核速度为50MHz。<br /><br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_timer.h&quot;<br />#include&nbsp;&nbsp;&quot;interrupt.h&quot;<br />#include&nbsp;&nbsp;&quot;sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;timer.h&quot;<br /><br />#define&nbsp;&nbsp;SysCtlPeriEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;GPIOPinTypeIn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOInput<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br /><br />#define&nbsp;&nbsp;KEY_JTAG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTA_BASE&nbsp;,&nbsp;GPIO_PIN_2<br />#define&nbsp;&nbsp;CCP2_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_PERIPH_GPIOD<br />#define&nbsp;&nbsp;CCP2_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTD_BASE&nbsp;,&nbsp;GPIO_PIN_5<br />#define&nbsp;&nbsp;CCP3_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_PERIPH_GPIOC<br />#define&nbsp;&nbsp;CCP3_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTC_BASE&nbsp;,&nbsp;GPIO_PIN_6<br />#define&nbsp;&nbsp;T1_A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER1_BASE&nbsp;,&nbsp;TIMER_A<br />#define&nbsp;&nbsp;T1_B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER1_BASE&nbsp;,&nbsp;TIMER_B<br />#define&nbsp;&nbsp;T1_BOTH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER1_BASE&nbsp;,&nbsp;TIMER_BOTH<br />#define&nbsp;&nbsp;T1_BOTH_CFG_16_PWM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER1_BASE&nbsp;,&nbsp;(&nbsp;TIMER_CFG_16_BIT_PAIR&nbsp;&nbsp;|&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CFG_A_PWM&nbsp;&nbsp;|&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMER_CFG_B_PWM&nbsp;)<br /><br />void&nbsp;&nbsp;waitJTAG&nbsp;(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn&nbsp;(&nbsp;SYSCTL_PERIPH_GPIOA&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能GPIOA端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeIn&nbsp;(&nbsp;KEY_JTAG&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置按键所在的PA2管脚为输入&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;GPIOPinRead&nbsp;(&nbsp;KEY_JTAG&nbsp;)&nbsp;&nbsp;==&nbsp;&nbsp;0x00&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;如果有键按下,则进入&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;;&nbsp;;&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;死循环,以等待JTAG连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;&nbsp;Timer1Init&nbsp;(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn&nbsp;(&nbsp;CCP2_PORT&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能CCP2所在的GPIO端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn&nbsp;(&nbsp;CCP3_PORT&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能CCP3所在的GPIO端口&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeTimer&nbsp;(&nbsp;CCP2_PIN&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置CCP2管脚为PWM输出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeTimer&nbsp;(&nbsp;CCP3_PIN&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置CCP3管脚为PWM输出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn&nbsp;(&nbsp;SYSCTL_PERIPH_TIMER1&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能定时器模块&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerConfigure&nbsp;(&nbsp;T1_BOTH_CFG_16_PWM&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;配置定时器为双16位PWM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerControlLevel&nbsp;(&nbsp;T1_BOTH&nbsp;,&nbsp;true&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;控制PWM输出反相&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerLoadSet&nbsp;(&nbsp;T1_BOTH&nbsp;,&nbsp;1&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置定时器初值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerMatchSet&nbsp;(&nbsp;T1_A&nbsp;,&nbsp;0&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置TimerA的PWM匹配值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerMatchSet&nbsp;(&nbsp;T1_B&nbsp;,&nbsp;0&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置TimerB的PWM匹配值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TimerEnable&nbsp;(&nbsp;T1_BOTH&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能定时器计数,PWM开始输出&nbsp;&nbsp;&nbsp;&nbsp;*/<br />}<br /><br />int&nbsp;&nbsp;main&nbsp;(&nbsp;void&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;waitJTAG&nbsp;(&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;防止JTAG失效&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlLDOSet(SYSCTL_LDO_2_75V);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;内核电压设置为最高的2.75V<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_USE_PLL&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;配置系统时钟,采用PLL,50MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_OSC_MAIN&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_XTAL_6MHZ&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_SYSDIV_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;Timer1Init&nbsp;(&nbsp;)&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;定时器初始化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(&nbsp;;&nbsp;;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />(zlgmcu_wdx)
 楼主| lidawei1 发表于 2008-3-3 15:39 | 显示全部楼层

非常感谢周工的测试!

非常感谢周工的测试!<br />但可能我没说清楚,是任意一个IO管脚的输入或输出,不是PWM的输出,如“LPC214x_user_cn.pdf”第101页的例子:<br />ldr&nbsp;r0,&nbsp;=0xe01fc1a0&nbsp;/*寄存器地址-使能高速端口*/<br />mov&nbsp;r1,&nbsp;#0x1<br />str&nbsp;r1,&nbsp;[r0]&nbsp;/*使能高速端口0*/<br />ldr&nbsp;r1,&nbsp;=0xffffffff<br />ldr&nbsp;r0,&nbsp;=0x3fffc000&nbsp;/*高速端口0&nbsp;的方向*/<br />str&nbsp;r1,&nbsp;[r0]<br />ldr&nbsp;r0,&nbsp;=0xe0028018&nbsp;/*低速端口1&nbsp;的方向*/<br />str&nbsp;r1,&nbsp;[r0]<br />ldr&nbsp;r0,&nbsp;=0x3fffc018&nbsp;/*FIO0SET&nbsp;–&nbsp;高速端口0&nbsp;寄存器*/<br />ldr&nbsp;r1,&nbsp;=0x3fffc01c&nbsp;/*FIO0CLR0&nbsp;–&nbsp;高速端口0&nbsp;寄存器*/<br />ldr&nbsp;r2,&nbsp;=0xC0010000&nbsp;/*选择高速端口0.16&nbsp;用于触发*/<br />ldr&nbsp;r3,&nbsp;=0xE0028014&nbsp;/*IO1SET&nbsp;–&nbsp;低速端口1&nbsp;寄存器*/<br />ldr&nbsp;r4,&nbsp;=0xE002801C&nbsp;/*IO1CLR&nbsp;–&nbsp;低速端口1&nbsp;寄存器*/<br />ldr&nbsp;r5,&nbsp;=0x00100000&nbsp;/*选择低速端口1.20&nbsp;用于触发*/<br />/*在高速端口上生成2&nbsp;个脉冲<br />str&nbsp;r2,&nbsp;[r0]<br />str&nbsp;r2,&nbsp;[r1]<br />str&nbsp;r2,&nbsp;[r0]<br />str&nbsp;r2,&nbsp;[r1]<br /><br />按此例子,在50M的LM3s6xx上能输出多大频率的方波?<br />
zlgmcu 发表于 2008-3-3 17:17 | 显示全部楼层

换个用库函数(效率低)写的GPIO翻转例程,2.271MHz

现在再贴一个利用Luminary官方提供的驱动库写的例程,测试结果是2.271MHz<br />不过库函数的效率低,不能完全说明问题。改天再贴个汇编的例子。<br /><br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;gpio.h&quot;<br /><br /><br />#define&nbsp;&nbsp;SysCtlPeriEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;SysCtlPeriDis&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralDisable<br />#define&nbsp;&nbsp;GPIOPinTypeIn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOInput<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br />#define&nbsp;&nbsp;KEY_PORT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_PERIPH_GPIOA<br />#define&nbsp;&nbsp;KEY_PIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTA_BASE,GPIO_PIN_2<br />#define&nbsp;&nbsp;PB0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,GPIO_PIN_0<br /><br /><br />//&nbsp;防止JTAG失效<br />void&nbsp;&nbsp;WaitJTAG(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn(KEY_PORT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能按键所在的GPIO端口<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeIn(KEY_PIN);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置按键所在的管脚为输入<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;GPIOPinRead(KEY_PIN)&nbsp;==&nbsp;0x00&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;如果有键按下,则进入<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;死循环,以等待JTAG连接<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriDis(KEY_PORT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;禁止按键所在的GPIO端口<br />}<br /><br /><br />//&nbsp;延时<br />void&nbsp;&nbsp;timeDelay(unsigned&nbsp;long&nbsp;&nbsp;ulVal)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;--ulVal&nbsp;&nbsp;!=&nbsp;&nbsp;0&nbsp;);<br />}<br /><br /><br />int&nbsp;&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;WaitJTAG();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;防止JTAG失效<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlLDOSet(SYSCTL_LDO_2_75V);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;内核电压设置为最高的2.75V<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_USE_PLL&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;配置系统时钟,采用PLL,50MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_OSC_MAIN&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_XTAL_6MHZ&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_SYSDIV_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriEn(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB端口<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(PB0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0为输出<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(PB0,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(PB0,0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />(zlgmcu_wdx)
 楼主| lidawei1 发表于 2008-3-3 18:10 | 显示全部楼层

等待中...

  
zlgmcu 发表于 2008-3-4 10:02 | 显示全部楼层

C语言、寄存器,可以到4.55MHz

以下是用C语言写的,没用库函数,而是直接操作寄存器<br />CPU内核为50MHz,得到的GPIO翻转速度是4.55MHz<br /><br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;gpio.h&quot;<br /><br />int&nbsp;&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlLDOSet(SYSCTL_LDO_2_75V);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;内核电压设置为最高的2.75V<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlClockSet(SYSCTL_USE_PLL&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;配置系统时钟,采用PLL,50MHz<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_OSC_MAIN&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_XTAL_6MHZ&nbsp;&nbsp;|<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSCTL_SYSDIV_4);<br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB端口<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_0,GPIO_DIR_MODE_OUT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0为输出<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0为8mA推挽<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_STRENGTH_8MA,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PIN_TYPE_STD);<br />Loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;Loop;<br />}<br /><br /><br />(zlgmcu_wdx)
AIRWILL 发表于 2008-3-4 10:15 | 显示全部楼层

楼上的测试跑题了

虽然做了很大的努力,但是,和抱歉<br /><br />人家要求&nbsp;读或写io脚需几个时钟周期?<br /><br />其实是想知道,操作&nbsp;IO&nbsp;寄存器是否单周期完成,还是要插入等待周期
zlgmcu 发表于 2008-3-4 10:17 | 显示全部楼层

如果用汇编则GPIO翻转速度最快可以到10MHz

在7楼程序里的循环是:<br /><br />Loop:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;Loop;<br /><br /><br />用IAR编译器看到的汇编代码是:<br /><br />;Loop:<br />;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清除PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;[PC,#0x018]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;[0x440]&nbsp;=0x40005004<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1#0x0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;[R0,&nbsp;#0]<br />;&nbsp;&nbsp;&nbsp;HWREG(GPIO_PORTB_BASE&nbsp;+&nbsp;(GPIO_O_DATA&nbsp;+&nbsp;(GPIO_PIN_0&nbsp;&lt&lt&nbsp;2)))&nbsp;=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;置位PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R0,&nbsp;[PC,#0x010]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;[0x440]&nbsp;=0x40005004<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MOVS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1#0x1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R1,&nbsp;[R0,&nbsp;#0]<br />;&nbsp;&nbsp;&nbsp;goto&nbsp;&nbsp;Loop;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x000426<br /><br />总共7条指令,按照4.55MHz的GPIO翻转率推算,花了11个时钟周期。<br />如果用汇编来写程序,LDR和MOVS指令完成的动作都可以事先设定好,而循环里只有两条STR指令。照此推算,仅需要5个时钟周期,即GPIO翻转率可达10MHz。<br /><br /><br />(zlgmcu_wdx)
zlgmcu 发表于 2008-3-4 10:20 | 显示全部楼层

8楼:如果单说写或者读,最快只需要2个周期!

因为一条STR存储器操作指令只需要2个周期。
 楼主| lidawei1 发表于 2008-3-4 11:27 | 显示全部楼层

Luminary Micro Forums 相关:

zlgmcu 发表于 2008-3-4 11:47 | 显示全部楼层

谢谢11楼提供的官方解释!

while(1)循环相当于goto语句,变成汇编是一条B指令,执行B指令仅需1个周期。STR指令是2个周期,因此输出方波高电平40ns、低电平60ns的现象。<br /><br />要说输出方波频率还可以更高,极限是12.5MHz,方法是:<br /><br />while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r2]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2]&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r2]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2]&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r2]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2]&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;[r2]&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;str&nbsp;&nbsp;&nbsp;&nbsp;r4,&nbsp;[r2]&quot;);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;<br />}<br /><br /><br />(zlgmcu_wdx)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

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