首先建一個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;
加個 | 或 就能夠了
咱如今測試測試
還能夠哈
如今設置模式,因爲引腳的模式的有好幾個,還有設置引腳的速率,因此呢就用一個結構體配置引腳的模式和速率