MQX3.8源代码分析:GPIO(2)
在bsp包初始化的过程中,系统会根据用户在user_config.h文件中的宏定义,选择性地初始化gpio。
1、文件Init_bsp.c (source\bsp\twrk60n512)中,代码:
/* Install the GPIO driver */ #if BSPCFG_ENABLE_GPIODEV _io_gpio_install("gpio:"); #endif
/*FUNCTION*------------------------------- * * Function Name : _io_gpio_install * Returned Value : _mqx_uint a task error code or MQX_OK * Comments : * Install a gpio driver. * *END*----------------------------------*/ _mqx_uint _io_gpio_install ( /* [IN] A string that identifies the device for fopen */ /* input values are those identifiers defined in io_gpio.h file */ char_ptr identifier ) { /* Body */ if (IO_OK == gpio_cpu_init()) return _io_dev_install(identifier, _io_gpio_open, _io_gpio_close, _io_gpio_read, _io_gpio_write, gpio_cpu_ioctl, NULL); return (_mqx_uint)IO_ERROR; } /* Endbody */
/*FUNCTION***************************************************************** * * Function Name : gpio_cpu_install * Returned Value : IO_OK * Comments : * Performs basic initialization specific to board * *END*********************************************************************/ _mqx_int gpio_cpu_init() { /* Body */ _bsp_gpio_io_init(); return IO_OK; } /* Endbody */
/*FUNCTION*------------------------------- * * Function Name : _bsp_gpio_io_init * Returned Value : MQX_OK or -1 * Comments : * This function performs BSP-specific initialization related to GPIO * *END*----------------------------------*/ _mqx_int _bsp_gpio_io_init ( void ) { /* Enable clock gating to all ports */ SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK \ | SIM_SCGC5_PORTB_MASK \ | SIM_SCGC5_PORTC_MASK \ | SIM_SCGC5_PORTD_MASK \ | SIM_SCGC5_PORTE_MASK; return MQX_OK; }
可以对照该结构体和文档地址空间定义进行分析理解。((SIM_MemMapPtr)0x40047000u)语句对物理地址进行了强制类型转换,然后根据结构体空间的顺序紧凑性,就可以得出:SIM_SCGC5_REG(SIM_BASE_PTR)语句就是操作了SCGC5寄存器,给里边的相应位置数操作。
6、文件MK60DZ10.h(source\psp\cortex)中,代码:
#define SIM_SCGC5_PORTA_MASK 0x200u #define SIM_SCGC5_PORTA_SHIFT 9 #define SIM_SCGC5_PORTB_MASK 0x400u #define SIM_SCGC5_PORTB_SHIFT 10 #define SIM_SCGC5_PORTC_MASK 0x800u #define SIM_SCGC5_PORTC_SHIFT 11 #define SIM_SCGC5_PORTD_MASK 0x1000u #define SIM_SCGC5_PORTD_SHIFT 12 #define SIM_SCGC5_PORTE_MASK 0x2000u #define SIM_SCGC5_PORTE_SHIFT 13分析2:
从文档12.2.12 System Clock Gating Control Register 5 (SIM_SCGC5) 中可以看到,这些宏定义分别对应着ABCDE端口的始终脉冲门。在这里是打开了这些端口的时钟脉冲门,进行初始化。
我大概猜测一下:这些脉冲门,主要是控制给对应模块的时钟信号供给,当关闭脉冲门,就相当于关闭信号来源,那么就关闭了对应端口,可以达到省电的目的。为什么GPIO口还需要这些呢,其实当GPIO不管是输入还是输出,都有脉冲进行控制。当输出时,这些脉冲门信号供给,决定了你输出信号的响应时间,当信号频率越高,那么响应时间越短;当输入时,也是一样的道理,在微观上,当有外部信号过来,必须等到该引脚内部有脉冲输入的时候,他才能检测到你的外部信号过来,这里边同样有响应时间的问题。除了可以选择打开关闭,是不是还要有给GPIO口设置参考频率的寄存器,暂时还没有发现,不过我估计即便这个芯片没有,别的芯片可能也会有。