原創:轉載請標注引用地址
如何定義 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結構體的狀態,去執行
