打印
[STM32F1]

GPIO都搞晕我了,哪错了?

[复制链接]
2228|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include "stm32f10x.h"
#define run0                 GPIO_ResetBits(GPIOA,GPIO_Pin_15);//¶¯ÐÐָʾ   ´ò¿ª
#define spwm0         GPIO_ResetBits(GPIOA,GPIO_Pin_4);//Âö³åµ÷½Ú
#define pwmon0         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//Âö³åÊä³ö´ò¿ª
#define km0                 GPIO_ResetBits(GPIOB,GPIO_Pin_7);//Ö÷½Ó´¥Æ÷ÎüºÏ

#define run1                 GPIO_SetBits(GPIOA,GPIO_Pin_15);
#define spwm1         GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define pwmon1         GPIO_SetBits(GPIOB,GPIO_Pin_5);
#define km1                 GPIO_SetBits(GPIOB,GPIO_Pin_7);
unsigned char data_GL;
unsigned char data_GY;
unsigned char data_CW;
unsigned char data_TZ;
unsigned char datacnt;
unsigned char datanet;

void GPIO_Configuration(void)        //IO³õʼ»¯
{
        GPIO_InitTypeDef GPIO_InitPAIN;
        GPIO_InitTypeDef GPIO_InitPBIN;
        GPIO_InitTypeDef GPIO_InitPAOUT;
        GPIO_InitTypeDef GPIO_InitPBOUT;
                        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
                GPIO_InitPAIN.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;                                                                                                                                                                                                                                                //Ñ¡(pin1 pll-3)/(Pin2 pll-1)/(Pin3 GL)/ËøÏ໷ƵÂÊËøÏà¹ýÁ÷ÊäÈë
                GPIO_InitPAIN.GPIO_Mode=GPIO_Mode_IPU;                                                                                        //ÉÏÀ­ÊäÈëģʽ
                GPIO_InitPAIN.GPIO_Speed=GPIO_Speed_50MHz;                                                                        //Êä³öƵÂÊ50MHz
                GPIO_Init(GPIOA,&GPIO_InitPAIN);                                                                                                //PA½Ó¿Ú³õʼ»¯
                GPIO_InitPBIN.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6;                                                                                                                                                                                                                                                //Ñ¡ÖÐ(Pin3 QD)/(PB4 TZ)/(Pin6 CW)Æô¶¯Í£Ö¹³¬ÎÂÊäÈë
                GPIO_InitPBIN.GPIO_Mode=GPIO_Mode_IPU;                                                                //ÉÏÀ­ÊäÈëģʽ
                GPIO_InitPBIN.GPIO_Speed=GPIO_Speed_50MHz;                                                //ÊäÈëģʽ¿ÉÒÔ²»Ð´
                GPIO_Init(GPIOB,&GPIO_InitPBIN);                                                                        //PB½ÓÆ·³õʼ»¯
                GPIO_InitPAOUT.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_15;                                                                                                                                                                                                                                                                                        //(pin-4pwm-set)/(PIN-15run)Âö³åµ÷Ƶ£¬¶¯ÐÐָʾÊä³ö
                GPIO_InitPAOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                        //¿ªÂ©Êä ³öģʽ
                GPIO_InitPAOUT.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOA,&GPIO_InitPAOUT);       
                GPIO_InitPBOUT.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_7;                                                                                                                                                                                                                                                                                        //(PIN_5pwm-on0/(PIN_7out-km)Âö³åÊä³ö´ò¿ª Ö÷½Ó´¥Æ÷ÎüºÏ
                GPIO_InitPBOUT.GPIO_Mode=GPIO_Mode_Out_PP;                                //¿ªÂ©Êä³öģʽ
                GPIO_InitPBOUT.GPIO_Speed=GPIO_Speed_50MHz;
                GPIO_Init(GPIOB,&GPIO_InitPBOUT);
               

}
//------------------------------------------------
void input(void)
{
        //ÅжÏÆô¶¯
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==0)
                {
                spwm0;
                        pwmon0;

                }
//ÅжÏÍ£Ö¹
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
                {
                        data_TZ=1;
                        spwm1;
                        pwmon1;
                       

                }
