aple0807 发表于 2022-1-10 16:42

【N32G457】开箱+按键流水灯

本帖最后由 aple0807 于 2022-1-10 16:40 编辑

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

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

构建管脚对象结构:

/*******************************************************************************
* @brief   输出
*******************************************************************************/
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;

/*******************************************************************************
* @brief   同相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


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

出手好快啊,真不错
页: [1]
查看完整版本: 【N32G457】开箱+按键流水灯