[N32G45x]

【N32G457】开箱+按键流水灯

[复制链接]
591|7
手机看帖
扫描二维码
随时随地手机跟帖
aple0807|  楼主 | 2022-1-10 16:42 | 显示全部楼层 |阅读模式
本帖最后由 aple0807 于 2022-1-10 16:40 编辑

感谢论坛提供试用机会学习国民技术MCU。
收到评估板首先添加rt-thread操作系统,不习惯官方的配置工具,直接创建KEIL工程,手动添加OS源码。

///////////////////////////////////////////////////////////////////////////////
添加OS后首先测试最基本的GPIO控制,主要测试如下:

构建管脚对象结构:

/*******************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url]   输出
*******************************************************************************/
typedef struct
{
        void (*en)(void);
        void (*dis)(void);
        void (*out)(uint8_t st);
        void (*tog)(void);
        uint8_t (*out_st)(void);
        void (*dir_out_pp)(void); //推挽输出
        void (*dir_out_od)(void); //开漏输出
} port_out_pin_type;

/*******************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url]   同相OUT定义
*******************************************************************************/
#ifndef PORT_PIN_CTEAT
#define port_out_pin_make(name, port, pin) \
        extern const port_out_pin_type name
#else
#define port_out_pin_make(name, port, pin)                              \
        void name##_pin_en(void) { gpio_out_high(port, pin); }              \
        void name##_pin_dis(void) { gpio_out_low(port, pin); }              \
        void name##_pin_out(uint8_t st) { gpio_out_set(port, pin, st); }    \
        void name##_pin_tog(void) { gpio_out_tog(port, pin); }              \
        uint8_t name##_pin_out_st(void) { return gpio_out_get(port, pin); } \
        void name##_dir_out_pp(void) { gpio_dir_out_pp(port, pin); }        \
        void name##_dir_out_od(void) { gpio_dir_out_od(port, pin); }        \
        const port_out_pin_type name = {                                    \
                name##_pin_en,                                                  \
                name##_pin_dis,                                                 \
                name##_pin_out,                                                 \
                name##_pin_tog,                                                 \
                name##_pin_out_st,                                              \
                name##_dir_out_pp,                                              \
                name##_dir_out_od}
#endif


/*******************************************************************************
* @brief   输入
*******************************************************************************/
typedef struct
{
        uint8_t (*in_st)(void);
        void (*dir_in_ft)(void); //浮空输入
        void (*dir_in_up)(void); //上拉输入
        void (*dir_in_dn)(void); //下拉输入
} port_in_pin_type;

/*******************************************************************************
* @brief   反相IN定义
*******************************************************************************/
#ifndef PORT_PIN_CTEAT
#define port_nin_pin_make(name, port, pin) \
        extern const port_in_pin_type name
#else
#define port_nin_pin_make(name, port, pin)                             \
        uint8_t name##_pin_in_st(void) { return !gpio_in_get(port, pin); } \
        void name##_dir_in_ft(void) { gpio_dir_in_ft(port, pin); }         \
        void name##_dir_in_up(void) { gpio_dir_in_up(port, pin); }         \
        void name##_dir_in_dn(void) { gpio_dir_in_dn(port, pin); }         \
        const port_in_pin_type name = {                                    \
                name##_pin_in_st,                                              \
                name##_dir_in_ft,                                              \
                name##_dir_in_up,                                              \
                name##_dir_in_dn,                                              \
        }
#endif

IO对象创建
port_out_pin_make(o_led1, PB, 5);
port_out_pin_make(o_led2, PB, 4);
port_out_pin_make(o_led3, PA, 8);
#define led_r o_led3
#define led_g o_led1
#define led_b o_led2

// KEY
port_nin_pin_make(key1, PA, 4);
port_nin_pin_make(key2, PA, 5);
port_nin_pin_make(key3, PA, 6);
初始化
 key1.dir_in_up();
        key2.dir_in_up();
        key3.dir_in_up();
        
        led_r.dir_out_pp();
        led_g.dir_out_pp();
        led_b.dir_out_pp();
流水灯控制,每200ms循环左移,位数为5实现关闭两个周期。
void sys_led_ctr(void)
{
        static word_tt st = {1};

        if(sys_st.pulse.bPulse_20ms)
        {
                o_led1.out(0);
                o_led2.out(0);
                o_led3.out(0);        
        }
        
        // 位移
        if (sys_st.pulse.bPulse_200ms)
        {
                st.uval = bit16_roll_shift_left(st.uval, 5, 1);
                // 输出
                o_led1.out(st.bits.b0);
                o_led2.out(st.bits.b1);
                o_led3.out(st.bits.b2);               
        }
}
按键取值
void sys_tick_exe(void)
{
        static uint8_t ticks = 0;
        ticks ++;
        
        if((ticks & 0x03) == 0)
        {
                uint16_t key_rd = 0;
               
                if(key1.in_st())
                        key_rd |= 1;
                if(key2.in_st())
                        key_rd |= 2;
                if(key3.in_st())
                        key_rd |= 4;
               
                key_st_sample(&sys_st.key, 4, key_rd);
        }
}
按键测试,按下对应按键打印按键信息
void sys_key_ctr(void)
{
        key_st_handle(&sys_st.key, sys_st.pulse.bPulse_100ms);
        
        if(sys_st.key.found_edge & 1)
        {
                dbg_puts("key 1 press down ! \n");
        }
        
        if(sys_st.key.found_edge & 2)
        {
                dbg_puts("key 2 press down ! \n");
        }
        
        if(sys_st.key.found_edge & 4)
        {
                dbg_puts("key 3 press down ! \n");
        }
        
        if(sys_st.key.lost_edge & 1)
        {
                dbg_puts("key 1 release ! \n");
        }
        
        if(sys_st.key.lost_edge & 2)
        {
                dbg_puts("key 2 release ! \n");
        }
        
        if(sys_st.key.lost_edge & 4)
        {
                dbg_puts("key 3 release ! \n");
        }
}
附上KEIL测试工程,MDK5.35
software_led.rar (3.02 MB)

使用特权

评论回复
chenjun89| | 2022-1-10 21:04 | 显示全部楼层
国民技术这么快就送开发版测评了吗?

使用特权

评论回复
daichaodai| | 2022-1-11 08:08 | 显示全部楼层
不错,谢谢分享。

使用特权

评论回复
单片小菜| | 2022-1-11 10:15 | 显示全部楼层
这个代码,写的漂亮,不错的。

使用特权

评论回复
aple0807|  楼主 | 2022-1-11 10:28 | 显示全部楼层
chenjun89 发表于 2022-1-10 21:04
国民技术这么快就送开发版测评了吗?

板块头的RTT设计大赛可以领板

使用特权

评论回复
kyzhd| | 2022-1-13 17:14 | 显示全部楼层
代码风格不错, 整齐划一。

使用特权

评论回复
232321122| | 2022-1-15 19:12 | 显示全部楼层
这个是最近新申请的板子吗?        

使用特权

评论回复
asmine| | 2022-1-17 14:51 | 显示全部楼层
出手好快啊,真不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

309

帖子

2

粉丝