初级会员

- 积分
- 93
- 金钱
- 93
- 注册时间
- 2015-1-22
- 在线时间
- 7 小时
|
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就可以了.
|