//Åжϳ¬ÎÂÊäÈëÐźÅ
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==0)
                {
                        data_CW=1;
                }
                //¹ýÁ÷Ðźżì²â
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==0)
                {
                        data_GL=1;

                }
}
//--------------------------------------------------
int main(void)
{
        GPIO_Configuration();//GPIO³õʼ»¯
        run1;//GPIOA p15
        spwm1;//GPIOA p4
        pwmon1;//GPIOB p5
        km1;//GPIOB p7
while(1)
{
        //input();//ÆôÍ£³¬Î¹ýÁ÷¼ì²â
        run0;
        km0;
        spwm0;
        pwmon0;
       


}

}
沙发
xiashengcheng|  楼主 | 2016-1-18 18:26 | 只看该作者
run0;这步应该会GPIO-PIN15输入低电平才对,可是为什么都没有低电平?实在是找不出来哪里错了

使用特权

评论回复
板凳
xiashengcheng|  楼主 | 2016-1-18 18:31 | 只看该作者
BOOT引脚都试过了,NRST高电平,3。3V/晶振脚有波形。。

QQ截图20160118183128.png (123.29 KB )

原理图,第一次画STM32的板子,BOOT0BOOT1己反复都试过了,高低电平也试过正常的。复位脚高电平3.3V ...

原理图,第一次画STM32的板子,BOOT0BOOT1己反复都试过了,高低电平也试过正常的。复位脚高电平3.3V ...

使用特权

评论回复
地板
airwill| | 2016-1-18 21:00 | 只看该作者
不要急, 静下心来, 仔细调试.
在调试中检查寄存器的值, 包括端口配置,  PA15 还有外设功能, 也要留意一下.

使用特权

评论回复
5
xiashengcheng|  楼主 | 2016-1-18 21:50 | 只看该作者
airwill 发表于 2016-1-18 21:00
不要急, 静下心来, 仔细调试.
在调试中检查寄存器的值, 包括端口配置,  PA15 还有外设功能, 也要留意一下. ...

可是别的GPIO也没有输出啊,值都没变化。我都要疯了

使用特权

评论回复
6
Larm1| | 2016-1-18 22:27 | 只看该作者
首先确认一下cpu有没有正常跑起来,再有将输出配置为上拉试试…

使用特权

评论回复
7
涛声依旧00| | 2016-1-19 11:08 | 只看该作者
GPIO的时钟使能了没有?

使用特权

评论回复
8
xmshao| | 2016-1-19 11:21 | 只看该作者
先不管你别的脚出不出得来,PA15默认的是调试脚 不是普通IO. 你得先关闭相关不用的调试脚。
具体是做个REMAP操作。

使用特权

评论回复
9
diweo| | 2016-1-19 15:38 | 只看该作者
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);还能行啊?

使用特权

评论回复
10
manwjh| | 2016-1-19 19:29 | 只看该作者
我自己设计的QST系统,试图简化用户对硬件的理解。这是代码,参考一下。
当然,中间加了一层封装,肯定是要占cpu效率的。

/*----------------------------------------------------------------------------*/
/*                                                                            */
/* GPIO控制                                                                   */
/*                                                                            */
/*----------------------------------------------------------------------------*/
QST_RESULT ioMode(IO_TYPE id,IO_MODE md)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_Pin = 0x01<<id%16;
    switch(md){
      case INPUT:
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        break;

      case OUTPUT:
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        break;

      case OUTOD:
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
        break;

      case FLOAT:
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        break;
    }

    if( id<16 ){
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC->APB2ENR,ENABLE);
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    }else if( id<32 ){
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC->APB2ENR,ENABLE);
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    }else if( id<48 ){
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC->APB2ENR,ENABLE);
        GPIO_Init(GPIOC, &GPIO_InitStructure);
    }else if( id<64 ){
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC->APB2ENR,ENABLE);
        GPIO_Init(GPIOD, &GPIO_InitStructure);
    }
   
    return TRUE;
}

