色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

任意單片機(jī)基于simulink模型開發(fā)方式

CHANBAEK ? 來源: 想啥做啥 ? 作者: 想啥做啥 ? 2023-11-30 15:27 ? 次閱讀

導(dǎo)言-一個基于模型的例子

使用Arduinosimulink中搭建的LED閃爍的一個例子如圖1所示,相比之前C語言代碼實(shí)現(xiàn)的方式,這里沒有寫一行代碼就實(shí)現(xiàn)了LED閃爍。讀者有沒有感覺這種開發(fā)方式即簡單又方便,要實(shí)現(xiàn)什么功能就直奔主題,不用一行一行的敲代碼、排查代碼錯誤。圖1只是arduino其中的I/O輸出外設(shè),在圖2中還有其它很多外設(shè)可以使用,再結(jié)合matlab強(qiáng)大的功能,讀者可以實(shí)現(xiàn)很多實(shí)際應(yīng)用。

圖片

圖1 Arduino-simulink的LED閃爍模型

圖片

圖2 simulink中arduino其它外設(shè)的模型

任意單片機(jī)基于模型開發(fā)方式

并不是每一個芯片廠商都有足夠的人力和資金投入到主流開發(fā)軟件的生態(tài)適配,目前除了市面上用的比較火的幾款單片機(jī)(STM32、TMS320F28xx、S32K等)和Arduino平臺可以直接使用Matlab的硬件支持包直接開發(fā)外,其它單片機(jī)沒辦法直接使用,這里給大家介紹一種萬能的方式,可以在任意單片機(jī)上使用基于Simulink模型開發(fā)方式。

1、8051單片機(jī)上運(yùn)行Simulink模型代碼

第1步:搭建Simulink模型

如圖3 所示,,這里使用了三個庫,分別是“Delay(延時模型)”、“Logical Operator-NOT(邏輯操作-非模型)”和“out(輸出端口模型)”,這里的輸出端口為了方便代碼移植將名字改為LED。

圖片

圖3 LED閃爍simulink模型

第2步:設(shè)置模型生成參數(shù)并生成代碼

如圖4所示,點(diǎn)擊按鈕“Model Configuration Parameters”對simulink進(jìn)行設(shè)置。

圖片

圖4 simulink設(shè)置按鈕

如圖5所示,在彈出的“Configuration Parameters:xxxx”窗口中找到“Solver”欄,并點(diǎn)擊設(shè)置運(yùn)行參數(shù),按照圖中的設(shè)置,完成后點(diǎn)擊“Apply”。

圖片

圖5 “Solver”欄參數(shù)設(shè)置

如圖6所示,在“Hardware Implementtation”欄中設(shè)置硬件參數(shù),按照圖中的設(shè)置進(jìn)行操作,完成后點(diǎn)擊“Apply”。

圖片

圖6 “Hardware Implementtation”欄參數(shù)設(shè)置

如圖7所示,點(diǎn)擊“Code Generation”欄,設(shè)置代碼生成參數(shù),完成后點(diǎn)擊“Apply”。

圖片

圖7 “Code Generation”參數(shù)設(shè)置

如圖8所示,點(diǎn)開“Code Generation”左邊的“>”符號,在子欄目中找到“Code Style”項設(shè)置代碼生成風(fēng)格,完成后點(diǎn)擊“Apply”。

圖片

圖8 “Code Style”欄設(shè)置

如圖9所示,點(diǎn)開“Code Generation”左邊的“>”符號,在子欄目中找到“Code Placement”中設(shè)置“File packaging format”參數(shù),完成后點(diǎn)擊“Apply”,到這一步,所有參數(shù)都設(shè)置完成,然后點(diǎn)擊“OK”按鈕。

圖片

圖9 “Code Placement”欄設(shè)置

如圖10所示,點(diǎn)擊按鈕“Build Model”生成代碼。

圖片

圖10 點(diǎn)擊生成模型代碼

代碼生成根據(jù)電腦性能不同,需要的時間也不一樣,稍等一會兒,彈出“Code Generation Report”窗口報告,如圖11所示,在這個窗口中可以看到整個模型生成了三個文件,分別是“ert_main.c”、"LED_Blink.c"和"LED_Blink.h",然后在LED_Blink.slx文件所在的目錄下多了一個“LED_Blink_ert_rtw”名字的文件夾,生成的三個文件也包含在當(dāng)中;看這三個代碼有點(diǎn)像之前講的模塊化編程方式命名。

