如何使stm32程序更好移植, 結構體相當於define


原創:轉載請標注引用地址

如何定義 led1對應於PA8  呢

:對於我一開始學習的方法::

#include "main.h"

 #define led1      GPIO_Pin_8        //管腳宏定義   PA8

 

//=================================================================================================
//函數名稱: GPIO_Configuration    
//輸入參數: void
//輸出參數: void
//函數功能: 所用到的GPIO的初始化
//日    期: 2017-11-13
//作    者: GXTon
//=================================================================================================

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);     //使能PORTA時鍾   
    
    //下面是用於測試的小燈的設置
    GPIO_InitStructure.GPIO_Pin = led1;                                     //PA8
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

}

 

在主函數中:

 

 

void main(void)

{

//一系列的初始化

.........

.........
    GPIO_Configuration();

 

while(1)

{

        GPIO_SetBits(GPIOA,led1);            //點亮燈

        Delay_ms(1000);


        GPIO_ResetBits(GPIOA,led1);       //滅掉燈

        Delay_ms(1000);

}

}

 

/////////////////////////////////////////////////////////////////////////////////////////////////

上面的程序是經常用的,但是總感覺不太順利,尤其是每次要換板子 

,也就是對應的小燈在新的板子上換了引腳:

如把  led1==PA8  改成  led1==PB10 

 

對應的引腳總要改三個地方::   點亮一個小燈也就需要下面三個函數,

也就是說你要移植一個程序,就要改動用到函數的每一個部分,

這根本就不是很好的程序

 

 

1: #define led1      GPIO_Pin_8        //管腳宏定義   PA8    ---->改為GPIO_Pin_10

2:void GPIO_Configuration(void)                                      ---->需要改時鍾,改賦值處

3:GPIO_SetBits(GPIOA,led1);            //點亮燈                  ---->需要改為GPIO_SetBits(GPIOB,led1);

 

下面對這三部分進行改造,

第一部分不用define,而用結構體,,,用結構體的好處是,,可以用一個變量 struct led1,來代表很多變量,,,,因為一個結構體里面有好多元素,,,可以認為結構體是define的升級版

 

第二部GPIO_Configuration(void),,要改進它,,它不在是傳入void,,而是傳入結構體 這樣就可以和第一部分關聯起來了   

也許不用傳入變量,直接在里面引入結構體的元素就行

第三部分GPIO_SetBits(GPIOA,led1),,也是把傳入的參數:GPIOA,led1   這里是兩個參數,我們就改成傳入一個結構體的兩個元素.

經過這樣的改編,第二部分和第三部分都和第一部分的結構體扯上了關系,那么我們以后一直程序的時候,就只需要改編第一部分的

結構體就行了,,這樣第二部分和第三部分就會有相應的變動傳入,,大大簡化了,,移植的步驟

///////////////////////////////////////////////////////////////////////////////////////////////////

 

也許我們可以定義一個新的函數,讓它來包含所有的函數,,然后把硬件小燈這里的led1設置成為一種

結構體,,

結構體里面包含了小燈的引腳組(A或者B...)

結構體里也包含了小燈的引腳號(8引腳或者10引腳...)

結構體里可以包含引腳連接的標號(led1或者TX,,RX..CLK,,DIO)

結構體里可以包含小燈的各種動作,使用一個函數指針,指向對應函數實現的,不過沒有試過(一直亮,一直滅,閃爍)

結構體里可以包含小燈在這個狀態的時間(閃爍時,,,處於關閉的時間變量   處於發光的時間是變量)

////////////////////////////////////////////////////////////////////////////////////////////////

下面我試着實現以下

 

下面是結構體,

 struct LED                                //為什么它只能在這里定義,在main.c中卻是不能呢
{
    GPIO_TypeDef* GPIOx;         //引腳分組, 如A管腳或B管腳
    uint16_t GPIO_Pin;               //引腳號,   PA8里的  8   或者 PB10里的  10

    uint32_t RCC_APB2Periph   //引腳掛接在哪個時鍾下面
    int ON_T;
    int OFF_T;
    int TIME;
    u8 ZT;           //狀態,off/on
    u8 led_enable;  //這個是防止重新進入的,因為led的處理沒有必要每次都進入,只需要運行一次進入即可
    int cnt;         //這個是用來計數的,計算閃亮了多少次
    int cntt;         //這個是計數停止的界限
    u8 sjxd;         //需不需要限定時間
    
};    這個是個模具,,用它來扣蛋糕,,蛋糕的名字叫led1,led2或者led3...

 

 

GPIO_Configuration  函數的改造

//=================================================================================================
//函數名稱: GPIO_Configuration    
//輸入參數: struct LED *led     //這個是一個結構體,里面包含了小燈的所有信息,,,我也在猶豫,,,要不要傳進所有的信息,,,還是只傳入結構體內的部分變量就好
//輸出參數: void
//函數功能: 所用到的GPIO的初始化
//日    期: 2017-11-13
//作    者: GXTon
//=================================================================================================

void GPIO_Configuration(struct LED *led)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(led->RCC_APB2Periph   ,ENABLE);     //使能PORTA時鍾   
    
    //下面是用於測試的小燈的設置
    GPIO_InitStructure.GPIO_Pin = led->GPIO_Pin;                                 //PA8
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(led->GPIOx,&GPIO_InitStructure);

}

 

對於點亮小燈的函數改造

GPIO_SetBits(led->GPIOx, led->GPIO_Pin);  //亮

 

 當然這只是一部分,小燈不只會亮,還會滅,也能閃,,所以要改造涉及的所有函數

 

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

不一定要統一所有外設,,燈能亮,,但是馬達還能亮嗎?顯然不能,,,,,外設也是分類的

我們的程序不一定要把燈和馬達都搞到一個結構體里,,,可以設置兩個結構體嘛

這樣燈有燈的結構體,,馬達有馬達的結構體,,

也許會分的更細,,紅燈有紅燈的結構體,綠燈有綠燈的結構體,,黃燈有黃燈的結構體

 

編寫程序前需要分類,,分好類之后按照類型創建結構體,過度的統一並不是好的事情

 

 

 

 

 

void LED_CL(struct LED *led,u8 ztbh,u8 sjxd, int cnt);  //處理led用於改變led狀態時才去調用
void LED_ZT( struct LED *led);          //接收led結構體的狀態,去執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM