摘要
STM32紅牛開發板上的5個LED,接在GPIOF6~10腳,輸出低電平時,LED亮。這樣我們設置GPIOF的相關寄存器,讓其輸出低電平就可以讓LED亮。因為沒有用到ST提供的固件庫,所以是直接對寄存器的內存地址讀寫,即對一個指向該地址的指針變量進行讀寫。并且該變量必須為易變型的,即用volatile定義,這樣是為了告訴編譯器不要去優化這個變量,導致其它一些寄存器的數據變化。GPIOx是掛載在APB2高速外設總線上的,最大頻率是72MHZ,所以我們除了了打開HSE(外部高速時鐘)并關閉內部高速時鐘(開機默認選擇了HSI)外,還要打開APB2總線的時鐘。
一、寄存器地址映射
外設的基址PERIPH_BASE 為0x40000000,APB1外設在前面,所以基址APB1PERIPH_BASE等于PERIPH_BASE,APB2外設基址APB2PERIPH_BASE為PERIPH_BASE + 0x10000,最后AHB基址是PERIPH_BASE + 0x20000.
GPIOx是掛載在APB2總線了的,從(APB2PERIPH_BASE + 0x0800)開始,每0x400字節空間為一組IO口的寄存器。所以GPIOF_BASE為(APB2PERIPH_BASE + 0x1C00)。結合芯片手冊,GPIOF各寄存器地址如下:
/***********GPIOF外設寄存器地址映射********************/
#define GPIOF_CRL (*(volatile unsigned long *) (GPIOF_BASE + 0x00))
#define GPIOF_CRH (*(volatile unsigned long *) (GPIOF_BASE + 0x04))
#define GPIOF_IDR (*(volatile unsigned long *) (GPIOF_BASE + 0x08))
#define GPIOF_ODR (*(volatile unsigned long *) (GPIOF_BASE + 0x0C))
#define GPIOF_BSRR (*(volatile unsigned long *) (GPIOF_BASE + 0x10))
#define GPIOF_BRR (*(volatile unsigned long *) (GPIOF_BASE + 0x14))
#define GPIOF_LCKR (*(volatile unsigned long *) (GPIOF_BASE + 0x18)
時鐘控制寄存器基址RCC_BASE 為(AHBPERIPH_BASE + 0x1000),由同樣方法可以得出RCC各寄存器地址如下:
/****************RCC寄存器地址映射*******************/
#define RCC_CR (*(volatile unsigned long *) (RCC_BASE + 0x00))
#define RCC_CFGR (*(volatile unsigned long *) (RCC_BASE + 0x04))
#define RCC_CIR (*(volatile unsigned long *) (RCC_BASE + 0x08))
#define RCC_APB2RSTR (*(volatile unsigned long *) (RCC_BASE + 0x0C))
#define RCC_APB1RSTR (*(volatile unsigned long *) (RCC_BASE + 0x10))
#define RCC_AHBENR (*(volatile unsigned long *) (RCC_BASE + 0x14))
#define RCC_APB2ENR (*(volatile unsigned long *) (RCC_BASE + 0x18))
#define RCC_APB1ENR (*(volatile unsigned long *) (RCC_BASE + 0x1C))
#define RCC_BDCR (*(volatile unsigned long *) (RCC_BASE + 0x20))
#define RCC_CSR (*(volatile unsigned long *) (RCC_BASE + 0x24))
至此,得到上面數據,對這些寄存器操作,我們就可以控制紅牛開板的上的5個LED了。
二、程序編寫
1、啟動代碼
啟動代碼直接使用ST提供的默認啟動代碼,由于我的開發板是大容量FLASH的STM32F103ZET6,所以用的啟動代碼是startup_stm32f10x_hd.s。
2、時鐘配置RCC_Configuration
跳轉到MAIN函數后,程序第一件要做的事情就是配置系統時鐘。由HSE直接作為系統時鐘。
Void RCC_Configuration()
{
RCC_CR |= (1<<16); // HSE振蕩器開啟
RCC_CR &= ~(1<<0); // HSI振蕩器關閉
RCC_CFGR |= (1<<2); // HSE作為系統時鐘
RCC_APB2ENR |= (1<<7); //打開GPIOF端口時鐘
}
3、GPIOF配置
GPIOF配置成通用開漏輸出模式,代碼如下:
void GPIO_Configuration()
{
GPIOF_CRH = 0x11111111; //GPIO 15~8
GPIOF_CRL = 0x11111111; //GPIO 7 ~0
}
4、GPIO置位/復位
置位/復位功能通過對端口位設置/清除寄存器(GPIOx_BSRR)操作實現,代碼如下:
void GPIO_SetBits( u16 GPIO_Pin)
{
GPIOF_BSRR = GPIO_Pin;
}
void GPIO_ResetBits(u16 GPIO_Pin)
{
GPIOF_BSRR = GPIO_Pin<<16;
}
三、總結
此程序只是用來演示脫離ST提供的固件庫控制GPIO口輸出。通過此程序來入門非固件庫的STM32程序設計。
上一篇:一例使用STM32外設庫設置串口速度與實際不一樣的解決
下一篇:STM32 cannot enter debug mode錯誤
推薦閱讀最新更新時間:2025-05-24 00:16




設計資源 培訓 開發板 精華推薦
- NCP2809B帶輸出耦合電容的典型應用
- AZ431B精密5V/1A穩壓器典型應用
- 【訓練營】鴻蒙BigDog
- OP495GSZ 4.5V、低壓差運算放大器基準的典型應用
- 使用 Analog Devices 的 LTC1261IS8 的參考設計
- EVAL-AD7414/15EB,用于 AD7414 SMBus/I2C、10 位數字溫度傳感器的評估板
- 102110037,Wio Link 是一款基于 ESP8266 SoC 的開源 Wi-Fi 開發板,適用于物聯網應用
- 使用 Richtek Technology Corporation 的 RT9164 的參考設計
- 用于開/關控制應用的 AM2G-2415SH30Z 15V 2 瓦 DC-DC 轉換器的典型應用
- 具有大接地回路電壓的 LTC2862AIS8-1 RS485 鏈路的典型應用