本帖最后由 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)
|