91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

單片機(jī)“低耦合”的一些方法

jf_pJlTbmA9 ? 來源:魔羅技術(shù) ? 作者:魔羅技術(shù) ? 2023-10-17 18:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

一種無OS的MCU實(shí)用軟件框架,包括任務(wù)輪詢管理,命令管理器、低功耗管理、環(huán)形緩沖區(qū)等實(shí)用模塊。系統(tǒng)中廣泛利用自定義段技術(shù)減少各個(gè)模塊間的耦合關(guān)系,大大提供程序的可維護(hù)性。

主要功能

支持模塊自動(dòng)化管理,并提供不同優(yōu)先等級(jí)初始化聲明接口

支持任務(wù)輪詢管理,通過簡單的宏聲明即可實(shí)現(xiàn),不需要復(fù)雜的聲明調(diào)用。

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

支持命令行解析,命令注冊與執(zhí)行。

blink設(shè)備支持,統(tǒng)一管理LED、震動(dòng)馬達(dá)、蜂鳴器

使用說明

完整的代碼可以參考工程文件,系統(tǒng)開發(fā)平臺(tái)如下:

MCU:STM32F401RET6

IDE:IAR 7.4或者Keil MDK 4.72A

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

使用此模塊前需要系統(tǒng)提供滴答定時(shí)器,用于驅(qū)動(dòng)任務(wù)輪詢作業(yè)。(參考platform.c)

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

注冊初始化入口及任務(wù)(參考自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); //注冊按鍵任務(wù)(20ms輪詢1次)

命令管理器(cli)

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

命令格式

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

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

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

系統(tǒng)默認(rèn)命令

cli系統(tǒng)自帶了2條默認(rèn)命令,分別是"?"與"help"命令,輸入他們可以列出當(dāng)前系統(tǒng)包含的命令列表,如下所示:

?         - 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;                               /*命令管理器對(duì)象 */

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

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

    cli_enable( cli);

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

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

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

命令注冊

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

#include "cli.h"
//...
/* 
 * @brief       復(fù)位命令
 */ 
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)

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

如何適配

使用前需要通過pm_init進(jìn)行初始化適配,并提供當(dāng)前系統(tǒng)允許的最大休眠時(shí)間,進(jìn)入休眠的函數(shù)接口,基本的接口定義如下:

/*低功耗適配器 ---------------------------------------------------------*/
typedef struct {
    /**
     * @brief    系統(tǒng)最大休眠時(shí)長(ms)
     */  
    unsigned int max_sleep_time;
    /**
     * @brief     進(jìn)入休眠狀態(tài)
     * @param[in] time - 期待休眠時(shí)長(ms)
     * @retval    實(shí)際休眠時(shí)長
     * @note      休眠之后需要考慮兩件事情,1個(gè)是需要定時(shí)起來給喂看門狗,否則會(huì)在休眠
     *            期間發(fā)送重啟.另外一件事情是需要補(bǔ)償休眠時(shí)間給系統(tǒng)滴答時(shí)鐘,否則會(huì)
     *            造成時(shí)間不準(zhǔn)。
     */     
    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,默認(rèn)情況下是禁用低功耗功能的,讀者可以去除工程中原來不帶低功耗版本的platform.c,并加入platform-lowpower.c文件進(jìn)行編譯即可使用。

注冊低功耗設(shè)備

以按鍵掃描為例,正常情況下,如果按鍵沒有按下,那么系統(tǒng)休眠可以進(jìn)入休眠狀態(tài),對(duì)按鍵功能是沒有影響的。如果按鍵按下時(shí),那么系統(tǒng)需要定時(shí)喚醒并輪詢按鍵任務(wù)。

所以在一個(gè)低功耗系統(tǒng)下,為了不影響按鍵實(shí)時(shí)性需要處理好兩個(gè)事情:

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

2)如果按鍵按下時(shí),系統(tǒng)可以進(jìn)入休眠,但需要定時(shí)喚醒起來輪詢按鍵任務(wù)。

對(duì)于第一種情況,將按鍵配置為邊沿中斷喚醒即可,以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);            /*創(chuàng)建按鍵*/
}

對(duì)于第二種情況,可以通過pm_dev_register來處理,當(dāng)系統(tǒng)請(qǐng)求休眠時(shí),如果此時(shí)按鍵按下,則返回下次喚醒時(shí)間即可,如下面的例子所示。

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

blink模塊

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

使用步驟:

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

需要在任務(wù)中定時(shí)進(jìn)行輪詢

或者通過"module"模塊的任務(wù)注冊來實(shí)現(xiàn)

task_register("blink", blink_dev_process, 50);  //50ms輪詢1次

LED驅(qū)動(dòng)

blink_dev_t led;                             //定義led設(shè)備

