stm32的GPIO

[复制链接]
4777|22
 楼主| 我是1514 发表于 2012-3-1 21:52 | 显示全部楼层 |阅读模式
GPIO_SetBits(GPIOB, GPIO_Pin_2);
   GPIO_ResetBits(GPIOB, GPIO_Pin_1);
      
   Delay(600000);
   Delay(600000);
   Delay(600000);

   GPIO_SetBits(GPIOB, GPIO_Pin_1);
   GPIO_ResetBits(GPIOB, GPIO_Pin_2);
     
   Delay(600000);
   Delay(600000);
   Delay(600000);
程序配置好了,可以运行,2引脚会在0和1之间跳变,但是1引脚为何保持为1,不解,求高手指点啊。我是一个菜鸟,上手了两天而已的。软件仿真图片见附件。

1.pdf

14.18 KB, 下载次数: 22

logokfu 发表于 2012-3-1 21:58 | 显示全部楼层
程序完整贴出来,时钟都初始化好了吗
Keyword 发表于 2012-3-1 21:59 | 显示全部楼层
只看这两句确实看不出来什么,楼主可以检查下对1脚的初始化设置对不对
xblei 发表于 2012-3-2 08:33 | 显示全部楼层
软件上要看看对1脚的初始化,硬件上看看1脚是否有和VCC短路。。
 楼主| 我是1514 发表于 2012-3-10 22:47 | 显示全部楼层
谢谢各位提点,解决了,不过又有一个问题出来了,望各位帮忙一下啊。
#include <stm32f10x.h>
#include "SysTickDelay.h"

void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;  //GPIO设置
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
               
}
main()
{
        SysTick_Initaize();
        GPIO_Config();
        while(1)   //控制语句
        {        GPIO_SetBits(GPIOB, GPIO_Pin_1);
                  GPIO_SetBits(GPIOB, GPIO_Pin_2);               
                delay_ms(1000);
                GPIO_ResetBits(GPIOB, GPIO_Pin_1);
                GPIO_ResetBits(GPIOB, GPIO_Pin_2);
                delay_ms(1000);

        }
}软件仿真的波形图没有问题,但是改成下面的程序后就出现问题了。
#include <stm32f10x.h>
#include "SysTickDelay.h"

void GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;  //GPIO设置
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
               
}
main()
{
        SysTick_Initaize();
        GPIO_Config();
        while(1)   //控制语句
        {        GPIO_SetBits(GPIOD, GPIO_Pin_1);
                  GPIO_SetBits(GPIOD, GPIO_Pin_2);               
                delay_ms(1000);
                GPIO_ResetBits(GPIOD, GPIO_Pin_1);
                GPIO_ResetBits(GPIOD, GPIO_Pin_2);
                delay_ms(1000);

        }
}
前后的仿真图见附件,不解啊。
 楼主| 我是1514 发表于 2012-3-10 22:57 | 显示全部楼层
图传不上来,前面的程序有波形,很合理,改了之后,portd的1引脚有正常的波形,但是PORTD第二引脚一直是低电平
logokfu 发表于 2012-3-10 23:35 | 显示全部楼层
能把systickdelay.h代码贴出来吗。
logokfu 发表于 2012-3-10 23:37 | 显示全部楼层
还有stm32f10x_it.c里面得代码也贴出来看看。
 楼主| 我是1514 发表于 2012-3-16 23:12 | 显示全部楼层
systickdelay.h源文件

#ifndef __SysTickDelay_H
#define __SysTickDelay_H

#include "stm32f10x.h"

