在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機“低耦合”的一些方法

jf_pJlTbmA9 ? 來源:魔羅技術 ? 作者:魔羅技術 ? 2023-10-17 18:30 ? 次閱讀

介紹

一種無OS的MCU實用軟件框架,包括任務輪詢管理,命令管理器、低功耗管理、環形緩沖區等實用模塊。系統中廣泛利用自定義段技術減少各個模塊間的耦合關系,大大提供程序的可維護性。

主要功能

支持模塊自動化管理,并提供不同優先等級初始化聲明接口

支持任務輪詢管理,通過簡單的宏聲明即可實現,不需要復雜的聲明調用。

支持低功耗管理,休眠與喚醒通知。

支持命令行解析,命令注冊與執行。

blink設備支持,統一管理LED、震動馬達、蜂鳴器

使用說明

完整的代碼可以參考工程文件,系統開發平臺如下:

MCU:STM32F401RET6

IDE:IAR 7.4或者Keil MDK 4.72A

任務初始化及任務輪詢管理(module)

使用此模塊前需要系統提供滴答定時器,用于驅動任務輪詢作業。(參考platform.c)

使用說明//定時器中斷(提供系統滴答)
void SysTick_Handler(void)
{
systick_increase(SYS_TICK_INTERVAL); //增加系統節拍
}

注冊初始化入口及任務(參考自key_task.c)

使用說明static void key_init(void)
{
/*do something*/
}

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

module_init("key", key_init); //注冊按鍵初始化接口
driver_register("key", key_scan, 20); //注冊按鍵任務(20ms輪詢1次)

命令管理器(cli)

適用于在線調試、參數配置等(參考使用cli_task.c),用戶可以通過串口輸出命令行控制設備行為、查詢設備狀態等功能。

命令格式

cli支持的命令行格式如下:

< param1> < param2> < paramn> < rn > ,< param1>, < param2>, < paramn>, < rn >

每行命令包含一個命令名稱+命令參數(可選),命令名稱及參數可以通過空格或者','進行分隔。

系統默認命令

cli系統自帶了2條默認命令,分別是"?"與"help"命令,輸入他們可以列出當前系統包含的命令列表,如下所示:

?         - alias for 'help'
help      - list all command.
pm        - Low power control command
reset     - reset system
sysinfo   - show system infomation.

適配命令管理器

完整的例子可以參考cli_task.c.

static cli_obj_t cli;                               /*命令管理器對象 */

/* 
 * @brief       命令行任務初始化
 * @return      none
 */ 
static void cli_task_init(void)
{
    cli_port_t p = {tty.write, tty.read};           /*讀寫接口 */

    cli_init( cli,  p);                             /*初始化命令行對象 */

    cli_enable( cli);

    cli_exec_cmd( cli,"sysinfo");                   /*顯示系統信息*/
}

/* 
 * @brief       命令行任務處理
 * @return      none
 */ 
static void cli_task_process(void)
{
    cli_process( cli);
}

module_init("cli", cli_task_init);                  
task_register("cli", cli_task_process, 10);          /*注冊命令行任務*/

命令注冊

以復位命令為例(參考cmd_devinfo.c):

#include "cli.h"
//...
/* 
 * @brief       復位命令
 */ 
int do_cmd_reset(struct cli_obj *o, int argc, char *argv[])
{
    NVIC_SystemReset();
    return 0;
}cmd_register("reset",do_cmd_reset, "reset system");

低功耗管理器(pm)

控制間歇運行,降低系統功耗。其基本的工作原理是通過輪詢系統中各個模塊是否可以允許系統進入低功耗。實際上這是一種判決機制,所有模塊都具有有票否決權,即只要有一個模塊不允許休眠,那么系統就不會進入休眠狀態。pm模塊在休眠前會統計出各個模塊會返回最小允許休眠時長,并以最小休眠時長為單位進行休眠。

如何適配

使用前需要通過pm_init進行初始化適配,并提供當前系統允許的最大休眠時間,進入休眠的函數接口,基本的接口定義如下:

/*低功耗適配器 ---------------------------------------------------------*/
typedef struct {
    /**
     * @brief    系統最大休眠時長(ms)
     */  
    unsigned int max_sleep_time;
    /**
     * @brief     進入休眠狀態
     * @param[in] time - 期待休眠時長(ms)
     * @retval    實際休眠時長
     * @note      休眠之后需要考慮兩件事情,1個是需要定時起來給喂看門狗,否則會在休眠
     *            期間發送重啟.另外一件事情是需要補償休眠時間給系統滴答時鐘,否則會
     *            造成時間不準。
     */     
    unsigned int (*goto_sleep)(unsigned int time);
}pm_adapter_t;
void pm_init(const pm_adapter_t *adt);

