打印

stm32的GPIO

[复制链接]
3893|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

沙发
logokfu| | 2012-3-1 21:58 | 只看该作者
程序完整贴出来,时钟都初始化好了吗

使用特权

评论回复
板凳
Keyword| | 2012-3-1 21:59 | 只看该作者
只看这两句确实看不出来什么,楼主可以检查下对1脚的初始化设置对不对

使用特权

评论回复
地板
xblei| | 2012-3-2 08:33 | 只看该作者
软件上要看看对1脚的初始化,硬件上看看1脚是否有和VCC短路。。

使用特权

评论回复
5
我是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);

        }
}
前后的仿真图见附件,不解啊。

使用特权

评论回复
6
我是1514|  楼主 | 2012-3-10 22:57 | 只看该作者
图传不上来,前面的程序有波形,很合理,改了之后,portd的1引脚有正常的波形,但是PORTD第二引脚一直是低电平

使用特权

评论回复
7
logokfu| | 2012-3-10 23:35 | 只看该作者
能把systickdelay.h代码贴出来吗。

使用特权

评论回复
8
logokfu| | 2012-3-10 23:37 | 只看该作者
还有stm32f10x_it.c里面得代码也贴出来看看。

使用特权

评论回复
9
我是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 */

使用特权

评论回复
10
我是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.源文件

使用特权

评论回复
11
我是1514|  楼主 | 2012-3-16 23:17 | 只看该作者
还有就是stm32f10x_it.c里没有写什么啊,也看不到有对应的中断服务子程序啊,是不是要编程啊,我是新手,不是很懂,上面的两个文件也是拷的,大致意思明白。

使用特权

评论回复
12
logokfu| | 2012-3-16 23:52 | 只看该作者
看看是不是这个原因。

使用特权

评论回复
13
我是1514|  楼主 | 2012-3-17 11:55 | 只看该作者
哦,就是说有的引脚不能简单滴当做普通的IO口去用,对吧!但是,我的开发板上PORTD的2引脚是接LED灯的,给的例程也是PORTD的2引脚的,也是简单的配置IO口,为什么就会闪烁呢?用逻辑分析仪他就一直是低电平,郁闷啊!

使用特权

评论回复
14
我是1514|  楼主 | 2012-3-17 21:54 | 只看该作者
对了高手们,我把芯片改成103的,发现portd的2引脚有信号,我的开发板是107的,可是PD2仅仅就是一个IO端口啊,怎么会一直是低电平呢?不解啊?

使用特权

评论回复
15
logokfu| | 2012-3-18 00:30 | 只看该作者
你的开发板有原理图吗,能把关于PD2的部分发出来看看吗。

使用特权

评论回复
16
原野牧歌| | 2012-3-18 11:26 | 只看该作者
学习,关注这个……

使用特权

评论回复
17
我是1514|  楼主 | 2012-3-18 12:13 | 只看该作者
en 有图的,上传了,高手帮忙看看吧,是神州4号的板子。

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

173.03 KB

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

173.03 KB

使用特权

评论回复
18
我是1514|  楼主 | 2012-3-18 12:15 | 只看该作者
用其他的端口试了好几个都有信号,唯独PD2没有,可是PD2就是一普通的IO口啊,比如改为PD0,PD1都可以,PA1,PA2也可以,就是PD2没有,是仿真没有波形。郁闷啊

使用特权

评论回复
19
logokfu| | 2012-3-18 13:24 | 只看该作者
你的意思是过实际下载到板子上可以正常运行,软件仿真的时候没有波形,是这个意思吗。

使用特权

评论回复
20
哲哲55| | 2012-3-18 21:29 | 只看该作者
關注中

使用特权

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

本版积分规则

0

主题

33

帖子

1

粉丝