3-STM32帶你入坑系列(本身封裝點亮一個燈的庫--Keil)

2-STM32帶你入坑系列(點亮一個燈--Keil)

 

首先建一個stm32f103x.h的文件,而後 #include "stm32f103x.h"html

 

 還記得上一節函數

 

如今呢就是作一個庫,我就是想控制IO的時候方便一點,列如post

PA 經過某種方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR學習

PB 經過某種方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR測試

PC  ;  PD  ; PE ......url

額,直接進入正題spa

要是能夠這樣就行了  PA->CRL = XXXXXXXX    PB->CRL = XXXXXXXX   PC->CRL = XXXXXXXX   PD ->CRL = XXXXXXXX設計

那就引入結構體(其實能夠這樣作主要仍是由於寄存器地址是連續的)3d

typedef struct
{
unsigned int CRL;
unsigned int CRH;
unsigned int IDR;
unsigned int ODR;
unsigned int BSRR;
unsigned int BRR;
unsigned int LCKR;
} GPIO_TypeDef;指針

在32位處理器上 unsigned int 是32位的

假設要控制PA口哈

若是咱定義一個 GPIO_TypeDef的變量(指針),而後讓這個變量(指針)的地址是  0x40010800 就行了

結構體指針是這個結構體的首地址,也是裏面第一個變量的首地址  

這樣的話 CRL的地址就是0x40010800    CRH的地址就是  0x40010804    IDR的地址就是0x40010808

若是C語言很差......本身去百度哈,本身測試打印打印

先說一個強制轉換的問題

 

 

 

 

 能夠測試看一下

 

 

不知道還有沒有什麼疑問,根據上一節哈,有人會想   爲何不是這樣    ss = (int *)point;  或者 ss = (unsigned int *)point;

(int *)point   就把後面的point(0x40010800) 當成了一個地址,而後把這個地址賦值給ss不行嗎?

記住哈,指針也是有類型的   ss是一個什麼呀

 

 

那 ss = 這邊也應該是一個結構體類型的指針    因此才須要  

 

所謂:   魚找魚蝦找蝦烏龜找王八

 

 

 可是那樣寫有點麻煩

要是直接代替掉

就行了

 

,能夠這樣 

 

#define  GPIOA  (GPIO_TypeDef *)point

 

就是用GPIOA  替換掉後面的指針

 如今GPIOA  所指向的就是GPIO_TypeDef  這個結構體了

 

 

寫的好點就是

 

 

 

 

 

 但是感受這樣寫仍是有點麻煩,我想再封裝一下

 

咱就咱建一個stm32f10x_gpio.c   和  stm32f10x_gpio.h 的文件,對函數進行進一步的封裝

 

先寫設置輸出高電平的 (注意哈,我寫的函數是根據ST寫的庫寫的,不是按照本身的想法寫的,主要是在下一節學習庫的時候,讓你們感受親切)

 

 

 

 

 這樣多個文件你們應該懂吧???  改天我再寫一篇關於文件編譯和多文件編譯的文章.

 

定義成,結構體指針變量,這樣就能夠直接傳進來  

 

 

由於GPIOA,GPIOB,GPIOC 就是結構體指針變量

咱控制PA0輸出高電平

GPIO_SetBits(GPIOA,0)   

控制PA1輸出高電平

 GPIO_SetBits(GPIOA,1)   

咱想要的是這樣

而後按照咱想的設計一下里面的內容(咱仍是用ODR實現哈哈)

 

 

 

 

 

GPIOx->ODR = (unsigned int)1<<GPIO_Pin;

 

假設傳進來的是0 

GPIOx->ODR = (unsigned int)1<<0;        (unsigned int)1左移0位(0000 0000 0000 0001);         

 

GPIOx->ODR = 0x0001

 

假設傳進來的是1

GPIOx->ODR =(unsigned int)1<<1;       (unsigned int)1左移1位(0000 0000 0000 0010);       

GPIOx->ODR = 0x0002

 

貌似是能夠可是有件事就是每次都會清除原來的

這事情簡單

GPIOx->ODR |= (unsigned int)1<<GPIO_Pin;

加個 |  或  就能夠了

咱如今測試測試

    

 

 

 

 

 

 

 

 

還能夠哈

如今設置模式,因爲引腳的模式的有好幾個,還有設置引腳的速率,因此呢就用一個結構體配置引腳的模式和速率

相關文章
相關標籤/搜索