void pm_enable(void);

void pm_disable(void);

void pm_process(void);

完成的使用例子可以參考platform-lowpower.c,默認情況下是禁用低功耗功能的,讀者可以去除工程中原來不帶低功耗版本的platform.c,并加入platform-lowpower.c文件進行編譯即可使用。

注冊低功耗設備

以按鍵掃描為例,正常情況下,如果按鍵沒有按下,那么系統休眠可以進入休眠狀態,對按鍵功能是沒有影響的。如果按鍵按下時,那么系統需要定時喚醒并輪詢按鍵任務。

所以在一個低功耗系統下,為了不影響按鍵實時性需要處理好兩個事情:

1)系統休眠狀態下,如果有按鍵按下,那系統系統應立即喚醒,以便處理接下來的掃描工作。

2)如果按鍵按下時,系統可以進入休眠,但需要定時喚醒起來輪詢按鍵任務。

對于第一種情況,將按鍵配置為邊沿中斷喚醒即可,以STM32F4為例(參考key_task.c),它支持外部中斷喚醒功能。

/* 
 * @brief       按鍵 io初始化
 *              PC0 -> key;
 * @return      none
 */ 
static void key_io_init(void)
{
    /* Enable GPIOA clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    gpio_conf(GPIOC, GPIO_Mode_IN, GPIO_PuPd_UP, GPIO_Pin_0);

    //低功耗模式下,為了能夠檢測到按鍵,配置為中斷喚醒
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0);
    exti_conf(EXTI_Line0, EXTI_Trigger_Falling, ENABLE);
    nvic_conf(EXTI0_IRQn, 0x0F, 0x0F);

    key_create( key, readkey, key_event);            /*創建按鍵*/
}

對于第二種情況,可以通過pm_dev_register來處理,當系統請求休眠時,如果此時按鍵按下,則返回下次喚醒時間即可,如下面的例子所示。

//參考key_task.c
#include "pm.h"                                     
/*
 * @brief	   休眠通知
 */
static unsigned int  key_sleep_notify(void)
{
    return key_busy( key) || readkey() ? 20 : 0;    /* 非空閑時20ms要喚醒1次*/
} pm_dev_register("key", NULL, key_sleep_notify, NULL);

blink模塊

具有閃爍特性(led, motor, buzzer)的設備(led, motor, buzzer)管理

使用步驟:

需要系統提供滴答時鐘,blick.c中是通過get_tick()接口獲取,依賴module模塊

需要在任務中定時進行輪詢

或者通過"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);  
}

來源 | 魔羅技術
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6037

    文章

    44558

    瀏覽量

    635355
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17148

    瀏覽量

    351213
  • 接口
    +關注

    關注

    33

    文章

    8598

    瀏覽量

    151166
