野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14448|回复: 3

灯怎么不亮?

[复制链接]
发表于 2017-11-20 23:58:10 | 显示全部楼层 |阅读模式
本帖最后由 莫循 于 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) /*函数为空,固件库使用*/
{
}


捕获.PNG
回复

使用道具 举报

发表于 2017-11-21 09:14:43 | 显示全部楼层
可能有些寄存器位设置错了,对比一下配套例程
回复 支持 反对

使用道具 举报

发表于 2017-11-21 10:11:15 | 显示全部楼层
我的板子怎么就没看到灯在哪里啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-21 10:14:06 | 显示全部楼层
我对比了视频例程,看了半天没看出区别,不知道哪里没配置对,只有晚上回去每个寄存器去对照。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 05:34 , Processed in 0.045074 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表