OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5545|回复: 6

初学STM32107VCT6的开发板,之前只有51单片机很简单的一点基础,大侠帮忙看下下面的程序的问题,非常感谢!!!

[复制链接]

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-1-22
在线时间
7 小时
发表于 2015-1-25 15:32:30 | 显示全部楼层 |阅读模式
5金钱
自己画了一块小板,主芯片是STM32F107VCT6的,想要实现GPIOD的PIN4-PIN7和GPIOB的PIN3-PIN4分别控制6个继电器的开启,GPIOA的PIN15控制LED灯的亮灭,程序能正常烧写,GPIOD的PIN4-PIN7能正常开启继电器,GPIOB的PIN3-PIN4的继电器不能正常开启且GPIOA的PIN15控制的灯也没反应,继电器的接法都一样,灯采用常用的接法,如下,给IO口低电平灯应该就亮了,具体程序如下:


#define  uchar unsigned char
#define uint unsigned int
#define __IO  volatile
typedef unsigned int uint32_t;
typedef __IO uint32_t   vu32;
typedef unsigned short int uint16_t;
#define GPIO_Pin_0              (uint16_t)0x0001
#define GPIO_Pin_1              (uint16_t)0x0002
#define GPIO_Pin_2              (uint16_t)0x0004
#define GPIO_Pin_3              (uint16_t)0x0008
#define GPIO_Pin_4              (uint16_t)0x0010
#define GPIO_Pin_5              (uint16_t)0x0020
#define GPIO_Pin_6              (uint16_t)0x0040
#define GPIO_Pin_7              (uint16_t)0x0080
#define GPIO_Pin_8              (uint16_t)0x0100
#define GPIO_Pin_9              (uint16_t)0x0200
#define GPIO_Pin_10              (uint16_t)0x0400
#define GPIO_Pin_11              (uint16_t)0x0800
#define GPIO_Pin_12              (uint16_t)0x1000
#define GPIO_Pin_13              (uint16_t)0x2000
#define GPIO_Pin_14              (uint16_t)0x4000
#define GPIO_Pin_15              (uint16_t)0x8000
#define GPIO_Pin_all          (uint16_t)0xFFFF

#define RCC_APB2Periph_AFIO   ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA  ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB  ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOD  ((uint32_t)0x00000020)

typedef struct
{
    __IO uint32_t CRL;
    __IO uint32_t CRH;
    __IO uint32_t IDR;
    __IO uint32_t ODR;
    __IO uint32_t BSRR;
    __IO uint32_t BRR;
    __IO uint32_t LCKR;
}GPIO_TypeDef;

typedef struct
{
    __IO uint32_t CR;
    __IO uint32_t CFGR;
    __IO uint32_t CIR;
    __IO uint32_t APB2RSTR;
    __IO uint32_t APB1RSTR;
    __IO uint32_t AHBENR;
    __IO uint32_t APB2ENR;
    __IO uint32_t APB1ENR;
    __IO uint32_t BDCR;
    __IO uint32_t CSR;
}RCC_TypeDef;

#define  PERIPH_BASE  ((uint32_t)0x40000000)
#define  APB2PERIPH_BASE  (PERIPH_BASE+0X10000)
#define  GPIOA_BASE  (APB2PERIPH_BASE+0X0800)
#define  GPIOA        ((GPIO_TypeDef*)GPIOA_BASE)

#define  PERIPH_BASE  ((uint32_t)0x40000000)
#define  APB2PERIPH_BASE  (PERIPH_BASE+0X10000)
#define  GPIOD_BASE  (APB2PERIPH_BASE+0X1400)
#define  GPIOD        ((GPIO_TypeDef*)GPIOD_BASE)

#define  PERIPH_BASE  ((uint32_t)0x40000000)
#define  APB2PERIPH_BASE  (PERIPH_BASE+0X10000)
#define  GPIOB_BASE  (APB2PERIPH_BASE+0X0C00)
#define  GPIOB        ((GPIO_TypeDef*)GPIOB_BASE)

