RM新时代网站-首页

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

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

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

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

CHANBAEK ? 來(lái)源: 想啥做啥 ? 作者: 想啥做啥 ? 2023-11-30 15:27 ? 次閱讀

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

使用Arduinosimulink中搭建的LED閃爍的一個(gè)例子如圖1所示,相比之前C語(yǔ)言代碼實(shí)現(xiàn)的方式,這里沒(méi)有寫(xiě)一行代碼就實(shí)現(xiàn)了LED閃爍。讀者有沒(méi)有感覺(jué)這種開(kāi)發(fā)方式即簡(jiǎn)單又方便,要實(shí)現(xiàn)什么功能就直奔主題,不用一行一行的敲代碼、排查代碼錯(cuò)誤。圖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ī)基于模型開(kāi)發(fā)方式

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

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

第1步:搭建Simulink模型

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

圖片

圖3 LED閃爍simulink模型

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

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

圖片

圖4 simulink設(shè)置按鈕

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

圖片

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

如圖6所示,在“Hardware Implementtation”欄中設(shè)置硬件參數(shù),按照?qǐng)D中的設(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)開(kāi)“Code Generation”左邊的“>”符號(hào),在子欄目中找到“Code Style”項(xiàng)設(shè)置代碼生成風(fēng)格,完成后點(diǎn)擊“Apply”。

圖片

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

如圖9所示,點(diǎn)開(kāi)“Code Generation”左邊的“>”符號(hào),在子欄目中找到“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ù)電腦性能不同,需要的時(shí)間也不一樣,稍等一會(huì)兒,彈出“Code Generation Report”窗口報(bào)告,如圖11所示,在這個(gè)窗口中可以看到整個(gè)模型生成了三個(gè)文件,分別是“ert_main.c”、"LED_Blink.c"和"LED_Blink.h",然后在LED_Blink.slx文件所在的目錄下多了一個(gè)“LED_Blink_ert_rtw”名字的文件夾,生成的三個(gè)文件也包含在當(dāng)中;看這三個(gè)代碼有點(diǎn)像之前講的模塊化編程方式命名。

圖片

圖11 LED_Blink模型代碼生成報(bào)告

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

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

圖片

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

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

圖片

圖13 模型代碼添加

在剛剛添加的文件中雙擊打開(kāi)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ù)定時(shí)器變量 */


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

添加單片機(jī)代碼

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

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


    /* 停止定時(shí)器0 */
    TR0 = 0;        

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

    /* 啟動(dòng)T0 */
    TR0  = 1;

    /* 使能定時(shí)器T0中斷 */
    ET0  = 1;
}

在ert_main.c中編寫(xiě)定時(shí)器中斷代碼,如下所示:

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

    /* 停止定時(shí)器0 */
    TR0 = 0;        


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


    /* 啟動(dòng)T0 */
    TR0  = 1;


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

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

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

int_T main()
{


    /* Initialize model */
    LED_Blink_initialize();

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

    /* 使能總中斷,這樣定時(shí)器0才會(huì)啟動(dòng) */ 
    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仿真驗(yàn)證代碼。到這里大家就完成了在51單片機(jī)上實(shí)現(xiàn)LED閃爍Simulink模型代碼移植的例子,LED閃爍的頻率實(shí)際由宏定義#define LED_TASK_TIME 500來(lái)控制,在8051單片機(jī)上運(yùn)行該代碼時(shí)LED將以500ms的周期翻轉(zhuǎn)。

2、simulink生成模型代碼剖析

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

圖片

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

下面再深入到rt_OneStep()函數(shù)詳細(xì)了解下它到底在里面做了什么事情,是不是與前面所說(shuō)的一致,rt_OneStep()函數(shù)詳細(xì)內(nèi)容,函數(shù)中的其它內(nèi)容暫時(shí)不管,可以看到里面關(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閃爍模型的整個(gè)代碼分析完成。其它模型也可以采用類似的方式來(lái)分析,具體代碼如下所示:

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

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634634
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136685
  • Simulink
    +關(guān)注

    關(guān)注

    22

    文章

    533

    瀏覽量

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

    關(guān)注

    1

    文章

    3226

    瀏覽量

    48807
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6468

    瀏覽量

    186952
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ARM的Linux嵌入式開(kāi)發(fā)單片機(jī)開(kāi)發(fā)到底有什么不同之處

    對(duì)于ARM的嵌入式開(kāi)發(fā)主要有兩種方式:一種是直接在ARM芯片上進(jìn)行應(yīng)用開(kāi)發(fā),不采用操作系統(tǒng),也稱為裸機(jī)編程,這種開(kāi)發(fā)方式主要應(yīng)用于一些低端的ARM芯片上,其
    發(fā)表于 06-12 17:46 ?0次下載
    ARM的Linux嵌入式<b class='flag-5'>開(kāi)發(fā)</b>和<b class='flag-5'>單片機(jī)</b><b class='flag-5'>開(kāi)發(fā)</b>到底有什么不同之處

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

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

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

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

    51單片機(jī)(四)—— 51單片機(jī)仿真芯片的使用

    在前面的文章中,我們都是直接用串口將程序燒寫(xiě)到單片機(jī)中運(yùn)行,在這種開(kāi)發(fā)方式下,如果程序有問(wèn)題,很難找到問(wèn)題所在,用過(guò)一些高端單片機(jī)的人可能知道,一般單片機(jī)是可以用調(diào)試器調(diào)試的,可以單步
    發(fā)表于 11-20 13:51 ?16次下載
    51<b class='flag-5'>單片機(jī)</b>(四)—— 51<b class='flag-5'>單片機(jī)</b>仿真芯片的使用

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

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

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

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

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

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

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

    一、背景最近在跟一些開(kāi)發(fā)者交流過(guò)程中,或者開(kāi)發(fā)者群里反饋,感覺(jué)先楫單片機(jī)開(kāi)發(fā)方式不同于以往的單片機(jī)開(kāi)發(fā)方
    的頭像 發(fā)表于 09-26 10:00 ?1770次閱讀
    [HPM雜談]你想要了解的先楫hpm_sdk<b class='flag-5'>開(kāi)發(fā)</b>都在這里系列 (一)
    RM新时代网站-首页