初中生
最后登录1970-1-1
在线时间 小时
注册时间2017-11-16
|
本帖最后由 莫循 于 2017-11-21 00:22 编辑
/**
*新建工程末班-寄存器版本
*/
#include"Stm32F4xx.h"
#include"Stm32F4xx_GPIO.h"
#define PERIPH_BASE ((unsigned int )0x40000000)
#define AHB1PERIPH_BASE (PERIPH_BASE +0x00020000)
#define GPIOA_BASE (AHB1PERIPH_BASE+0x00000000)
#define GPIOH_BASE (AHB1PERIPH_BASE+0x00001C000)
#define GPIOH_MODER *(unsigned int *)(GPIOH_BASE+0x00)
#define GPIOH_OTYPER *(unsigned int *)(GPIOH_BASE+0x04)
#define GPIOH_OSPEEDR *(unsigned int *)(GPIOH_BASE+0x08)
#define GPIOH_PUPDR *(unsigned int *)(GPIOH_BASE+0x0c)
#define GPIOH_IDR *(unsigned int *)(GPIOH_BASE+0x10)
#define GPIOH_ODR *(unsigned int *)(GPIOH_BASE+0x14)
#define GPIOH_BSRR *(unsigned int *)(GPIOH_BASE+0x18)
#define GPIOH_LCKR *(unsigned int *)(GPIOH_BASE+0x1c)
#define GPIOH_AFRL *(unsigned int *)(GPIOH_BASE+0x20)
#define GPIOH_AFRH *(unsigned int *)(GPIOH_BASE+0x24)
typedef unsigned int u32;
typedef unsigned short u16;
typedef struct
{
u32 MODER;
u32 OTYPER;
u32 OSPEEDR;
u32 PUPDR;
u32 IDR;
u32 ODR;
u32 BSRRL;
u32 BSRRH;
u32 LCKR;
u32 AFR[2];
}GPIO_TypeDef;
#define GPIOH ((GPIO_TypeDef*)GPIOH_BASE)
#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)
#define RCC_BASE (AHB1PERIPH_BASE+0x3800)
#define RCC_AHB1ENR *(unsigned int *)(RCC_BASE+0x30)
void delay(unsigned int i)
{
for(;i>0;i--);
}
/*函数功能,设置引脚为高电平
* 参数说明:GPIOx:改参数为GPIO_TypeDef类型的结构体指针,指向GPIO端口的地址
* GPIO_Pin:表示某个端口_的引脚号
*/
void GPIO_SetBits(GPIO_TypeDef *GPIOx,u16 GPIO_Pin)
{
GPIOx->BSRRL|=(1<<GPIO_Pin);
}
/*函数功能,设置引脚为低平
* 参数说明:GPIOx:改参数为GPIO_TypeDef类型的结构体指针,指向GPIO端口的地址
* GPIO_Pin:表示某个端口_的引脚号
*/
void GPIO_ResetBits(GPIO_TypeDef *GPIOx,u16 GPIO_Pin)
{
GPIOx->BSRRH|=(1<<GPIO_Pin);
}
#if 1
/*使用寄存器结构体指针的方式来操作GPIO*/
int main(void)
{
/*打开时钟*/
RCC_AHB1ENR |=(1<<7);
/*PH10先清零,再设置输出*/
GPIOH->MODER &=~(3<<(2*10));
GPIOH->MODER |= (1<<(2*10));
/*设置PH10为推挽输出*/
GPIOH->OTYPER &=~(1<<10);
/*设置PH10输出速度*/
GPIOH->OSPEEDR &=~(3<<(2*10));
GPIOH->OSPEEDR |= (2<<(2*10));
/*PH10输出低电平*/
// GPIOH->ODR &=~(1<<10);
GPIO_ResetBits(GPIOH,10);
GPIO_SetBits(GPIOH,10);
while(1);
}
#else
int main(void)
{
/*打开时钟*/
RCC_AHB1ENR |=(1<<7);
/*PH10先清零,再设置输出*/
GPIOH_MODER &=~(3<<(2*10));
GPIOH_MODER|= (1<<(2*10));
/*设置PH10为推挽输出*/
GPIOH_OTYPER &=~(1<<10);
/*设置PH10输出速度*/
GPIOH_OSPEEDR &=~(3<<(2*10));
GPIOH_OSPEEDR |= (2<<(2*10));
/*PH10输出低电平*/
//GPIOH_ODR &=~(1<<10);
while(1);
}
#endif
/*
int main (void)
{
RCC_AHB1ENR |=(1<<7);//打开GPIOH端口的时钟
//PH10
GPIOH_MODER&=~(0x03<<2*10);// 配置PH10复位
GPIOH_MODER|=(0x01<<2*10);// 配置PH10w为输出
GPIOH_OTYPER&=~(1<<10);//清空
GPIOH_OTYPER|=(0<<10);//配置PH10为推挽模式
GPIOH_OSPEEDR&=~(0x03<<2*10);//清空
GPIOH_OSPEEDR|=(0<<2*10);//配置PH10为低速
GPIOH_PUPDR&=~(0x03<<2*10);//清空
GPIOH_PUPDR|=(1<<2*10);//配置PH10为低速
// PH11
GPIOH_MODER&=~(0x03<<2*11);// 配置PH10复位
GPIOH_MODER|=(0x01<<2*11);//配置PH10w为输出
GPIOH_OTYPER&=~(1<<11);//清空
GPIOH_OTYPER|=(0<<11);//配置PH10为推挽模式
GPIOH_OSPEEDR&=~(0x03<<2*11);//清空
GPIOH_OSPEEDR|=(0<<2*11);//配置PH10为低速
GPIOH_PUPDR&=~(0x03<<2*11);//清空
GPIOH_PUPDR|=(1<<2*11);//配置PH10为上拉模式
//PH12
GPIOH_MODER&=~(0x03<<2*12);// 配置PH10复位
GPIOH_MODER|=(0x01<<2*12);//配置PH10w为输出
GPIOH_OTYPER&=~(1<<12);//清空
GPIOH_OTYPER|=(0<<12);//配置PH10为推挽模式
GPIOH_OSPEEDR&=~(0x03<<2*12);/清空
GPIOH_OSPEEDR|=(0<<2*12);//配置PH10为低速
GPIOH_PUPDR&=~(0x03<<2*12);//清空
GPIOH_PUPDR|=(1<<2*12);//配置PH10为上拉模式
//GPIOH_BSRR|=(1<<16<<10);//对PH10_BSRR的BR10配置为1进行复位,输出低电
// GPIOH_BSRR|=(1<<10);//对PH10_BSRR的BS10置位,输出高电平
//GPIOH_ODR&=~(1<<10);//配置PH10为低电平
while(1)
{
GPIOH_BSRR|=(1<<16<<10);//对PH10_BSRR的BR10配置为1进行复位,输出低电平
delay(5000000);
GPIOH_BSRR|=(1<<10);//对PH10_BSRR的BS10置位,输出高电平
delay(5000000);
GPIOH_BSRR|=(1<<16<<11);/对PH10_BSRR的BR10配置为1进行复位,输出低电平
delay(5000000);
GPIOH_BSRR|=(1<<11);//对PH10_BSRR的BS10置位,输出高电平
delay(5000000);
GPIOH_BSRR|=(1<<16<<12);//对PH10_BSRR的BR10配置为1进行复位,输出低电平
delay(5000000);
GPIOH_BSRR|=(1<<12);//对PH10_BSRR的BS10置位,输出高电平
delay(5000000);
//GPIOH_ODR|=(1<<10);//配置PH10为低电平
//delay(2500000);
//GPIOH_ODR&=~(1<<10);//配置PH10为低电平
//delay(2500000);
}
}*/
/*HSI=16Mhz*/
void SystemInit(void) /*函数为空,固件库使用*/
{
}
|
-
|