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;
加個 | 或 就可以了
咱現在測試測試
還可以哈
現在設置模式,由於引腳的模式的有好幾個,還有設置引腳的速率,所以呢就用一個結構體配置引腳的模式和速率