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层初始化的时候被配置了,所以我们可以不再需要关心这些动作。
ChibiOS的HAL库:理解与使用PAL

本文介绍了ChibiOS中的PAL(I/O Ports Abstraction Layer),它是GPIO的硬件抽象层,允许跨平台的IO操作。内容包括如何开启PAL配置、IO配置(静态与动态)以及各种PAL操作,如推挽输出、上拉输入和复用设置的实例说明。
3969

被折叠的 条评论
为什么被折叠?



