0.png (41.94 KB, 下載次數: 119)
下載附件
2018-7-14 18:28 上傳
單片機源程序如下:
- #include "stm32f10x.h"
- #include "gpio.h"
- //對于STM32 GPIO一般用法配置(這里不包括復用功能),以下的說明可以應用點亮燈多種方式
- void GPIO_Configure_GPIOA(void)
- {
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//設置時鐘,針對GPIOA時鐘使能
- /* 為什么要設置時鐘呢???
- 任何外設都需要時鐘,51單片機,stm32,430等等,
- 因為寄存器是由D觸發器組成的,往觸發器里面寫東西,前提條件是有時鐘輸入。
- stm32之所以是低功耗,他將所有的門都默認設置為disable,在你需要用哪個門的時候,
- 開哪個門就可以,也就是說用到什么外設,只要打開對應外設的時鐘就可以,
- 其他的沒用到的可以還是disable,這樣耗能就會減少。
- stm32的時鐘是有分工的,并且每類時鐘的頻率不一樣,因為沒必要所有的時鐘都是最高頻率,只要夠用就行,
- 好比一個門出來水流大小,我只要洗臉,但是出來的是和洪水一樣涌出來的水,那就gg了,消耗能源也多,
- 所以不同的時鐘也會有頻率差別,或者在配置的時候可以配置時鐘分頻。
- */
-
-
- GPIO_InitTypeDef GPIO_InitStructure;//GPIO設備的初始化函數
- //GPIO_InitTypeDef是一個結構體類型同義字,其功能是定義一個結構體,
- //該結構體有三個成員分別是 u16類型的GPIO_Pin、
- // GPIOSpeed_TypeDef 類型的GPIO_Speed 和GPIOMode_TypeDef 類型的GPIO_Mode。即以下三種:
-
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通推挽輸出
- //GPIO有8種工作模式(4種輸入模式和4種輸出模式):
- /*
- 4種輸入模式:
- 上拉輸入模式(GPIO_Mode_IPU)-->在默認狀態下(GPIO引腳無輸入),讀取得的GPIO引腳
- 數據為1,高電平。
-
- 而下拉輸入模式(GPIO_Mode_IPD)則相反。在默認狀態下(GPIO引腳無輸入),讀取得的GPIO引腳
- 數據為0,低電平。
-
- 浮空輸入模式(GPIO_Mode_IN_FLOATING)在芯片內部既沒有接上拉,也沒有接下拉電阻,
- 經由觸發器輸入。這種模式用于標準的通信協議如I2C、USART的接收端
-
- 模擬輸入模式(GPIO_Mode_AIN)則關閉了施密特觸發器,不接上、下拉電阻,經由另一線路
- 把電壓信號傳送到片上外設模塊。如傳送至ADC模塊,由ADC采集電壓信號。所以使用ADC外設時,必須設置為模擬輸入模式
-
- 4種輸出模式:
- 普通推挽輸出(GPIO_Mode_Out_PP)一般應用在輸出電平為0和3.3伏的場合
-
- 普通開漏輸出(GPIO_Mode_Out_OD)一般在電平不匹配的場合,如需要輸出5伏的高電平,就需要在外部接一個
- 上拉電阻,電源為5伏,把GPIO設置為開漏模式,當輸出高阻態時,由上拉電阻和電源向外輸出5伏的電平
-
- 復用推挽輸出(GPIO_Mode_AF_PP),是根據GPIO的復用功能來選擇的,如GPIO的引腳用作串口的輸出,
- 則使用復用推挽輸出模式。
-
- 復用開漏輸出(GPIO_Mode_AF_OD),同理,其用在IC、SMBUS這些需要線與功能的復用場合
- 在使用任何一種開漏模式時,都需要接上拉電阻。
- */
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//針對某組的一個引腳進行初始化
- //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;//針對某組的兩個引腳進行初始化
- //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//針對某組的16個引腳進行初始化
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- /*
- 又稱輸出驅動電路的響應速度:(芯片內部在I/O口的輸出部分安排了多個響應速度不同的輸出驅動電路,
- 用戶可以根據自己的需要選擇合適的驅動電路,通過選擇速度來選擇不同的輸出驅動模塊,
- 達到最佳的噪聲控制和降低功耗的目的。)
- 可理解為: 輸出驅動電路的帶寬:即一個驅動電路可以不失真地通過信號的最大頻率。
- (如果一個信號的頻率超過了驅動電路的響應速度,就有可能信號失真。失真因素?)
- 如果信號頻率為10MHz,而你配置了2MHz的帶寬,則10MHz的方波很可能就變成了正弦波。
- 就好比是公路的設計時速,汽車速度低于設計時速時,可以平穩地運行,
- 如果超過設計時速就會顛簸,甚至翻車。
- 關鍵是: GPIO的引腳速度跟應用相匹配,速度配置越高,噪聲越大,功耗越大。
- 帶寬速度高的驅動器耗電大、噪聲也大,帶寬低的驅動器耗電小、噪聲也小。
- 使用合適的驅動器可以降低功耗和噪聲
- 比如:高頻的驅動電路,噪聲也高,當不需要高的輸出頻率時,請選用低頻驅動電路,
- 這樣非常有利于提高系統的EMI性能。當然如果要輸出較高頻率的信號,
- 但卻選用了較低頻率的驅動模塊,很可能會得到失真的輸出信號。
- 關鍵是GPIO的引腳速度跟應用匹配(推薦10倍以上?)。
- */
- GPIO_Init(GPIOA,&GPIO_InitStructure);//進行GPIOA初始化
- }
- void Delay_ms(u16 ms)
- {
- int i;
- while(ms--)
- {
- i = 12000;
- while(i--);
- }
-
- }
- void GPIO_Achieve(u8 n,u16 ms)
- {
- // u8 Readoutbit;
- // u16 Readoutdate;
- if(n == 0)
- {
- GPIO_ResetBits(GPIOA,GPIO_Pin_1);//設置PA0引腳為低電平,清除引腳位
- Delay_ms(ms);//不精準的延時函數,毫秒單位
-
-
- /*這是GPIO_ResetBits(GPIOx,GPIO_Pin)代碼
- void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- {
- //Check the parameters
- assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
- assert_param(IS_GPIO_PIN(GPIO_Pin));
- GPIOx->BRR = GPIO_Pin;//位復位寄存器賦值(將某個引腳變為低電平)
- }
- */
-
-
- //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);//將PA0引腳輸出的值賦給Readoutbit
- //Readoutdate = GPIO_ReadOutputData(GPIOA);//將PA所有引腳輸出的值賦給Readoutdate
-
- //GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);//獲取PA0引腳的值
- //GPIO_ReadInputData(GPIOA);//獲取PA所有引腳的值
- //GPIO_WriteBit(GPIOA,GPIO_Pin_0,RESET);//將RESET值寫入給PA0引腳(其實就是將PA0引腳置0)
- //GPIO_Write(GPIOA,0xffff);//將0xffff值寫入PA端口(其實就是將PA所有引腳置1)
- }
- else
- {
- GPIO_SetBits(GPIOA,GPIO_Pin_1);//設置PA0引腳為高電平,置位引腳
- Delay_ms(ms);
- /*
- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- {
- //Check the parameters
- assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
- assert_param(IS_GPIO_PIN(GPIO_Pin));
- GPIOx->BSRR = GPIO_Pin;//位置位寄存器賦值(將某個引腳變為高電平)
- }
- */
- //Readoutbit = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
- //Readoutdate = GPIO_ReadOutputData(GPIOA,GPIO_Pin_0);
- }
- }
- /*
- 注釋:
- GPIOx->BSRR= GPIO_Pin;-----------位置位寄存器---這是單個引腳的
- GPIOx->BRR= GPIO_Pin;------------位復位寄存器---這是單個引腳的
- GPIOx-ODR= PortVal;--------------端口輸出寄存器---這是16個引腳的
- GPIOx-IDR= PortVal;--------------端口輸入寄存器---這是16個引腳的
- 對于GPIO來說,還有其他函數
- 以上,是我對GPIO的部分理解,有些可能理解不到位,請諒解(有些是從網上查找的)
- */
復制代碼
所有資料51hei提供下載:
TEXT1.rar
(707 KB, 下載次數: 114)
2018-7-14 16:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|