找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2053|回复: 1
打印 上一主题 下一主题
收起左侧

为什么我的STM32 B口不能设置为输出.问题出在哪里

[复制链接]
跳转到指定楼层
楼主
ID:375003 发表于 2019-3-13 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************************************************
* 文件名          : main.c
* 作者            : Losingamong
* 时间                          : 08/08/2008
* 文件描述        : 主函数
********************************************************************************/

/* 头文件    ------------------------------------------------------------------*/

#include "stm32f10x_lib.h"

//*****************************************************************
//*                               SystemTick-Register                                   
//*******************************************************************
#define SYSTICK_TENMS    (*((volatile unsigned long *)0xE000E01C))
#define SYSTICK_CURRENT  (*((volatile unsigned long *)0xE000E018))
#define SYSTICK_RELOAD   (*((volatile unsigned long *)0xE000E014))
#define SYSTICK_CSR       (*((volatile unsigned long *)0xE000E010))

void RCC_Configuration(void);
void GPIO_Configuration(void);
void Systick_Configuration(void);
void Delay_Second(void);
/****************************************************
* 函数名                 :Systick_Configuration
* 函数描述       :设置Systick定时器,重装时间为0.1秒;
* 输入参数       : 无
*****************************************************/
void Systick_Configuration(void)
{
   SYSTICK_CURRENT=0; //当前值寄存器
   SYSTICK_RELOAD=20000; //重装载寄存器,系统时钟20M中断一次1mS
   SYSTICK_CSR|=0x06;// HCLK作为Systick时钟,Systick中断使能位
}


unsigned long TimingDelay; // 延时时间,注意定义为全局变量
void SysTick_Handler(void) //中断函数
{
        extern unsigned long TimingDelay; // 延时时间,注意定义为全局变量
        SYSTICK_CURRENT=0;
        if (TimingDelay != 0x00)
        TimingDelay--;
}

void Delay(unsigned long nTime)  //延时函数
{
        SYSTICK_CSR|=0x07;   // 使能SysTick计数器
        TimingDelay = nTime; // 读取延时时间
        while(TimingDelay != 0); // 判断延时是否结束
        SYSTICK_CSR|=0x06;// 关闭SysTick计数器
}
//毫秒级的延时
void delay_ms(u16 time)
{   
   u16 i=0;  
   while(time--)
   {
      i=8000;  //自己定义8000
      while(i--) ;   
   }
}
/****************************************************
* 函数名                 : main
* 函数描述       : Main 函数
* 输入参数       : 无
* 输出结果       : 无
* 返回值         : 无
*****************************************************/

int main(void)
{

          /* 设置系统时钟 */
          RCC_Configuration();                        

          /* 设置GPIO端口 */
          GPIO_Configuration();
        Systick_Configuration();//设置定时器;
    GPIO_ResetBits(GPIOA , GPIO_Pin_8);         // PA.2输出低电平
    delay_ms(300);
        GPIO_SetBits(GPIOA , GPIO_Pin_8);                  // PA.3输出高电平
        while(1)
        {  
            GPIO_ResetBits(GPIOA , GPIO_Pin_8 );         // PA.2输出低电平
        delay_ms(50);
            GPIO_SetBits(GPIOA , GPIO_Pin_8 );                  // PA.3输出高电平        
            delay_ms(50);

            GPIO_ResetBits(GPIOB, GPIO_Pin_9);         // PB.9输出低电平,灯亮
//        Delay(50);
        delay_ms(50);
            GPIO_SetBits(GPIOB, GPIO_Pin_9);                  // PB.9输出高电平,灯灭
//            Delay(50);
        delay_ms(50);
        }

}



/*******************************************************************************
* 函数名        : RCC_Configuration
* 函数描述  : 设置系统各部分时钟
* 输入参数  : 无
* 输出结果  : 无
* 返回值    : 无
*******************************************************************************/

void RCC_Configuration(void)
{
        /* 定义枚举类型变量 HSEStartUpStatus */
        ErrorStatus HSEStartUpStatus;

          /* 复位系统时钟设置*/
          RCC_DeInit();

          /* 开启HSE*/
          RCC_HSEConfig(RCC_HSE_ON);

          /* 等待HSE起振并稳定*/
          HSEStartUpStatus = RCC_WaitForHSEStartUp();
        
        /* 判断HSE起是否振成功,是则进入if()内部 */
          if(HSEStartUpStatus == SUCCESS)
          {
            /* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
            RCC_HCLKConfig(RCC_SYSCLK_Div1);

            /* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
            RCC_PCLK2Config(RCC_HCLK_Div1);

            /* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
            RCC_PCLK1Config(RCC_HCLK_Div2);

            /* 设置FLASH延时周期数为2 */
            FLASH_SetLatency(FLASH_Latency_2);
            /* 使能FLASH预取缓存 */
            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

            /* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz */
            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

            /* 使能PLL */
            RCC_PLLCmd(ENABLE);

            /* 等待PLL输出稳定 */
            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

            /* 选择SYSCLK时钟源为PLL */
            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

            /* 等待PLL成为SYSCLK时钟源 */
            while(RCC_GetSYSCLKSource() != 0x08);
          }

          /* 打开APB2总线上的GPIOA时钟*/
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
}


/*******************************************************************************
* 函数名                  : GPIO_Configuration
* 函数描述            : 设置各GPIO端口功能
* 输入参数      : 无
* 输出结果      : 无
* 返回值        : 无
*******************************************************************************/

void GPIO_Configuration(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;
          /* 设置PA2,PA3口为推挽输出,最大翻转频率为50MHz*/
          //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
   /*设置PA8口为推挽输出,*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;//| GPIO_Pin_12;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;//开漏输出 GPIO_Mode_Out_PP;//推挽输出
          GPIO_Init(GPIOA , &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//OD开漏输出 GPIO_Mode_Out_PP;//推挽输出
          GPIO_Init(GPIOB , &GPIO_InitStructure);
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:375003 发表于 2019-3-17 20:29 | 只看该作者
问题终于解决了,是没有使能portB口时钟.
最后面设置各GPIO端口功能里面加上
RCC->APB2ENR|=1<<2;//使能PORTA口时钟
RCC->APB2ENR|=1<<3;//使能PORTB口时钟
完整程序如下:
void GPIO_Configuration(void)
{
          GPIO_InitTypeDef GPIO_InitStructure;
          RCC->APB2ENR|=1<<2;//使能PORTA口时钟
          RCC->APB2ENR|=1<<3;//使能PORTB口时钟
         /*设置PA8口为推挽输出,*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 ;//| GPIO_Pin_12;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP ;//开漏输出 GPIO_Mode_Out_PP;//推挽输出
          GPIO_Init(GPIOA , &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//OD开漏输出 GPIO_Mode_Out_PP;//推挽输出
          GPIO_Init(GPIOB , &GPIO_InitStructure);
}

希望对你有些帮助

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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