QST_RESULT ioWrite(IO_TYPE id,IO_STATE st)
{
    void (*Process)(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
   
    if( st==LOW ){
        Process = GPIO_ResetBits;
    }else{
        Process = GPIO_SetBits;
    }
  
    if( id<16 ){
        Process(GPIOA,0x01<<id%16);
    }else if( id<32 ){
        Process(GPIOB,0x01<<id%16);
    }else if( id<48 ){
        Process(GPIOB,0x01<<id%16);
    }else if( id<64 ){
        Process(GPIOB,0x01<<id%16);
    }
   
    return TRUE;
}

IO_STATE ioRead(IO_TYPE id)
{   
    uint16_t pin = 0x01<<id%16;
    GPIO_TypeDef *port;
   
    if( id<16 ){
        port = GPIOA;
    }else if( id<32 ){
        port = GPIOB;
    }else if( id<48 ){
        port = GPIOD;
    }else if( id<64 ){
        port = GPIOD;
    }
   
    return (GPIO_ReadInputDataBit(port,pin)?HIGH:LOW);
}


=====================
.h文件相关摘录

#ifndef __QST_HW_H
#define __QST_HW_H

//---------------------------------------------------------------------------
/*
  基础返回类型定义
*/
//---------------------------------------------------------------------------
typedef enum{
  FAIL    = -1,
  UNKNOW  = 0,
  TRUE    = 1,
}QST_RESULT;


//---------------------------------------------------------------------------
/*
  定义CPU电源管理
*/
//---------------------------------------------------------------------------
typedef enum{
  PWR_SLEEP,
  POWER_OFF,
  POWER_RESET,
}PWR_CTRL_TYPE;


//---------------------------------------------------------------------------
/*
  定义引脚名称
  如果不具备的关键定义名称加"_",如"_PA15"
*/
//---------------------------------------------------------------------------

typedef enum{
  PA0 = 0,  PA1,  PA2,  PA3,  PA4,  PA5,  PA6,  PA7,
      PA8,  PA9,  PA10, PA11, PA12, PA13, PA14, PA15,

  PB0 = 16, PB1,  PB2,  PB3,  PB4,  PB5,  PB6,  PB7,
      PB8,  PB9,  PB10, PB11, PB12, PB13, PB14, PB15,

  PC0 = 32, PC1,  PC2,  PC3,  PC4,  PC5,  PC6,  PC7,
      PC8,  PC9,  PC10, PC11, PC12, PC13, PC14, PC15,

  PD0 = 48, PD1,  PD2,  PD3,  PD4,  PD5,  PD6,  PD7,
      PD8,  PD9,  PD10, PD11, PD12, PD13, PD14, PD15,

  PE0 = 64, PE1,  PE2,  PE3,  PE4,  PE5,  PE6,  PE7,
      PE8,  PE9,  PE10, PE11, PE12, PE13, PE14, PE15,
}IO_TYPE;

//---------------------------------------------------------------------------
/*
  定义引脚模式名称
*/
//---------------------------------------------------------------------------
typedef enum{
  INPUT,
  OUTPUT,
  OUTOD,
  FLOAT
}IO_MODE;

//---------------------------------------------------------------------------
/*
  定义引脚模式名称
*/
//---------------------------------------------------------------------------
typedef enum{
  LOW=0,
  HIGH=1,
}IO_STATE;


void cpuCtrl(PWR_CTRL_TYPE type);
QST_RESULT ioMode(IO_TYPE id,IO_MODE md);
QST_RESULT ioWrite(IO_TYPE id,IO_STATE st);
IO_STATE ioRead(IO_TYPE id);

使用特权

评论回复
11
manwjh| | 2016-1-19 19:33 | 只看该作者
是不是有点Arduino的味道,是的!一些接口函数名称学习了Arduino,但是否可以希望QST在仿真/调试/灵活性上要超过Arduino

#include "qst_system.h"

void setup(void)
{
        ioMode(PB0,OUTPUT);        //设定PB0为输出引脚
}

void loop(void)
{
         ioWrite(PB0,HIGH);         //控制LED亮
         msDealy(500);                 //延迟500ms
         ioWrite(PB0,LOW);         //控制LED灭
         msDealy(500);                //延迟500ms
}

使用特权

评论回复
12
gejigeji521| | 2016-1-29 13:45 | 只看该作者
慢慢试,孰能生巧

使用特权

评论回复
13
dongnanxibei| | 2016-1-30 13:26 | 只看该作者
你得先关闭相关不用的调试脚。具体是做个REMAP操作

使用特权

评论回复
14
xiashengcheng|  楼主 | 2016-6-6 18:51 | 只看该作者
搞好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

107

帖子

1

粉丝