|
IO操作中我准备做两个实验
(1) 用IO口点亮LED,这就是让IO输出低电平(注板上的LED是阴极接在IO口,阳极由VCC串电阻上拉),这个实验是IO输出的实验。目的是熟悉工程配置,IAR的环境很熟悉,第一次做ARM的工程,用的的模板工程。
(2) 用按键输入让LED亮灭变换,主要是做IO的输入实验。
下面是LED和KEY的电路。
IO口点亮LED实验 套用了标准工程模板,这个模板中很体贴的做了systemInit.h和systemInit.c的文件。我在systemInit.h中添加了对两个按键和三个LED的IO口做了定义。 //define KEY1 #define KEY1_PERIHP
SYSCTL_PERIPH_GPIOD //需要使能的外设类型 #define KEY1_PORT
GPIO_PORTD_BASE //IO端口 #define KEY1_PIN
GPIO_PIN_1 //对应的引脚 这个我添加了注释后面的就是完全一样的。 //define KEY2 #define KEY2_PERIPH
SYSCTL_PERIPH_GPIOG #define KEY2_PORT
GPIO_PORTG_BASE #define KEY2_PIN
GPIO_PIN_5 //define LED1 #define LED1_PERIPH
SYSCTL_PERIPH_GPIOD #define LED1_PORT
GPIO_PORTD_BASE #define LED1_PIN
GPIO_PIN_0 //define LED2 #define LED2_PERIPH
SYSCTL_PERIPH_GPIOG #define LED2_PORT
GPIO_PORTG_BASE #define LED2_PIN
GPIO_PIN_2 //define LED3 #define LED3_PERIPH
SYSCTL_PERIPH_GPIOG #define LED3_PORT
GPIO_PORTG_BASE #define LED3_PIN
GPIO_PIN_3 然后是主函数: int main(void) { jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz SysCtlPeripheralEnable(LED1_PERIPH|LED2_PERIPH|LED3_PERIPH); //使能三个IO外设,其实LED2和LED3在同一个IO端口 GPIOPinTypeGPIOOutput(LED1_PORT,LED1_PIN);//指定的LED1管脚为推挽输出模式 GPIOPinTypeGPIOOutput(LED2_PORT,LED2_PIN);//指定的LED1管脚为推挽输出模式 GPIOPinTypeGPIOOutput(LED3_PORT,LED3_PIN);//指定的LED1管脚为推挽输出模式 for (;;) { GPIOPinWrite(LED1_PORT,LED1_PIN,0X00);//点亮LED1 GPIOPinWrite(LED1_PORT,LED1_PIN,0Xff); //熄灭LED1 GPIOPinWrite(LED2_PORT,LED2_PIN,0X00);//点亮LED2 GPIOPinWrite(LED2_PORT,LED2_PIN,0Xff); //熄灭LED2 GPIOPinWrite(LED3_PORT,LED3_PIN,0X00);//点亮LED3 GPIOPinWrite(LED3_PORT,LED3_PIN,0Xff); //熄灭LED3 } } 由于有库支持,我觉得这样搞不得真谛啊,不过我只是简单熟悉下外设,基本够了。 按键实验 实现基本的IO输入功能:按键KEY1按下的时候LED1点亮,KEY1松开则LED1熄灭。 主函数如下: int main(void) { jtagWait(); //防止JTAG失效,重要! clockInit(); //时钟初始化:晶振,6MHz
SysCtlPeripheralEnable(LED1_PERIPH|KEY1_PERIHP); //外设使能LED1和KEY1所在的IO端口 GPIOPinTypeGPIOOutput(LED1_PORT,LED1_PIN);//设置LED1所在的引脚为推挽输出 GPIOPinTypeGPIOInput(KEY1_PORT,KEY1_PIN); //设置KEY1所在的IO引脚为高阻输出 for (;;) { if(GPIOPinRead(KEY1_PORT,KEY1_PIN))//读到按键为高电平,即按键没被按下 { GPIOPinWrite(LED1_PORT,LED1_PIN,0Xff);//LED1为熄灭状态 } else { GPIOPinWrite(LED1_PORT,LED1_PIN,0X00);//按键为低电平,则LED1点亮 } } } 我用这两个非常简单的IO实验了解了在驱动库的基础上操作IO的方式,基本上熟悉了驱动库基础上配置MCU的方式。说句实话驱动库给coding带来了极大的便利,以至于根本不需要看底层的配置寄存器了。但给人一种心里毛毛的感觉,没去看最底层,很不踏实。所以我觉得基于驱动库把学ARM作为入门MCU可能不太好,看的高了下面基础的东西就看不到了。一直很不赞成把51作为入门的MCU,觉得太老用起来麻烦,入门很困难。现在看来这么做还是很有道理的,正因为51配置麻烦,逐个寄存器的写啊读啊,才把基础给掌握了。这些都是初识M3的一些想法,扯得有些远了。 流明的M3给我还有一个很深的感受就是它的IO很有特色,可配置为推挽输出,开漏输出和高阻输入,最有意思的是驱动电流可选为2mA、4mA、8mA和带转换速率控制的8mA。 它的解释是驱动电流却大,功耗高,所以可以根据负载选择合适的驱动电流来降低功耗。带转换速率控制的8mA开始的时候让我很不解,什么意思?后来发现是这么回事:比如负载需要配置到8mA驱动,但是普通的8mA驱动它的上升下降时间为6ns,但是我们并不需要这么快的速率,那么就可以使用带转换速率控制的8mA驱动模式,这样上升下降时间增加了,但是信号变慢电磁干扰就降低了。这个IO真的很有特色,可以说是高级了,我也是第一次见到,以前用的MCU、DSP和FPGA都没见到这种功能。也算是流明的这款MCU的过人之处吧,不过其他厂商的M3有没有这样的功能我也不知道,这里就带各位朋友斧正了。 此次暂时作结吧!按照目标开始看定时器。