#define  AHBPERIPH_BASE  (PERIPH_BASE+0x20000)
#define  RCC_BASE           (AHBPERIPH_BASE+0x1000)
#define  RCC               ((RCC_TypeDef*)RCC_BASE)
void delay(vu32 ncount)
{
    for(;ncount!=0;ncount--);
}
int main()
{
    RCC->APB2ENR|=RCC_APB2Periph_GPIOA;
    RCC->APB2ENR|=RCC_APB2Periph_GPIOB;
    RCC->APB2ENR|=RCC_APB2Periph_GPIOD;
    GPIOA->CRH&=0x0FFFFFFF;
    GPIOA->CRH|=0x30000000;    

    GPIOB->CRL&=0xFFF00FFF;
    GPIOB->CRL|=0x00033000;    

    GPIOD->CRL&=0x0000FFFF;
    GPIOD->CRL|=0x33330000;    
    while(1)
    {
        GPIOA->BRR=GPIO_Pin_15;
        delay(0x2fffff);

        GPIOD->BSRR=GPIO_Pin_4;               /*GPIOD的PIN4-PIN7和GPIOB的PIN3-PIN4分别控制6个继电器的开启*/
        delay(0x2fffff);
        GPIOD->BSRR=GPIO_Pin_5;
        delay(0x2fffff);
        GPIOD->BSRR=GPIO_Pin_6;
        delay(0x2fffff);
        GPIOD->BSRR=GPIO_Pin_7;
        delay(0x2fffff);

        GPIOB->BSRR=GPIO_Pin_3;
        delay(0x2fffff);
        GPIOB->BSRR=GPIO_Pin_4;
        delay(0x2fffff);

        GPIOA->BSRR=GPIO_Pin_15;
        delay(0x2fffff);

        GPIOD->BRR=GPIO_Pin_4;
        delay(0x2fffff);
        GPIOD->BRR=GPIO_Pin_5;
        delay(0x2fffff);
        GPIOD->BRR=GPIO_Pin_6;
        delay(0x2fffff);
        GPIOD->BRR=GPIO_Pin_7;
        delay(0x2fffff);
    }
}

最佳答案

查看完整内容[请看2#楼]

又是JTAG的问题. JTAG占用的IO,默认都是JTAG用,无法做普通IO使用的. 禁止JTAG就可以了.
寻找真实的自我
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-25 15:32:31 | 显示全部楼层
又是JTAG的问题.
JTAG占用的IO,默认都是JTAG用,无法做普通IO使用的.
禁止JTAG就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2015-1-25 16:32:10 | 显示全部楼层
没看你任何文字和程序。。。建议你把2.2K电阻改小一点,一般510Ω最好,,具体根据你的实际电路计算
避免犯错本是错误所在,我错故我在……
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-1-22
在线时间
7 小时
 楼主| 发表于 2015-1-25 20:35:42 | 显示全部楼层
回复【2楼】zhang164534:
---------------------------------
应该跟阻值没关系,已经换过了,这个范围内的阻值只会影响到灯的亮度,应该还是程序的问题,目前的问题是GPIOD的PIN4-PIN7控制的继电器能正常吸合,GPIOB的PIN3-PIN4的继电器不能正常吸合且GPIOA的PIN15控制的灯也没反应。六个继电器的控制电路相同,不知道是不是GPIOA和B的初始化写的有问题?
寻找真实的自我
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-1-22
在线时间
7 小时
 楼主| 发表于 2015-1-26 11:38:53 | 显示全部楼层
非常感谢站长的指导,应该通过禁用JTAG可以解决,还没有试,还处于寄存器处理的思维模式,还不会函数模块化处理,所以还不太清楚怎么改程序,目前正在模块化程序控制学习···
寻找真实的自我
回复

使用道具 举报

9

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-1-22
在线时间
7 小时
 楼主| 发表于 2015-1-26 11:51:48 | 显示全部楼层
还有一点疑问,已将IO口设置成推挽输出,怎么还会使用复用的功能呀?难道复用和JTAG是两个概念,不包含在IO的状态里?
GPIOA->CRH&=0x0FFFFFFF;
    GPIOA->CRH|=0x30000000;    

    GPIOB->CRL&=0xFFF00FFF;
    GPIOB->CRL|=0x00033000;
寻找真实的自我
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-27 00:20:22 | 显示全部楼层
回复【6楼】爱潜水的虞美人:
---------------------------------
AFIO占优,所以必须先禁止AFIO的JTAG功能。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 09:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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