1:基礎知識準備工作:
1:GPIO
每組IO有16個IO口,這16個IO口透過先七個暫存器來進行控制
GPIOx_CRL : 埠配置低暫存器
GPIOx_CRH: 埠配置高暫存器
GPIOx_IDR: 埠輸入暫存器
GPIOx_ODR: 埠輸出暫存器
GPIOx_BSRR: 埠位設定/清除暫存器
GPIOx_BRR : 埠位清除暫存器
GPIOx_LCKR: 埠配置鎖存暫存器
2:四種輸出模式
開漏輸出模式 的理解(目前先只學習這一個,因為只是用來點亮LED,後面用到其他的在接著學習)簡單的理解就是推拉,即吧電壓調高或者可以吧電壓調低。他是用來控制輸出的,而不能用來輸入資料。疑問 這裡可以輸出資料 還是隻能輸出高低電平? (一般用來i按揭數字器件)
3:跑馬等硬體連線圖:
- 從圖中可以看出來,LED1/LED0 分別連著晶片管腳PB5/PE5;並且另一端都是連著高電平VCC3.3。 那麼我們只需要將PB5或者PE5設定開漏輸出低電平就會點亮LED,設定高電平大於等於VCC3.3 那麼就會熄滅LED。(大致邏輯如此)
4:需要用到的庫函式
首先在程式碼中加上如下檔案,並且在main函式中包含這些標頭檔案;
標頭檔案:stm32f10x_gpio.h
原始檔:stm32f10x_gpio.c
(可以透過keil 自帶的Manage run-Time Environment工具新增)
- 本次使用到的函式:
//初始化函式:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//讀取輸入電平函式:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//讀取輸出電平函式:
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//設定輸出電平函式:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
2:環境搭建:
1:建立工程
a:選擇型號:
b:這裡選擇我們執行程式的三個相關的。
1:核心介面,所有函式最終呼叫的是他,這裡也是stm32 光放提供的
2:第二個GPIO相關的,也是我們即將點亮LED使用的使用者介面
3:啟動相關的程式,怎麼從彙編程式碼呼叫到C語言。這裡不懂得可以看《30天自制作業系統》
c:工程建立好了如下:
d:設定燒錄工具
e:設定燒錄方式
f:到這裡簡單的工程就建立好了
編譯的時候可能遇到如下錯誤:
錯誤1:
D:\soft\keil5\packs\Keil\STM32F1xx_DFP\1.1.0\Device\StdPeriph_Driver\src\stm32f10x_rcc.c(273): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_HSE(RCC_HSE));
如下修改方法:
https://blog.csdn.net/tujidi1csd/article/details/52711688
錯誤2:
D:\soft\keil5\packs\Keil\STM32F1xx_DFP\1.1.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory
#include "stm32f10x_conf.h"
修改方法如下圖: