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


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

 

首先建一個stm32f103x.h的文件,然后 #include "stm32f103x.h"

 

 還記得上一節

 

現在呢就是做一個庫,我就是想控制IO的時候方便一點,列如

PA 通過某種方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PB 通過某種方式  CRL/CRH/IDR/ODR/BSRR/BRR/LCKR

PC  ;  PD  ; PE ......

額,直接進入正題

要是可以這樣就好了  PA->CRL = XXXXXXXX    PB->CRL = XXXXXXXX   PC->CRL = XXXXXXXX   PD ->CRL = XXXXXXXX

那就引入結構體(其實可以這樣做主要還是因為寄存器地址是連續的)

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;

加個 |  或  就可以了

咱現在測試測試

    

 

 

 

 

 

 

 

 

還可以哈

現在設置模式,由於引腳的模式的有好幾個,還有設置引腳的速率,所以呢就用一個結構體配置引腳的模式和速率

 


免責聲明!

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



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