四、GPIO
stm32f407VG這款單片機上共有PA-PE共5×16共80個複用IO口,每個通用I / O端口有4個32位配置寄存器(GPIOx_MODERGPIOx_OTYPER GPIOx_OSPEEDR GPIOx_PUPDR),兩個32位數據寄存器(GPIOx_IDR和GPIOx_ODR),一個32位的置位/復位寄存器(GPIOx_BSRR),32位鎖定寄存器(GPIOx_LCKR)和兩個32位的備用功能選擇寄存器(GPIOx_AFRHGPIOx_AFRL)。
設置步驟:
1. 使能相關時鐘
2. 設置相應的IO口爲輸入或輸出
3. 設置輸入\輸出的類型
4. 設置輸出的速度(如果設置爲輸入,此步跳過)
5. 如果輸出速度>=50M,開啓補償單元
6. 設置上拉下拉寄存器
7. 通過復位置位寄存器和輸入輸出數據寄存器進行操作。
程序:
/************************************
標題:操作GPIO的練習
軟件平臺:IAR for ARM6.21
硬件平臺:stm32f4-discovery
主頻:168M
author:小船
data:2012-01-16
*************************************/
#include <stm32f4xx.h>
uint32_t Gb_TimingDelay;
void Delay(uint32_t nTime);
void main ()
{
SysTick_Config(SystemCoreClock / 1000); //設置systemtick一毫秒中斷
RCC->AHB1ENR |= 0x00000008; //使能GPIOD時鐘
RCC->APB2ENR |= (1<<14); //使能syscfg時鐘
GPIOD->MODER &= 0x00FFFFFF; //設置PD12,13,14,15輸出
GPIOD->MODER |= 0x55000000;
GPIOD->OTYPER &= 0xFFFF0FFF; //設置PD12,13,14,15推輓輸出
GPIOD->OSPEEDR &= 0x00FFFFFF; //PD12,13,14,15 速度100m
GPIOD->OSPEEDR |= 0xff000000;
SYSCFG->CMPCR = 0x00000001; //使用IO補償單元,
//當GPIO速度超過50M的時候要考慮使用此設置
GPIOD->PUPDR &= 0x00FFFFFF; //PD12,13,14,15 無上拉無下拉
GPIOD->BSRRH = 0xf000; //reset register GPIOx_BSRRH, write only
//set register GPIOx_BSRRL, write only
while(1)
{
GPIOD->BSRRH = 0xf000;
GPIOD->BSRRL = 0x1000;
Delay(500);
GPIOD->BSRRH = 0xf000;
GPIOD->BSRRL = 0x1000<<1;
Delay(500);
GPIOD->BSRRH = 0xf000;
GPIOD->BSRRL = 0x1000<<2;
Delay(500);
GPIOD->BSRRH = 0xf000;
GPIOD->BSRRL = 0x1000<<3;
Delay(500);
}
}
void Delay(uint32_t nTime)
{
Gb_TimingDelay = nTime;
while(Gb_TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (Gb_TimingDelay != 0x00)
{
Gb_TimingDelay--;
}
}