false

false

EN

1、MSIO是什么? 

        MSIO是混合信号输入输出口,它与GPIO的不同点在于,可以用来做ADC通道;电源域跟普通GPIO不同,电源为VBATL;MSIO引脚外部引出了5个,MSIO0~4,内部还有两个分别用于电池和温度检测。     

2、MSIO的普通IO使用 

         MSIO的端口复用如下图:     

            

        查看我们的硬件图纸,MSIO的接口之设置了一个MSIO4接LED1,其他接口都是悬空状态。在J11上都有引出,我们可以用MSIO_0接一个线短路到地来模拟按键功能。     

            

            

            

3、MSIO普通IO的软件实现   

         基于前面GPIO的代码框架,我们继续添加MSIO代码的内容,MSIO的输入脚我们用MSIO_0,输出用MSIO_4。前面学习GPIO时我们使用的是LL层的封装,但是发现一个问题,LL的封装没有hal的集成度高,虽然我们在BLE的工程中不能直接使用hal的系统函数,但是hal的封装函数我们还是可以直接使用的,需要把hal层的头文件包含进来即可。 

        首先需要包含MSIO对应的hal层头文件:“#include "gr55xx_hal_msio.h"”,在头文件中我们很容易找到对MSIO口操作的初始化,读,写函数,还有IO口状态翻转的函数: 

void hal_msio_init(msio_init_t *p_msio_init);      //msio口初始化函数
msio_pin_state_t hal_msio_read_pin(uint16_t msio_pin);  //读msio口状态
void hal_msio_write_pin(uint16_t msio_pin, msio_pin_state_t pin_state); //写入输出给msio的状态
void hal_msio_toggle_pin(uint16_t msio_pin);    //设置msio口输出状态翻转


         函数都找到了,功能也都清楚了,现在就是把功能转化为代码了,main.c文件中添加代码如下:

#define LED1_PIN        MSIO_PIN_4                      //定义LED1对应的pin脚
#define LED1_SET()      hal_msio_write_pin(LED1_PIN, MSIO_PIN_SET)  //定义LED1输出高电平
#define LED1_CLR()      hal_msio_write_pin(LED1_PIN, MSIO_PIN_RESET) //定义LED1输出低电平
#define LED1_TOG()      hal_msio_toggle_pin(LED1_PIN)       //定义LED1输出翻转
#define KEY_MSIO_0      MSIO_PIN_0       //定义MISO的key功能pin
//led1的端口初始化
void msio_led_init(void)
{
    msio_init_t msio_config = MSIO_DEFAULT_CONFIG;
    
    msio_config.direction = MSIO_DIRECTION_OUTPUT; //设置为输入口
    msio_config.mode  = MSIO_MODE_DIGITAL;        //设置为数字IO口功能
    msio_config.pin  = LED1_PIN;                   //设置pin脚
    msio_config.pull  = MSIO_NOPULL;               //无上下拉
    msio_config.mux = MSIO_MUX_7,             //设置多功能复用为GPIO功能  
    hal_msio_init(&msio_config);   //msio
    LED1_SET();
}
//msio key的端口初始化
void msio_key_init(void)
{
    msio_init_t msio_config;
    
    msio_config.direction = MSIO_DIRECTION_INPUT;
    msio_config.mode  = MSIO_MODE_DIGITAL;
    msio_config.pin  = KEY_MSIO_0;
    msio_config.pull  = MSIO_PULLUP;
    msio_config.mux = MSIO_MUX_7,
    hal_msio_init(&msio_config);
}
//按键的读取,为了做消抖,定义了两个全局的按键状态变量,以及按键的读取函数如下:
bool gkey_msio_down = false;
bool gkey_msio_up = true;
bool msio_key_status(void)
{
    unsigned int value = 0;
    value = hal_msio_read_pin(KEY_MSIO_0);
    if(0 == value)
    {
        hal_delay(10);
        value = hal_msio_read_pin(KEY_MSIO_0);
        if(0 == value)
        {
            if(gkey_msio_up)
            {
                gkey_msio_down = true;
                gkey_msio_up = false;
                return true;
            }
        }
    }
    else
    {
        gkey_msio_down = false;
        gkey_msio_up = true;
        return false;
    }
    return false;
}

    上面的功能性代码我们写成函数,方便main函数调用,这样main函数也相对简洁;main函数如下: 

 int main (void)

{
    // Initialize user peripherals.
    app_periph_init();
    
    // Initialize ble stack.
    ble_stack_init(&s_app_ble_callback, &heaps_table);/*< init ble stack*/
    hal_init();         //hal层初始化,按键消抖会用到hal层的delay函数
    msio_led_init();
    msio_key_init();
    // loop
    while (1)
    {
        if(msio_key_status())
        {
            printf("MSIO Key press!\n");
            LED1_TOG();
            printf("LED1 reversal\n");
        }
    }
}

         当我们将MSIO_0短接到地之后,LED1的状态就会翻转一次,串口也可以看到log如下:

            

0条评论

您的评论