一、新建工程
根据所用开发板,根据对应芯片创建工程(本例程基于STM32F103ZET6)。
二、PIN外设配置
步骤1:将时钟源换成外部高速时钟。
在board.h 修改时钟为外部时钟
步骤2:PIN应用层文件新建
新建pin_user.c以及pin_user.h文件,将应用层代码放进。
1,在工程文件夹里面进行文件新建。
2,在工作区刷新工程,将这两个文件夹加入到工程里面。
步骤3:查看原理图,配置pin脚模式以及宏定义
1,所用引脚IO口(灯用的是PE5,且输出低电平,LED亮,输出高电平,LED灭,按键用的PE2与PE3,且低电平有效。)
2,配置pin脚模式,与宏定义(引脚编号,通过查看设备驱动文件drv_gpio.c确定)
三、编写PIN驱动用户层代码与测试
1.具体测试代码如下:
/*
* 程序清单:这是一个 PIN 设备使用例程
* 例程导出了 pin_beep_sample 命令到控制终端
* 命令调用格式:pin_beep_sample
* 程序功能:通过按键控控制LED灯
*/
#include <rtthread.h>
#include <rtdevice.h>
/* 引脚编号,通过查看设备驱动文件drv_gpio.c确定 */
#ifndef LED_PIN_NUM
#define LED_PIN_NUM 69 /* PE5 */
#endif
#ifndef KEY0_PIN_NUM
#define KEY0_PIN_NUM 66 /* PE2 */
#endif
#ifndef KEY1_PIN_NUM
#define KEY1_PIN_NUM 67 /* PE3 */
#endif
void led_on(void *args)
{
rt_kprintf("turn on led!\n");
rt_pin_write(LED_PIN_NUM, PIN_LOW);
}
void led_off(void *args)
{
rt_kprintf("turn off led!\n");
rt_pin_write(LED_PIN_NUM, PIN_HIGH);
}
static void pin_led_sample(void)
{
/* led引脚为输出模式 */
rt_pin_mode(LED_PIN_NUM, PIN_MODE_OUTPUT);
/* 默认低电平 */
rt_pin_write(LED_PIN_NUM, PIN_HIGH);
/* 按键0引脚为输入模式 */
rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);
/* 绑定中断,下降沿模式,回调函数名为beep_on */
rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, led_on, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);
/* 按键1引脚为输入模式 */
rt_pin_mode(KEY1_PIN_NUM, PIN_MODE_INPUT_PULLUP);
/* 绑定中断,下降沿模式,回调函数名为beep_off */
rt_pin_attach_irq(KEY1_PIN_NUM, PIN_IRQ_MODE_FALLING, led_off, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY1_PIN_NUM, PIN_IRQ_ENABLE);
}
INIT_APP_EXPORT(pin_led_sample);
2.具体测试结果如下:
通过串口1将led灯的状态变化打印发送至串口助手。