ChibiOS使用hal库之PAL

ChibiOS的HAL库:理解与使用PAL
本文介绍了ChibiOS中的PAL(I/O Ports Abstraction Layer),它是GPIO的硬件抽象层,允许跨平台的IO操作。内容包括如何开启PAL配置、IO配置(静态与动态)以及各种PAL操作,如推挽输出、上拉输入和复用设置的实例说明。
AI助手已提取文章相关产品:

PAL全称是I/O Ports Abstraction Layer,即“IO硬件抽象层”。ChibiOS通过对GPIO进行抽象,使得不同的平台不同的MCU能够用同样风格的代码进行IO的操作,本节我们来简单介绍一下PAL的使用

一、开启PAL配置

一般来说,大部分的ChibiOS工程都会用到GPIO,所以自然会将PAL的配置开启。我们打开halconf.h文件,确认一下HAL_USE_PAL这个宏是否为TRUE,如果不是的话,需要修改为TRUE来支持PAL操作。

二、IO配置

IO的配置有两种,一种是静态的,也就是在板级定义的时候进行定义,我们可以参考I2C那个章节的介绍,来进行“静态”的GPIO配置;另外一种是动态的,通过我们app里面的代码进行动态的配置或者修改,这里我们引出一个函数:

#define palSetPadMode(port, pad, mode)         palSetGroupMode(port, PAL_PORT_BIT(pad), 0U, mode)

可以看到,这事实上是一个宏函数,通过定义port(端口)、pad(端口子序号)、mode(端口模式)来配置端口。这里以STM32F4为例,port可以是GPIOA、GPIOB、GPIOC……这些定义,pad可以是0-15,mode相对多一些,有如下的宏:
PAL_MODE_RESET                            //未配置
PAL_MODE_UNCONNECTED            //未连接
PAL_MODE_INPUT                             //输入
PAL_MODE_INPUT_PULLUP             //上拉输入
PAL_MODE_INPUT_PULLDOWN       //下拉输入
PAL_MODE_INPUT_ANALOG            //模拟输入
PAL_MODE_OUTPUT_PUSHPULL    //推挽输出
PAL_MODE_OUTPUT_OPENDRAIN  //开漏输出

另外还有一个特殊的:
PAL_MODE_ALTERNATE(n)      (PAL_STM32_MODE_ALTERNATE | PAL_STM32_ALTERNATE(n))
用来配置AF外设复用的,具体n配置为多少就要看芯片手册里面对应的IO的AF序号了。

三、PAL操作

1、推挽输出

推挽输出能够输出大的电流,可以实现亮灯、驱动外部芯片等功能,下面我们以连接在板子上PA9上的LED为例子,通过配置该IO为输出并设置输出电平为高电平来点亮这个LED,需要用到的有palSetPad和palClearPad:

palSetPadMode(GPIOA,  9, PAL_MODE_OUTPUT_PUSHPULL);
palSetPad(GPIOA, 9);     //拉高点亮
palClearPad(GPIOA, 9);  //拉低熄灭

2、上拉输入

上拉输入常常用于检测外部按键,这里我们以链接了外部按键的PC13为例,通过配置该IO为上拉输入并读取该IO口来检测按键,需要用到的函数是palReadPad这个宏函数:

palSetPadMode(GPIOC, 13, PAL_MODE_INPUT_PULLUP);
if(palReadPad(GPIOC, 13) == PAL_LOW)
{
    printf("push button!\r\n");
    while(padReadPad(GPIOC, 13) == PAL_LOW);   //等待按键释放
}

这里的按键检测按下后等待按键释放,这样实现仅仅为了演示,实际使用时建议使用状态机,这里不展开讲了。

3、复用设置

对于使用硬件的I2C、SPI等设备,需要进行AF配置的,那么就需要配置为复用模式,这里以串口为例,比如PA0和PA1作为UART4的TX和RX复用,那么可以配置如下:

palSetPadMode(GPIOA, 0, PAL_MODE_ALTERNATE(8));
palSetPadMode(GPIOA, 1, PAL_MODE_ALTERNATE(8));

以上就是是基本的IO操作的介绍。

另外熟悉32的同学应该知道STM32的外设是需要先使能时钟才是使用的,GPIO也不例外,这里是这样的,这部分的代码已经在hal层初始化的时候被配置了,所以我们可以不再需要关心这些动作。

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值