收藏 人收藏

    評論

    相關推薦

    單片機Debug工具性能對比 單片機調試常用命令

    。以下是對單片機調試工具性能的簡要對比以及一些常用的調試命令。 單片機Debug工具性能對比 Keil uVision 性能 :Keil uVision 是款功能強大的集成開發環境(
    的頭像 發表于 12-19 09:56 ?225次閱讀

    單片機編程語言有哪些選擇

    單片機(Microcontroller Unit,MCU)編程是指為單片機編寫程序的過程,這些程序控制單片機的行為和功能。單片機廣泛應用于嵌入式系統,如家用電器、汽車電子、工業控制等領
    的頭像 發表于 11-01 14:13 ?566次閱讀

    單片機調試常見問題與解決方法

    單片機調試是嵌入式系統開發中的個重要環節,它涉及到對單片機程序的測試和優化,以確保系統能夠正常工作。在調試過程中,開發者可能會遇到各種問題。 1. 程序無法燒錄到單片機 問題描述:
    的頭像 發表于 11-01 14:11 ?783次閱讀

    單片機與嵌入式系統的區別

    在現代電子技術領域,單片機和嵌入式系統是兩個經常被提及的術語。它們在許多應用中發揮著關鍵作用,如智能家居、工業自動化、汽車電子等。盡管這兩個概念經常被交替使用,但它們之間存在一些基本的區別。 單片機
    的頭像 發表于 11-01 14:09 ?585次閱讀

    想入行單片機開發的學生們的忠告

    對于想入行單片機開發的學生們,以下是一些建議和忠告:
    的頭像 發表于 10-17 09:45 ?356次閱讀
    想入行<b class='flag-5'>單片機</b>開發的學生們的忠告

    怎樣才知道單片機的性能到極限了?

    要確定單片機的性能是否達到極限,可以從多個方面進行綜合評估。以下是一些主要的判斷依據:
    的頭像 發表于 09-11 09:39 ?317次閱讀
    怎樣才知道<b class='flag-5'>一</b>個<b class='flag-5'>單片機</b>的性能到極限了?

    單片機燒錄程序時為什么直在檢測

    單片機燒錄程序時,如果軟件直在顯示“正在檢測單片機”,可能是由多種原因導致的。以下是一些常見的原因及其解決方法: 1. 連接問題 USB轉
    的頭像 發表于 09-02 09:57 ?4748次閱讀

    單片機為什么被認為是門簡單的技術?

    單片機(Microcontroller Unit, MCU)技術被廣泛認為“簡單”可能源于幾個方面的誤解或相對性考慮,但實際上,單片機技術的復雜性和應用廣度遠超過“簡單”詞所能涵蓋的范疇。以下是
    的頭像 發表于 08-21 09:15 ?317次閱讀
    <b class='flag-5'>單片機</b>為什么被認為是<b class='flag-5'>一</b>門簡單的技術?

    文讀懂什么單片機:組成結構與應用

    歡迎來到單片機的世界,這是種微小(但功能強大)的設備,改變了嵌入式系統的面貌。在本文中,您將了解單片機一些基本知識、單片機的結構以及微處
    的頭像 發表于 08-09 11:49 ?1701次閱讀
    <b class='flag-5'>一</b>文讀懂什么<b class='flag-5'>單片機</b>:組成結構與應用

    大學生學單片機不能錯過的比賽

    單片機比賽是電子和計算機領域的項重要賽事,旨在提升參賽者的專業技能、團隊協作能力和創新思維。以下是一些常見的單片機比賽
    的頭像 發表于 05-15 09:50 ?1841次閱讀
    大學生學<b class='flag-5'>單片機</b>不能錯過的比賽

    單片機學到什么程度可以找工作?

    找到工作,您需要達到定的學習程度和技能水平。我們今天就來說說究竟怎樣才能算是可以去找工作了。一些關于單片機學習程度和就業能力的建議了解單片機
    的頭像 發表于 03-28 08:04 ?1574次閱讀
    <b class='flag-5'>單片機</b>學到什么程度可以找工作?

    單片機開發好學嗎?學習中有哪些樂趣與挑戰?

    提到單片機學習大家都會覺得難學,事實真的是這樣嗎?今天就來探討一些單片機學習的那點事兒。對于許多初學者來說,剛開始接觸單片機編程可能會感到
    的頭像 發表于 03-28 08:04 ?1948次閱讀
    <b class='flag-5'>單片機</b>開發好學嗎?學習中有哪些樂趣與挑戰?

    單片機編程實例介紹

    是指使用特定的編程語言編寫控制單片機工作的程序。 在本文中,將為您提供一些常見的單片機編程實例,包括基礎應用、傳感器應用、通信應用等方面的案例。 、基礎應用 LED流水燈 流水燈是最
    的頭像 發表于 01-16 09:37 ?2629次閱讀

    PMS152單片機的編程和解密

    PMS152單片機種常見的微控制器(MCU),廣泛應用于各種電子產品中。如果您需要進行PMS152單片機的編程和解密,以及產品開發和PCB設計,以下是一些建議和步驟:
    的頭像 發表于 01-06 14:18 ?618次閱讀

    單片機最小系統電路和PCB設計案例

    本文以STM32F401RCT6為例,講解單片機最小系統的設計方法,以及一些相關的原理。
    的頭像 發表于 01-02 10:36 ?3541次閱讀
    <b class='flag-5'>單片機</b>最小系統電路和PCB設計案例
    主站蜘蛛池模板: 欧美成人亚洲| 无遮挡很爽很污很黄在线网站| 亚洲一卡二卡在线| 美女又爽又黄视频| 亚洲精品私拍国产福利在线 | 狠狠干天天操| 成人毛片一区二区三区| 欧美污网站| 天天做天天爱天天综合网| 国产成人啪午夜精品网站男同| 素股中文字幕| 中国一级特黄视频| 欧美黑人巨大xxxx猛交| 四虎精品影院在线观看视频| 97成人在线视频| 国产免费啪啪| 日本黄色免费电影| 天天精品| 国产精品午夜自在在线精品| 久久香蕉综合色一综合色88| 欧美天天色| 亚洲淫视频| 99综合久久| 亚洲天堂免费看| 免费国产在线视频| 国产真实乱在线更新| 亚洲成人在线播放| www.九色.com| 亚洲4区| 久久亚洲免费视频| 高清影院在线欧美人色| 四虎免费永久观看| 视频在线观看高清免费大全| 在线 你懂| a网在线| 日本不卡视频一区二区三区| 激情六月网| 国产黄色大片网站| 久久精品国产亚洲5555| a级男女性高爱潮高清试| 日本三级带日本三级带黄首页|