圖片

圖11 LED_Blink模型代碼生成報告

第3步:將simulink生產(chǎn)的代碼添加到8051單片機(jī)工程中

這一步也是整個過程中最關(guān)鍵部分,也是在很多資料中一直沒講清楚的部分,將生成的代碼移植到51單片機(jī)工程中去。先新建一個名字(其它名字也可以,只要正確建立Keil工程即可)為“LED_Blink”的Keil工程,工程的存放路徑放在剛剛模型生成代碼"Blink→LED_Blink_ert_rtw“文件夾下,如圖12所示。

圖片

圖12 在生成模型文件夾下建一個Keil工程

打開剛剛建立的Keil工程,將ert_main.c和LED_Blink.c文件添加到”Source Group 1“中,如圖13所示。

圖片

圖13 模型代碼添加

在剛剛添加的文件中雙擊打開ert_main.c,在下面代碼位置處加入8051單片機(jī)的內(nèi)容,代碼如下所示:

#include < stddef.h >
#include < stdio.h >                     /* This ert_main.c example uses printf/fflush */
#include "LED_Blink.h"                 /* Model's header file */
#include "rtwtypes.h"


#include < REGX52.H >                   /* 添加51單片機(jī)頭文件 */




/*********** 變量定義 *************/


#define MAIN_CLOCK      12000000
#define SYSTEM_DELAY    1000        /* 系統(tǒng)周期1ms */


#define LED_TASK_TIME   500         /* SYSTEM_DELAY*0.500 = 500ms任務(wù) */




uint16_T LED_Task_Count = LED_TASK_TIME;  /* 任務(wù)定時器變量 */


void SYSTEM_T0_Init( void );              /* 定時器0初始化函數(shù) */

添加單片機(jī)代碼

然后在ert_main.c文件中添加定時器初始化代碼,如下所示:

void SYSTEM_T0_Init( void )
{
    /* 定時器0配置為16位定時器,當(dāng)溢出時手工重裝 */
    /* 清除所有有關(guān)T0的位 (T1不變) */
    TMOD &= 0xF0; 
    /* 設(shè)置所需的T0相關(guān)位 (T1 不變) */
    TMOD |= 0x01; 


    /* 停止定時器0 */
    TR0 = 0;        

    /* 設(shè)置定時器重裝值 */
    /* 我們這里設(shè)置1ms產(chǎn)生一次中斷 */
    /* 定時器低8位賦值 */
    TL0  = 65536 -(MAIN_CLOCK/SYSTEM_DELAY/12);      
    /* 定時器高8位賦值 */
    TH0  = (65536-(MAIN_CLOCK/SYSTEM_DELAY/12)) >>8; 

    /* 啟動T0 */
    TR0  = 1;

    /* 使能定時器T0中斷 */
    ET0  = 1;
}

在ert_main.c中編寫定時器中斷代碼,如下所示:

/*************************************
** 函 數(shù) 名:SYSTEM_Tick_Update() interrupt 1
** 輸入?yún)?shù):none
** 返 回 值:none
** 說    明:定時器T0中斷入口函數(shù)
**************************************/
void SYSTEM_Tick_Update( void ) interrupt 1
{

    /* 停止定時器0 */
    TR0 = 0;        


    /* 設(shè)置定時器重裝值 */
    /* 我們這里設(shè)置1ms產(chǎn)生一次中斷 */
    /* 定時器低8位賦值 */
    TL0  = 65536 -(MAIN_CLOCK/SYSTEM_DELAY/12);      
    /* 定時器高8位賦值 */
    TH0  = (65536-(MAIN_CLOCK/SYSTEM_DELAY/12)) >>8; 


    /* 啟動T0 */
    TR0  = 1;


    /* LED Task 任務(wù)計時器*/
    LED_Task_Count--;
}

定時器中斷函數(shù)代碼

在main主函數(shù)中對代碼進(jìn)行修改,如下所示:

int_T main()
{


    /* Initialize model */
    LED_Blink_initialize();

    /* 定時器0 初始化 */
    SYSTEM_T0_Init();

    /* 使能總中斷,這樣定時器0才會啟動 */ 
    EA = 1;


    /* Attach rt_OneStep to a timer or interrupt service routine with
     * period 0.2 seconds (the model's base sample time) here.  The
     * call syntax for rt_OneStep is
     *
     *  rt_OneStep();
     */
      while (rtmGetErrorStatus(LED_Blink_M) == (NULL)) {
    /*  Perform other application tasks here */
    if(LED_Task_Count<=0)
       {
            LED_Task_Count = LED_TASK_TIME;

            rt_OneStep();

            /*輸入/輸出接口放置位置*/ 
            P1_0 = LED_Blink_Y.LED;

       }
    }


    /* Disable rt_OneStep() here */


    /* Terminate model */
    LED_Blink_terminate();
    return 0;
}