/*
 *@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);   //創(chuàng)建led設(shè)備

    blink_dev_ctrl( led, 50, 100, 0);   //快閃(50ms亮, 100ms滅)
}

按鍵管理模塊

類似blink模塊,使用之前有兩個(gè)注意事項(xiàng):

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

需要在任務(wù)中定時(shí)進(jìn)行輪詢

key_t key;                             //定義按鍵管理器

/*
 *@brief     按鍵事件
 *@param[in] type     - 按鍵類型(KEY_PRESS, KEY_LONG_DOWN, KEY_LONG_UP)  
 *@param[in] duration - 長按持續(xù)時(shí)間
 */
void key_event(int type, unsigned int duration)
{
	if (type == KEY_PRESS) {                //短按

	} else if (type == KEY_LONG_DOWN) {     //長按

	}
} 

//讀取鍵值(假設(shè)按鍵輸出口為STM32 MCU PA8)
int read_key(void)
{
	return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == Bit_RESET;
}

/*
 *@brief     按鍵初始化
 */
void key_init(void)
{
    //打開GPIO 時(shí)鐘
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	//配置成輸入模式
    gpio_conf(GPIOA, GPIO_Mode_IN, GPIO_PuPd_NOPULL, GPIO_Pin_8); 
    //創(chuàng)建1個(gè)按鍵
    key_create( key, read_key, key_event);  
}

