[N32G45x] 【N32G457】开箱+按键流水灯

[复制链接]
1118|7
 楼主| aple0807 发表于 2022-1-10 16:42 | 显示全部楼层 |阅读模式
本帖最后由 aple0807 于 2022-1-10 16:40 编辑

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

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

构建管脚对象结构:

  1. /*******************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]   输出
  3. *******************************************************************************/
  4. typedef struct
  5. {
  6.         void (*en)(void);
  7.         void (*dis)(void);
  8.         void (*out)(uint8_t st);
  9.         void (*tog)(void);
  10.         uint8_t (*out_st)(void);
  11.         void (*dir_out_pp)(void); //推挽输出
  12.         void (*dir_out_od)(void); //开漏输出
  13. } port_out_pin_type;

  14. /*******************************************************************************
  15. * [url=home.php?mod=space&uid=247401]@brief[/url]   同相OUT定义
  16. *******************************************************************************/
  17. #ifndef PORT_PIN_CTEAT
  18. #define port_out_pin_make(name, port, pin) \
  19.         extern const port_out_pin_type name
  20. #else
  21. #define port_out_pin_make(name, port, pin)                              \
  22.         void name##_pin_en(void) { gpio_out_high(port, pin); }              \
  23.         void name##_pin_dis(void) { gpio_out_low(port, pin); }              \
  24.         void name##_pin_out(uint8_t st) { gpio_out_set(port, pin, st); }    \
  25.         void name##_pin_tog(void) { gpio_out_tog(port, pin); }              \
  26.         uint8_t name##_pin_out_st(void) { return gpio_out_get(port, pin); } \
  27.         void name##_dir_out_pp(void) { gpio_dir_out_pp(port, pin); }        \
  28.         void name##_dir_out_od(void) { gpio_dir_out_od(port, pin); }        \
  29.         const port_out_pin_type name = {                                    \
  30.                 name##_pin_en,                                                  \
  31.                 name##_pin_dis,                                                 \
  32.                 name##_pin_out,                                                 \
  33.                 name##_pin_tog,                                                 \
  34.                 name##_pin_out_st,                                              \
  35.                 name##_dir_out_pp,                                              \
  36.                 name##_dir_out_od}
  37. #endif


  38. /*******************************************************************************
  39. * @brief   输入
  40. *******************************************************************************/
  41. typedef struct
  42. {
  43.         uint8_t (*in_st)(void);
  44.         void (*dir_in_ft)(void); //浮空输入
  45.         void (*dir_in_up)(void); //上拉输入
  46.         void (*dir_in_dn)(void); //下拉输入
  47. } port_in_pin_type;

  48. /*******************************************************************************
  49. * @brief   反相IN定义
  50. *******************************************************************************/
  51. #ifndef PORT_PIN_CTEAT
  52. #define port_nin_pin_make(name, port, pin) \
  53.         extern const port_in_pin_type name
  54. #else
  55. #define port_nin_pin_make(name, port, pin)                             \
  56.         uint8_t name##_pin_in_st(void) { return !gpio_in_get(port, pin); } \
  57.         void name##_dir_in_ft(void) { gpio_dir_in_ft(port, pin); }         \
  58.         void name##_dir_in_up(void) { gpio_dir_in_up(port, pin); }         \
  59.         void name##_dir_in_dn(void) { gpio_dir_in_dn(port, pin); }         \
  60.         const port_in_pin_type name = {                                    \
  61.                 name##_pin_in_st,                                              \
  62.                 name##_dir_in_ft,                                              \
  63.                 name##_dir_in_up,                                              \
  64.                 name##_dir_in_dn,                                              \
  65.         }
  66. #endif

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

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

  4.         if(sys_st.pulse.bPulse_20ms)
  5.         {
  6.                 o_led1.out(0);
  7.                 o_led2.out(0);
  8.                 o_led3.out(0);        
  9.         }
  10.         
  11.         // 位移
  12.         if (sys_st.pulse.bPulse_200ms)
  13.         {
  14.                 st.uval = bit16_roll_shift_left(st.uval, 5, 1);
  15.                 // 输出
  16.                 o_led1.out(st.bits.b0);
  17.                 o_led2.out(st.bits.b1);
  18.                 o_led3.out(st.bits.b2);               
  19.         }
  20. }
按键取值
  1. void sys_tick_exe(void)
  2. {
  3.         static uint8_t ticks = 0;
  4.         ticks ++;
  5.         
  6.         if((ticks & 0x03) == 0)
  7.         {
  8.                 uint16_t key_rd = 0;
  9.                
  10.                 if(key1.in_st())
  11.                         key_rd |= 1;
  12.                 if(key2.in_st())
  13.                         key_rd |= 2;
  14.                 if(key3.in_st())
  15.                         key_rd |= 4;
  16.                
  17.                 key_st_sample(&sys_st.key, 4, key_rd);
  18.         }
  19. }
按键测试,按下对应按键打印按键信息
  1. void sys_key_ctr(void)
  2. {
  3.         key_st_handle(&sys_st.key, sys_st.pulse.bPulse_100ms);
  4.         
  5.         if(sys_st.key.found_edge & 1)
  6.         {
  7.                 dbg_puts("key 1 press down ! \n");
  8.         }
  9.         
  10.         if(sys_st.key.found_edge & 2)
  11.         {
  12.                 dbg_puts("key 2 press down ! \n");
  13.         }
  14.         
  15.         if(sys_st.key.found_edge & 4)
  16.         {
  17.                 dbg_puts("key 3 press down ! \n");
  18.         }
  19.         
  20.         if(sys_st.key.lost_edge & 1)
  21.         {
  22.                 dbg_puts("key 1 release ! \n");
  23.         }
  24.         
  25.         if(sys_st.key.lost_edge & 2)
  26.         {
  27.                 dbg_puts("key 2 release ! \n");
  28.         }
  29.         
  30.         if(sys_st.key.lost_edge & 4)
  31.         {
  32.                 dbg_puts("key 3 release ! \n");
  33.         }
  34. }
附上KEIL测试工程,MDK5.35
software_led.rar (3.02 MB, 下载次数: 12)

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 | 显示全部楼层
出手好快啊,真不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部