void SysTick_Initaize(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif /* __EVAL_H */
 楼主| 我是1514 发表于 2012-3-16 23:14 | 显示全部楼层
#include "SysTickDelay.h"


#define SYSTICK_COUNTFLAG           16

static u8  fac_us=0;//us延时倍乘数
static u16 fac_ms=0;//ms延时倍乘数

//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void SysTick_Initaize(void)
        {                                                      
        SysTick->CTRL  &=                (~(SysTick_CTRL_CLKSOURCE_Msk>>1));                                //0xfffffffb;                //bit2清空,选择外部时钟  HCLK/8
       
        fac_us=(SystemCoreClock/1000000)/8;         //1us需计算的脉冲个数,其中(SystemFrequency/1000000)代表1US的脉冲个数,8是需要8分频                 
        fac_ms=(u16)fac_us*1000;           //1ms需计算的脉冲个数
        }

//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
        {                                     
        u32 temp;       
        SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
        SysTick->VAL   =  (0x00);                     /* Load the SysTick Counter Value */         //清空计数器
        SysTick->CTRL =  (SysTick_CTRL_ENABLE_Msk); /* Enable SysTick and SysTick Timer */      //开始倒数  
        do
                {
                temp=SysTick->CTRL;
                }
        while((temp&0x01)&&(!(temp&(SysTick_CTRL_COUNTFLAG_Msk))));//等待时间到达   
        SysTick->CTRL        &=  (~SysTick_CTRL_ENABLE_Msk);    //关闭计数器
        SysTick->VAL   =  (0x00);                     /* Load the SysTick Counter Value */         //清空计数器
        }   
       
       
//延时nus
//nus为要延时的us数.                                                                                      
void delay_us(u32 nus)
        {               
        u32 temp;                     
        SysTick->LOAD=nus*fac_us; //时间加载                           
        SysTick->VAL   =  (0x00);                     /* Load the SysTick Counter Value */         //清空计数器
        SysTick->CTRL = (SysTick_CTRL_ENABLE_Msk);                 /* Enable SysTick and SysTick Timer */  //开始倒数          
        do
                {
                temp=SysTick->CTRL;
                }
        while(temp&0x01&&!(temp&(SysTick_CTRL_COUNTFLAG_Msk)));//等待时间到达   
        //SysTick->CTRL        &=  (~(1<<SYSTICK_ENABLE));    //关闭计数器
        SysTick->CTRL = 0x00;
        SysTick->VAL   =  (0x00);                     /* Load the SysTick Counter Value */         //清空计数器
        }
SysTickDelay.源文件
 楼主| 我是1514 发表于 2012-3-16 23:17 | 显示全部楼层
还有就是stm32f10x_it.c里没有写什么啊,也看不到有对应的中断服务子程序啊,是不是要编程啊,我是新手,不是很懂,上面的两个文件也是拷的,大致意思明白。
logokfu 发表于 2012-3-16 23:52 | 显示全部楼层
看看是不是这个原因。
PB.jpg
PD.jpg
 楼主| 我是1514 发表于 2012-3-17 11:55 | 显示全部楼层
哦,就是说有的引脚不能简单滴当做普通的IO口去用,对吧!但是,我的开发板上PORTD的2引脚是接LED灯的,给的例程也是PORTD的2引脚的,也是简单的配置IO口,为什么就会闪烁呢?用逻辑分析仪他就一直是低电平,郁闷啊!
 楼主| 我是1514 发表于 2012-3-17 21:54 | 显示全部楼层
对了高手们,我把芯片改成103的,发现portd的2引脚有信号,我的开发板是107的,可是PD2仅仅就是一个IO端口啊,怎么会一直是低电平呢?不解啊?
logokfu 发表于 2012-3-18 00:30 | 显示全部楼层
你的开发板有原理图吗,能把关于PD2的部分发出来看看吗。
原野牧歌 发表于 2012-3-18 11:26 | 显示全部楼层
学习,关注这个……
 楼主| 我是1514 发表于 2012-3-18 12:13 | 显示全部楼层
en 有图的,上传了,高手帮忙看看吧,是神州4号的板子。

神舟IV号原理图V1.1 STM32F107_ARMJISHU.pdf

173.03 KB, 下载次数: 6

神舟IV号原理图V1.1 STM32F107_ARMJISHU.pdf

173.03 KB, 下载次数: 1

 楼主| 我是1514 发表于 2012-3-18 12:15 | 显示全部楼层
用其他的端口试了好几个都有信号,唯独PD2没有,可是PD2就是一普通的IO口啊,比如改为PD0,PD1都可以,PA1,PA2也可以,就是PD2没有,是仿真没有波形。郁闷啊
logokfu 发表于 2012-3-18 13:24 | 显示全部楼层
你的意思是过实际下载到板子上可以正常运行,软件仿真的时候没有波形,是这个意思吗。
哲哲55 发表于 2012-3-18 21:29 | 显示全部楼层
關注中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

33

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部