來源 | 魔羅技術(shù)
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6076

    文章

    45494

    瀏覽量

    670262
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    147

    文章

    18924

    瀏覽量

    398019
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9519

    瀏覽量

    157016
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單片機(jī)低功耗的處理

    什么單片機(jī),在程序上和電路上都是要一些處理才能把功耗控制在比較低的范圍。 程序的處理方法主要有以下幾點(diǎn): 1、單片機(jī)進(jìn)入睡眠狀態(tài)。這個(gè)是最基本的,只有睡眠的狀態(tài)下,功耗才是最低的。
    發(fā)表于 01-21 08:25

    學(xué)習(xí)單片機(jī)快速方法

    做出來。對(duì)于初學(xué)者來說我建議有流水燈、數(shù)碼管、獨(dú)立鍵盤、矩陣鍵盤、AD或DA、液晶、蜂鳴器,這就差不多了。 般買單片機(jī)學(xué)習(xí)板都配有視頻教學(xué)光盤(沒有的別買)和一些資料。比如應(yīng)用軟件什么的。建議在網(wǎng)
    發(fā)表于 01-14 07:42

    單片機(jī)抗干擾技術(shù)的常用方法

    單片機(jī)系統(tǒng)硬件抗干擾的常用方法: 影響單片機(jī)系統(tǒng)可靠安全運(yùn)行的主要因素主要來自系統(tǒng)內(nèi)部和外部的各種電氣干擾,并受系統(tǒng)結(jié)構(gòu)設(shè)計(jì)、元器件選擇、安裝、制造工藝影響。這些都構(gòu)成單片機(jī)系統(tǒng)的干
    發(fā)表于 01-14 06:17

    如何測試單片機(jī)MCU系統(tǒng)的可靠性

    用什么方法來測試單片機(jī)系統(tǒng)的可靠性,當(dāng)個(gè)單片機(jī)系統(tǒng)設(shè)計(jì)完成,對(duì)于不同的單片機(jī)系統(tǒng)產(chǎn)品會(huì)有不同的測試項(xiàng)目和
    發(fā)表于 01-08 07:50

    單片機(jī)系統(tǒng)設(shè)計(jì)方法

    器件對(duì)EPROM中的軟件進(jìn)行加密.以及采用多單片機(jī)結(jié)構(gòu)來解決加密的問題軟件加密的思想則是通過對(duì)程序和數(shù)據(jù)進(jìn)行處理.具體的有插入多條跳轉(zhuǎn)指令降低程序可讀性、在程序模塊之間插入一些加密字節(jié).并且采用模塊化
    發(fā)表于 01-06 06:23

    單片機(jī)的入門準(zhǔn)備

    計(jì)算機(jī)硬件知識(shí),如計(jì)算機(jī)的簡單組成原理,要知道CPU、總線等的一些基本概念; 3、學(xué)習(xí)C語言的編程知識(shí),了解結(jié)構(gòu)化語言的程序設(shè)計(jì)方法,懂一些常用的算法,比如冒泡排序、中值算法等; 以上是基礎(chǔ),有了這些
    發(fā)表于 12-22 07:39

    浮思特 | 電子溫度計(jì)單片機(jī)如何選型?ABOV單片機(jī)提供幾點(diǎn)很關(guān)鍵!

    時(shí)需要關(guān)注的幾個(gè)核心要點(diǎn),并以行業(yè)常用的ABOV(現(xiàn)代單片機(jī))方案為例,分享一些實(shí)際的設(shè)計(jì)思路。、測量精度與速度是首要考量溫度計(jì)的核心功能是測溫,其準(zhǔn)確性與響應(yīng)速度
    的頭像 發(fā)表于 12-15 09:43 ?460次閱讀
    浮思特 | 電子溫度計(jì)<b class='flag-5'>單片機(jī)</b>如何選型?ABOV<b class='flag-5'>單片機(jī)</b>提供幾點(diǎn)很關(guān)鍵!

    單片機(jī)硬件設(shè)計(jì)原則,抗干擾常用方法

    單片機(jī)硬件設(shè)計(jì)中應(yīng)注意的問題 1、在元器件的布局方面,應(yīng)該把相互有關(guān)的元件盡量放得靠近一些,例如,時(shí)鐘發(fā)生器、晶振、CPU的時(shí)鐘輸入端都易產(chǎn)生噪聲,在放置的時(shí)候應(yīng)把它們靠近些。 對(duì)于那些易
    發(fā)表于 12-09 06:30

    C語言和單片機(jī)C語言有什么差異

    單片機(jī)c語言相對(duì)于普通C語言增加了一些基本的指令,還有變量的賦值是16進(jìn)制,當(dāng)然單片機(jī)c語言只牽涉到普通c語言非?;A(chǔ)部分。 主要的差異具體體現(xiàn)在: 1、單片機(jī)中C的語法
    發(fā)表于 11-14 07:55

    32位單片機(jī)PY32F003的特性概述

    邏輯、數(shù)據(jù)采集和通信應(yīng)用來說是足夠的。定位非常明確,可以作為一些8位/32位單片機(jī)的直接替代和競爭產(chǎn)品。
    的頭像 發(fā)表于 11-07 16:02 ?1199次閱讀
    32位<b class='flag-5'>單片機(jī)</b>PY32F003的特性概述

    第1章 如何學(xué)習(xí)單片機(jī)

    ? 在錯(cuò)誤的道路上日夜兼程,最終也無法成功,方法和思路絕對(duì)是最重要的。本章節(jié)講到的學(xué)習(xí)單片機(jī)方法,都是作者學(xué)習(xí)單片機(jī)的無數(shù)經(jīng)驗(yàn)和教訓(xùn)總結(jié)出來的瑰寶。通過作者前面的披荊斬棘,開辟了道路
    的頭像 發(fā)表于 10-10 10:32 ?508次閱讀

    怎么測單片機(jī)系統(tǒng)頻率

    單片機(jī)系統(tǒng)頻率是指單片機(jī)工作時(shí)的時(shí)鐘頻率,它直接影響單片機(jī)的運(yùn)行速度和處理能力,準(zhǔn)確測量系統(tǒng)頻率對(duì)單片機(jī)應(yīng)用開發(fā)、程序調(diào)試和性能優(yōu)化具有重要意義。測量
    的頭像 發(fā)表于 07-25 11:39 ?783次閱讀

    低功耗單片機(jī)各型號(hào)的對(duì)比及選型參考

    不同品牌、不同系列的低功耗單片機(jī)在功耗控制、性能表現(xiàn)、外設(shè)配置等方面各有特點(diǎn),通過低功耗單片機(jī)各型號(hào)的對(duì)比,能幫助開發(fā)者更精準(zhǔn)地匹配應(yīng)用需求。本文將圍繞主流低功耗單片機(jī)型號(hào)展開對(duì)比,并介紹在
    的頭像 發(fā)表于 07-22 18:25 ?1443次閱讀

    瑞薩RA單片機(jī)在e2 studio環(huán)境下printf編譯出錯(cuò)的問題解析

    最近看到有一些網(wǎng)友在討論關(guān)于:瑞薩RA單片機(jī)在e2 studio環(huán)境下printf編譯出錯(cuò)的問題。
    的頭像 發(fā)表于 05-24 15:51 ?1578次閱讀
    瑞薩RA<b class='flag-5'>單片機(jī)</b>在e2 studio環(huán)境下printf編譯出錯(cuò)的問題解析

    51單片機(jī)筆記(建議收藏?。?/a>

    +外設(shè)”的結(jié)構(gòu),外設(shè)多,單片機(jī)就復(fù)雜,總線位數(shù)高,運(yùn)行就快一些。本質(zhì)上還逃不出這個(gè)架構(gòu)。對(duì)于設(shè)計(jì)人員編程來說,操作外設(shè)實(shí)際上就是讀寫各種特殊功能寄存器,傳輸數(shù)據(jù)就是讀寫總線,相應(yīng)外設(shè)就是處理中斷
    發(fā)表于 05-21 17:24