main函數(shù)中代碼

第4步:編譯Keil工程并運(yùn)行代碼

點(diǎn)擊Keil編譯按鈕編譯代碼,然后將代碼燒錄到實(shí)際芯片中或使用Pretous仿真驗證代碼。到這里大家就完成了在51單片機(jī)上實(shí)現(xiàn)LED閃爍Simulink模型代碼移植的例子,LED閃爍的頻率實(shí)際由宏定義#define LED_TASK_TIME 500來控制,在8051單片機(jī)上運(yùn)行該代碼時LED將以500ms的周期翻轉(zhuǎn)。

2、simulink生成模型代碼剖析

關(guān)于8051單片機(jī)怎么搭建簡單操作系統(tǒng)框架可以參考網(wǎng)絡(luò)上其他文章或關(guān)注作者的后續(xù)文章,這里就不再贅述,如圖14所示的LED閃爍模型,實(shí)際上就是運(yùn)行模型生成的rt_OneStep()函數(shù),每個Simulink生成的模型里面都會有這個函數(shù),rt_OneStep()運(yùn)行完之后所有通過輸入端的數(shù)據(jù)都會在搭建的模型邏輯中處理,然后通過輸出端輸出處理完后的數(shù)據(jù),在LED閃爍模型中,沒有輸入端,只有輸出端,所以模型每運(yùn)行完一次,里面的邏輯翻轉(zhuǎn)一次輸出端口LED狀態(tài),即LED_Blink_Y.LED的數(shù)據(jù),然后只需將模型輸出端口與實(shí)際物理端口關(guān)聯(lián)即可,這里關(guān)聯(lián)的是P1_0端口,則最終表現(xiàn)出來的效果就是P1_0狀態(tài),即模型每運(yùn)行一次,P1_0端口電平發(fā)生一次翻轉(zhuǎn),P1_0端口有連接LED,LED就會一直閃爍。

圖片

圖14 基于模型LED程序執(zhí)行流程

下面再深入到rt_OneStep()函數(shù)詳細(xì)了解下它到底在里面做了什么事情,是不是與前面所說的一致,rt_OneStep()函數(shù)詳細(xì)內(nèi)容,函數(shù)中的其它內(nèi)容暫時不管,可以看到里面關(guān)鍵的一步,調(diào)用了LED_Blink_step()函數(shù),具體代碼如下所示:

void rt_OneStep(void)
{
    static boolean_T OverrunFlag = false;


    /* Disable interrupts here */


    /* Check for overrun */
    if (OverrunFlag) {
        rtmSetErrorStatus(LED_Blink_M, "Overrun");
        return;
    }


    OverrunFlag = true;


    /* Save FPU context here (if necessary) */
    /* Re-enable timer or interrupt here */
    /* Set model inputs here */


    /* Step the model */
    LED_Blink_step();


    /* Get model outputs here */


    /* Indicate task complete */
    OverrunFlag = false;


    /* Disable interrupts here */
    /* Restore FPU context here (if necessary) */
    /* Enable interrupts here */
}

然后再到LED_Blink_step()函數(shù)中查看具體內(nèi)容,在主函數(shù)中調(diào)用的LED_Blink_Y.LED在該函數(shù)中可以找到具體的邏輯。至此,LED閃爍模型的整個代碼分析完成。其它模型也可以采用類似的方式來分析,具體代碼如下所示:

