W800和W801小小白级入门记录03

本文讲述了作者作为非专业开发者的单片机学习历程,重点描述了如何在STM32单片机上使用TLS SDK进行按键采集和中断处理,以及遇到的问题和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

折腾了这么久,感觉对我来说真的是一步一个坑,可能和我也不是专业做单片机开发有关,以前接触单片机真的很少,只用过keil5开发STC15的程序,说实话真相把它扔零件箱里吃灰了。之前灯能亮起来了,这次来做个按键采集吧。记录紧接上文,来了。

7、采集个按键
板载2个按键,BOOTMODE和REST,BOOTMODE竟然就是PA0,此处浪费3小时。翻了好多文档,都没有说明BOOTMODE按键就是PA0,我也真是服了。差点我就以为BOOTMODE不能当IO来用,但是文档上又写的IO,就是不写IO几,也许厂家的工程师认为我这种小白不太适合做单片机的开发啊,哈哈。

代码很简单,tls_gpio_read就行了,也是SDK里面找。

u8 k;

......

k=tls_gpio_read(WM_IO_PA_00);
printf("\n input=%d \n",k);
delay(500000);

说实话,这个SDK真的帮开发者做了很多工作,各种IO的定义都一个函数实现,也不用看寄存器手册了,就是封装的命名规则还得适应一段时间,另外,这种封装的SDK就算完全掌握了也就是针对这一类的单片机,换个其它厂商的单片机,还得重新学习了。

做完按键采集,又仔细对比了W800和W801,毕竟800只有801的1/4大小,IO也少,但是价格却一样,咨询了厂家就是10k的量,这两个价格也是一样的,我也是服了。

既然能按键了,那么就来个中断吧,也不能在循环里一直判断按键啊,而且这样子反应和延迟都又问题,只是能识别能按了而已。

那就来中断了,还是那句话,得看SDK,和STC的开发完全不一样啦,又是几个小时的文档阅读,得出以下几行关键点,直接把代码和关键点全上了,写的麻烦,累了,要睡觉。


8、按键产生个中断
关键点
static void demo_gpio_isr_callback(void *context)//中断调用函数
{
    u16 ret;
    ret = tls_get_gpio_irq_status(WM_IO_PA_00);//取得状态,为什么返回是1才能执行呢?    
    if (ret){
xxxxxxxxxxxx干点啥?xxxxxxxxxxx
        tls_clr_gpio_irq_status(WM_IO_PA_00);        //清除中断
    }
}

void UserMain(void)
{
     tls_gpio_cfg(WM_IO_PA_00, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);//配置管脚
    tls_gpio_isr_register(WM_IO_PA_00, demo_gpio_isr_callback, NULL);//注册中断
    tls_gpio_irq_enable(WM_IO_PA_00, WM_GPIO_IRQ_TRIG_RISING_EDGE);//启用的意思吗?
}

全部代码:

#include "wm_include.h"
int t;

static void demo_gpio_isr_callback(void *context)//中断调用函数
{
    u16 ret;

    ret = tls_get_gpio_irq_status(WM_IO_PA_00);//取得状态,为什么返回是1才能执行呢?    
    if (ret){
        t=t*0.8;
        if (t<5000){t=3000000;};
        printf("\n It's a break %d delay time change to=%d \n",ret,t);
        tls_clr_gpio_irq_status(WM_IO_PA_00);        //清除中断
    }
}

void UserMain(void)
{
//#if DEMO_CONSOLE
//    CreateDemoTask();
//#endif
//用户自己的task

    printf("\n user task \n");    
    
    u8 i,pp,k;    
    i=0,t=3000000;pp=0x01;
    
    //初始IO
    tls_gpio_cfg(WM_IO_PB_00,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
    tls_gpio_cfg(WM_IO_PB_01,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
    tls_gpio_cfg(WM_IO_PB_02,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);

    tls_gpio_cfg(WM_IO_PA_00, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);//配置管脚
    tls_gpio_isr_register(WM_IO_PA_00, demo_gpio_isr_callback, NULL);//注册中断
    tls_gpio_irq_enable(WM_IO_PA_00, WM_GPIO_IRQ_TRIG_RISING_EDGE);//启用的意思吗?
    
    while (1)
    {
        i++;
        printf("\n TEST%d \n",i);//可以输出到控制台烧录工具就能看到,很好很开心
        
        if (pp>0x04){pp=0x01;}
        tls_gpio_write(WM_IO_PB_00,pp&0x01^pp);//写入IO
        tls_gpio_write(WM_IO_PB_01,pp&0x02^pp);
        tls_gpio_write(WM_IO_PB_02,pp&0x04^pp);
        
        printf("\n delay time=%d \n",t);
        if (i>32760){i=0;};
        pp=pp<<1;
        delay(t);             //这个秒怎么算的?还没搞明白
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值