2020-07-11 10:21:13 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:18:03 +08:00
2020-07-11 10:21:13 +08:00
2020-07-11 10:19:06 +08:00

CodeBrick

介绍

一种无OS的单片机通用解决方案包括任务轮询框架命令管理器、低功耗管理、环形缓冲区等实用模块。

module模块

时间轮询框架,使用例子:

1.使用此模块前需要系统提供滴答定时器,用于驱动任务轮询作业

//定时器中断(提供系统滴答)
void timer_interrupt(void)
{
    systick_increase();        //增加系统节拍
}

2.任务初始化及注册(以按键扫描为例)

static void key_init(void)
{
    /*do something*/
}

static void key_scan(void)
{
    /*do something*/
}

module_init("key", key_init);            //注册按键初始化接口
task_register("key", key_scan, 20);      //注册按键任务(20ms轮询1次)

comdef模块

包含常用宏定义,段定义、匿名类型等。

blink模块

具有闪烁特性(led, motor, buzzer)的设备(led, motor, buzzer)管理 使用之前有两个注意事项:

  • 需要系统提供滴答时钟blick.c中是通过get_tick()接口获取依赖module模块
  • 需要在任务中定时进行轮询
//主程序入口
void main(void)
{
    while (1)  {
        blink_dev_process();            //定时轮询
    }
    
}

或者通过"module"模块的任务注册来实现

task_register("blink", blink_dev_process, 50);  //50ms轮询1次

使用例子,以LED为例

blink_dev_t led;                             //定义led设备

/*
 *@brief     红色LED控制(GPIOA.8)
 *@param[in] on - 亮灭控制
 */
static void led_ctrl(int on)
{
    if (on)
        GPIOA->ODR |= (1 << 8);
    else 
        GPIOA->ODR &= ~(1 << 8);
}

/*
 *@brief     led初始化程序
 */
void led_init(void)
{
    led_io_init(void);                  //led io初始化
    blink_dev_create(&led, led_ctrl);   //创建led设备
    
    blink_dev_ctrl(&led, 50, 100, 0);   //快闪(50ms亮, 100ms灭)
}

按键管理模块

类似blink模块使用之前有两个注意事项:

  • 需要系统提供滴答时钟key.c中是通过get_tick()接口获取依赖module模块
  • 需要在任务中定时进行轮询
key_t key;                             //定义按键管理器

/*
 *@brief     按键事件
 *@param[in] type     - 按键类型(KEY_PRESS, KEY_LONG_DOWN, KEY_LONG_UP)  
 *@param[in] duration - 长按持续时间
 */
void key_event(int type, unsigned int duration)
{
	if (type == KEY_PRESS) {                //短按
		 
	} else if (type == KEY_LONG_DOWN) {     //长按
		
	}
} 

//读取键值(假设按键输出口为STM32 MCU PA8)
int read_key(void)
{
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == Bit_RESET;
}

/*
 *@brief     按键初始化
 */
void key_init(void)
{
    //打开GPIO 时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//配置成输入模式
    gpio_conf(GPIOA, GPIO_Mode_IN, GPIO_PuPd_NOPULL, GPIO_Pin_8); 
    //创建1个按键
    key_create(&key, read_key, key_event);  
}

Description
No description provided
Readme Apache-2.0 515 KiB
Languages
C 97.3%
Assembly 2.7%