void LED_Blink_step(void)
{
    boolean_T rtb_Delay;


    /* Delay: '< Root >/Delay' */
    rtb_Delay = LED_Blink_DW.Delay_DSTATE[0];


    /* Outport: '< Root >/LED' incorporates:
     *  Delay: '< Root >/Delay'
     */
    LED_Blink_Y.LED = LED_Blink_DW.Delay_DSTATE[0];


    /* Update for Delay: '< Root >/Delay' incorporates:
     *  Logic: '< Root >/Logical Operator'
     */
    LED_Blink_DW.Delay_DSTATE[0] = LED_Blink_DW.Delay_DSTATE[1];
    LED_Blink_DW.Delay_DSTATE[1] = !rtb_Delay;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6066

    文章

    44947

    瀏覽量

    648466
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140820
  • Simulink
    +關(guān)注

    關(guān)注

    22

    文章

    541

    瀏覽量

    63762
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3501

    瀏覽量

    50155
  • Arduino
    +關(guān)注

    關(guān)注

    189

    文章

    6494

    瀏覽量

    190371
收藏 0人收藏

    評論

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

    單片機(jī)開發(fā)與Linux開發(fā)區(qū)別 精選資料分享

    編程,這種開發(fā)方式主要應(yīng)用于一些低端的ARM芯片上,其開發(fā)過程非常類似單片機(jī),這里不多敘述。還有一種是在
    發(fā)表于 07-13 08:14

    單片機(jī)開發(fā)與Linux開發(fā)區(qū)別 精選資料推薦

    編程,這種開發(fā)方式主要應(yīng)用于一些低端的ARM芯片上,其開發(fā)過程非常類似單片機(jī),這里不多敘述。還有一種是在...
    發(fā)表于 07-13 08:46

    使用simulink開發(fā)51單片機(jī)

    前言:越來越多的嵌入式開發(fā)開始采用基于模型的設(shè)計,基于模型設(shè)計采用的主要開發(fā)工具是simulink/stateflow,使用
    發(fā)表于 07-15 09:23

    [Simulink] Simulink與51單片機(jī)示例 精選資料分享

    工作。時間原因,只用51單片機(jī)做了簡單的示例,用來說明一下具體的開發(fā)方法,示例簡單,沒有進(jìn)行建模規(guī)范檢查,沒有test-harness,沒有用S-function和TLC寫模塊,也沒有調(diào)用KEIL進(jìn)行...
    發(fā)表于 07-22 06:48

    STM32的三種開發(fā)方式

    1 STM32的三種開發(fā)方式通常新手在入門STM32的時候,首先都要先選擇一種要用的開發(fā)方式,不同的開發(fā)方式會導(dǎo)致你編程的架構(gòu)是完全不一樣的。一般大多數(shù)都會選用標(biāo)準(zhǔn)庫和HAL庫,而極少部分人會通
    發(fā)表于 08-05 06:56

    STM32的三種開發(fā)方式分享

    STM32的三種開發(fā)方式通常新手在入門STM32的時候,首先都要先選擇一種要用的開發(fā)方式,不同的開發(fā)方式會導(dǎo)致你編程的架構(gòu)是完全不一樣的。一般大多數(shù)都會選用標(biāo)準(zhǔn)庫和HAL庫,而極少部分人會...
    發(fā)表于 12-01 07:59

    基于單片機(jī)的快速代碼生成方法

    基于模型設(shè)計是國外流行的一種先進(jìn)的嵌入式系統(tǒng)開發(fā)方式,該方式主要利用開發(fā)工具Simulink以及Matlab的RTW(Real-TimeWo
    發(fā)表于 12-18 16:26 ?5次下載

    Microchip推出基于云服務(wù)的免費(fèi)開發(fā)平臺,為PIC?單片機(jī)提供最簡便的開發(fā)方式

    Microchip日前宣布推出MPLAB? Xpress基于云服務(wù)的集成開發(fā)環(huán)境(IDE)。這一在線開發(fā)平臺在著手設(shè)計時無需下載、注冊和安裝,是開始PIC?單片機(jī)(MCU)開發(fā)最簡便的
    發(fā)表于 02-16 10:52 ?1757次閱讀

    ARM-Linux應(yīng)用開發(fā)單片機(jī)開發(fā)的區(qū)別是什么

    這里先要做一個說明,對于ARM的應(yīng)用開發(fā)主要有兩種方式:一種是直接在ARM芯片上進(jìn)行應(yīng)用開發(fā),不采用操作系統(tǒng),也稱為裸機(jī)編程,這種開發(fā)方式主要應(yīng)用于一些低端的ARM芯片上,其
    發(fā)表于 03-27 14:29 ?1962次閱讀

    Simulink嵌入式開發(fā)--使用simulink開發(fā)51單片機(jī)(一)

    前言:越來越多的嵌入式開發(fā)開始采用基于模型的設(shè)計,基于模型設(shè)計采用的主要開發(fā)工具是simulink/stateflow,使用
    發(fā)表于 11-02 19:21 ?33次下載
    <b class='flag-5'>Simulink</b>嵌入式<b class='flag-5'>開發(fā)</b>--使用<b class='flag-5'>simulink</b><b class='flag-5'>開發(fā)</b>51<b class='flag-5'>單片機(jī)</b>(一)

    記一種兼顧各方優(yōu)點(diǎn)的51單片機(jī)開發(fā)方式

    記一種兼顧各方優(yōu)點(diǎn)的51單片機(jī)開發(fā)方式1. 需要的軟件安裝以下軟件:keil_c51 (最好是較新的版本,舊版本可能沒有生成編譯腳本這一功能,無法獲得完整的使用體驗)VSCode 編輯器
    發(fā)表于 11-21 15:21 ?8次下載
    記一種兼顧各方優(yōu)點(diǎn)的51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>開發(fā)方式</b>

    機(jī)智云三種APP開發(fā)方式介紹

    機(jī)智云針對不同開發(fā)者的不同需求提供三種APP開發(fā)方式,包括集成SDK、使用app開源框架、使用app自動生成,幫助開發(fā)者更加快速開發(fā)自己的APP。
    的頭像 發(fā)表于 11-21 15:27 ?3091次閱讀
    機(jī)智云三種APP<b class='flag-5'>開發(fā)方式</b>介紹

    OpenHarmony應(yīng)用開發(fā)之ETS開發(fā)方式Image組件

    今天帶大家了解ETS開發(fā)方式中的Image組件
    的頭像 發(fā)表于 07-03 12:06 ?3851次閱讀
    OpenHarmony應(yīng)用<b class='flag-5'>開發(fā)</b>之ETS<b class='flag-5'>開發(fā)方式</b>Image組件

    先楫hpm_sdk開發(fā)方式的優(yōu)缺點(diǎn) 與單片機(jī)傳統(tǒng)開發(fā)方式的不同點(diǎn)

    最近在跟一些開發(fā)者交流過程中,或者開發(fā)者群里反饋,感覺先楫單片機(jī)開發(fā)方式不同于以往的單片機(jī)開發(fā)方式
    的頭像 發(fā)表于 09-25 09:16 ?3347次閱讀
    先楫hpm_sdk<b class='flag-5'>開發(fā)方式</b>的優(yōu)缺點(diǎn) 與<b class='flag-5'>單片機(jī)</b>傳統(tǒng)<b class='flag-5'>開發(fā)方式</b>的不同點(diǎn)

    [HPM雜談]你想要了解的先楫hpm_sdk開發(fā)都在這里系列 (一)

    一、背景最近在跟一些開發(fā)者交流過程中,或者開發(fā)者群里反饋,感覺先楫單片機(jī)開發(fā)方式不同于以往的單片機(jī)開發(fā)方
    的頭像 發(fā)表于 09-26 10:00 ?2278次閱讀
    [HPM雜談]你想要了解的先楫hpm_sdk<b class='flag-5'>開發(fā)</b>都在這里系列 (一)
    主站蜘蛛池模板: 男gv纯肉免费视频 | 午夜剧场1000 | 成在线人免费视频 | 大地影院在线播放 | 欧美性最猛xxxx在线观看视频 | 亚洲精品不卡在线 | 经典三级四虎在线观看 | 中文字幕精品无码一区二区 | 91涩涩视频 | 99视频在线精品免费观看18 | 新金梅瓶玉蒲团性奴3 | 最新精品学生国产自在现拍 | 国产精品成人久久久久A伋 国产精品成人观看视频免费 | 孕交videosgratis乌克兰 | 国产精品久久久久影院色老大 | 嫩草影院精品视频在线观看 | 欧美极限扩肛 | 欧美一级久久久久久久久大 | 久久久伊人影院 | 日日噜噜夜夜狠狠视频 | 国产在线中文字幕 | 久久偷拍vs国产在线播放 | 99久久无码热高清精品 | 久久久久久久99精品免费观看 | 中文字幕在线不卡日本v二区 | 夜色女人香 | 无人视频在线观看免费播放影院 | 中文字幕一区二区三区在线播放 | 国产精品xxxav免费视频 | 日日操天天操夜夜操 | 色一情一乱一伦一区二区三区 | 伊人久久精品中文字幕 | 国产激情视频在线播放 | 最新国产亚洲亚洲精品视频 | 胸大美女又黄的网站 | 毛片内射久久久一区 | 一个人看的HD免费高清视频 | 在线精品一卡乱码免费 | 日日踫夜夜爽无码久久 | 久久精品热在线观看85 | 亚洲最大在线视频 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品