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如下:
您的评论