• LoRaWAN_stack移植笔记 (二)_GPIO


    stm32相关的配置

    由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱动所以做修改。另外例程中对STM32库函数的再一次封装的方法也非常值得学习。

    GPIO 的配置

    GpioInit( &obj->Tx, tx, PIN_ALTERNATE_FCT, PIN_PUSH_PULL, PIN_PULL_UP, GPIO_AF0_USART1 );
    

    例程中可以看到,对IO口的初始化只有这一句,是因为例程中对GPIO的操作进行了封装,方便了上层的使用。

    /*!
     * Board GPIO pin names
     */
    typedef enum
    {
        MCU_PINS,
        IOE_PINS,
    
        // Not connected
        NC = (int)0xFFFFFFFF
    }PinNames;
    
    /*!
     * STM32 Pin Names
     */
    #define MCU_PINS 
        PA_0 = 0, PA_1, PA_2, PA_3, PA_4, PA_5, PA_6, PA_7, PA_8, PA_9, PA_10, PA_11, PA_12, PA_13, PA_14, PA_15, 
        PB_0, PB_1, PB_2, PB_3, PB_4, PB_5, PB_6, PB_7, PB_8, PB_9, PB_10, PB_11, PB_12, PB_13, PB_14, PB_15,     
        PC_0, PC_1, PC_2, PC_3, PC_4, PC_5, PC_6, PC_7, PC_8, PC_9, PC_10, PC_11, PC_12, PC_13, PC_14, PC_15,     
        PD_0, PD_1, PD_2, PD_3, PD_4, PD_5, PD_6, PD_7, PD_8, PD_9, PD_10, PD_11, PD_12, PD_13, PD_14, PD_15,     
        PE_0, PE_1, PE_2, PE_3, PE_4, PE_5, PE_6, PE_7, PE_8, PE_9, PE_10, PE_11, PE_12, PE_13, PE_14, PE_15,     
        PF_0, PF_1, PF_2, PF_3, PF_4, PF_5, PF_6, PF_7, PF_8, PF_9, PF_10, PF_11, PF_12, PF_13, PF_14, PF_15,     
        PH_0, PH_1, PH_2, PH_3, PH_4, PH_5, PH_6, PH_7, PH_8, PH_9, PH_10, PH_11, PH_12, PH_13, PH_14, PH_15
    

    例程中使用Enum定义了64个IO口,其中

    • 0-15 表示PA0-15
    • 16-31表示PB0-15
    • 32-47表示PC0-15
    • 48-63表示PD0-15
    • 64-79表示PE0-15
    • 80-95表示PF0-15
    • 96-111表示PH0-15

    这样,在定义引脚的时候直接是用Enum变量就可以表示出IO的PIN以及PORT,在完成驱动程序之后,操作引脚非常的方便。

    例如 使用了一个LED灯,连接的是PB_5,这样我们#define LED PB_5,在程序里面就可以得知使用的是PB口,以及PIN_5,方法如下:

    由于PB_5 = 16+5 = 21;
    21/16 = 1,得知使用的是PB口,21%16 = 5,得知使用的是PIN_5。
    

    其中C语言的时下代码如下,使用(&0xff)以及<<的操作,效率比做除法及取模的效率更高

    void GpioMcuInit( Gpio_t *obj, PinNames pin, PinModes mode, PinConfigs config, PinTypes type, uint32_t value )
    {
        GPIO_InitTypeDef GPIO_InitStructure;
    
        if( pin == NC )
        {
            return;
        }
        obj->pin = pin;
        obj->pinIndex = ( 0x01 << ( obj->pin & 0x0F ) );
    
        if( ( obj->pin & 0xF0 ) == 0x00 )
        {
            obj->port = GPIOA;
            __HAL_RCC_GPIOA_CLK_ENABLE( );
        }
        else if( ( obj->pin & 0xF0 ) == 0x10 )
        {
            obj->port = GPIOB;
            __HAL_RCC_GPIOB_CLK_ENABLE( );
        }
        else if( ( obj->pin & 0xF0 ) == 0x20 )
        {
            obj->port = GPIOC;
            __HAL_RCC_GPIOC_CLK_ENABLE( );
        }
        else if( ( obj->pin & 0xF0 ) == 0x30 )
        {
            obj->port = GPIOD;
            __HAL_RCC_GPIOD_CLK_ENABLE( );
        }
        else
        {
            obj->port = GPIOH;
            __HAL_RCC_GPIOH_CLK_ENABLE( );
        }
    
        GPIO_InitStructure.Pin =  obj->pinIndex ;
        GPIO_InitStructure.Pull = type;
        GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    
        if( mode == PIN_INPUT )
        {
            GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
        }
        else if( mode == PIN_ANALOGIC )
        {
            GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
        }
        else if( mode == PIN_ALTERNATE_FCT )
        {
            if( config == PIN_OPEN_DRAIN )
            {
                GPIO_InitStructure.Mode = GPIO_MODE_AF_OD;
            }
            else
            {
                GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;
            }
            GPIO_InitStructure.Alternate = value;
        }
        else // mode ouptut
        {
            if( config == PIN_OPEN_DRAIN )
            {
                GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
            }
            else
            {
                GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
            }
        }
    
        HAL_GPIO_Init( obj->port, &GPIO_InitStructure );
    
        // Sets initial output value
        if( mode == PIN_OUTPUT )
        {
            GpioMcuWrite( obj, value );
        }
    }
    
  • 相关阅读:
    Django搭建开发‘学习笔记’项目二(创建应用程序)
    Django搭建开发‘学习笔记’项目一(建立项目)
    WEB渗透 --- 常见问题总结
    ConstraintLayout使用手册
    Java源码分析(1):二分查找 + 循环递归实现
    小黄衫买家秀
    Android权限申请完全解析(一):Android自带的权限申请
    个人作业——软件工程实践总结作业
    beta阶段学习博客(一) js交互
    个人作业——软件产品案例分析
  • 原文地址:https://www.cnblogs.com/answerinthewind/p/6272329.html
Copyright © 2020-2023  润新知