打印
[ARM入门]

程序执行寄存器数据不发生改变

[复制链接]
1364|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiachu|  楼主 | 2013-11-19 16:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#define PINS  GPIO_PIN_6
void   SysCtlPeripheralEnable (unsigned long ulPeripheral)
{}
void GPIODirModeSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulPinIO)
{}

void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal)
{}
int main(void)
{
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能B模块
        GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);//设置为输出
        GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);//拉高
        GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);//拉低
                while(1);
}
用CCSV5查看GPIOB寄存器的数据不发生变化,这个问题弄了好几天了不知道什么问题~~按理说能拉高拉低

相关帖子

沙发
戈卫东| | 2013-11-19 17:48 | 只看该作者
MCU的IO寄存器和RAM是不同的,它会有一个输出寄存器和一个输入口,这两个的地址可能不同也可能相同.
输出寄存器是只写的,有的MCU无法读,有的可以读,要看具体情况.

使用特权

评论回复
板凳
xiachu|  楼主 | 2013-11-19 20:01 | 只看该作者
我测相应管脚电压也不发生变化  谢谢回复

使用特权

评论回复
地板
xiachu|  楼主 | 2013-11-19 20:01 | 只看该作者
戈卫东 发表于 2013-11-19 17:48
MCU的IO寄存器和RAM是不同的,它会有一个输出寄存器和一个输入口,这两个的地址可能不同也可能相同.
输出寄存 ...

我测试相应管脚的电压也不发生变化

使用特权

评论回复
5
ayb_ice| | 2013-11-20 08:27 | 只看该作者
找官方例程修改一下即可

相应时钟使能?

使用特权

评论回复
6
么么沫沫| | 2013-11-20 08:59 | 只看该作者
本帖最后由 么么沫沫 于 2013-11-20 09:15 编辑

        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能B模块
        GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);//设置为输出
        GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);//拉高
        GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);//拉低
                while(1);

这个程序我真是不明白了,程序从main函数的第一句开始执行,使能B→设置为输出→拉高 → 拉低   →  while(1),我想说的是执行到while(1)就死到这里了,不会再回去了,while条件句的判断始终为真,就会一直执行while(1)这句。怎么还会拉高拉低呢?

使用特权

评论回复
7
xiachu|  楼主 | 2013-11-20 09:41 | 只看该作者
么么沫沫 发表于 2013-11-20 08:59
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能B模块
        GPIODirModeSet(GPIO_PORTB_BA ...

谢谢你的回复。我就是单步执行  然后看GPIO寄存器数据,因为我之前测试过循环的不行。所以就把程序简化了。就三句,然后单步

使用特权

评论回复
8
xiachu|  楼主 | 2013-11-20 09:44 | 只看该作者
ayb_ice 发表于 2013-11-20 08:27
找官方例程修改一下即可

相应时钟使能?

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#define PINS GPIO_PIN_6
void delay(int d)
{
        for(;d;--d);
}
void SysCtlClockSet(unsigned long ulConfig)
{}

void   SysCtlPeripheralEnable (unsigned long ulPeripheral)
{}

void GPIODirModeSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulPinIO)
{}

void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal)
{}

int main(void)
{
        unsigned int i;

          SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//直接使用外部晶振
          SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIO的PB模块
          GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);//设置PB6输出
          for(i=0;i<10;i++)
          {
                  GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);//置PB6低电平
                  delay(20000);
                  GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);//置PB6高电平
                  delay(20000);
          }
          SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//使用PLL
          for(i=0;i<10;i++)
          {GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);
          delay(20000);
          GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);
          delay(20000);
          }

          return 0;
}
谢谢你的回复,我这样也试过 但是相应寄存器数据不变  而且管脚电压也不变。我继续寻找答案

}

使用特权

评论回复
9
xiachu|  楼主 | 2013-11-20 09:45 | 只看该作者
么么沫沫 发表于 2013-11-20 08:59
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能B模块
        GPIODirModeSet(GPIO_PORTB_BA ...

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#define PINS GPIO_PIN_6
void delay(int d)
{
        for(;d;--d);
}
void SysCtlClockSet(unsigned long ulConfig)
{}

void   SysCtlPeripheralEnable (unsigned long ulPeripheral)
{}

void GPIODirModeSet(unsigned long ulPort,unsigned char ucPins,unsigned long ulPinIO)
{}

void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal)
{}

int main(void)
{
        unsigned int i;

          SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//直接使用外部晶振
          SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIO的PB模块
          GPIODirModeSet(GPIO_PORTB_BASE,PINS,GPIO_DIR_MODE_OUT);//设置PB6输出
          for(i=0;i<10;i++)
          {
                  GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);//置PB6低电平
                  delay(20000);
                  GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);//置PB6高电平
                  delay(20000);
          }
          SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);//使用PLL
          for(i=0;i<10;i++)
          {GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);
          delay(20000);
          GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);
          delay(20000);
          }

          return 0;

}
这是之前的程序,谢谢您的回复。

使用特权

评论回复
10
ayb_ice| | 2013-11-20 09:55 | 只看该作者
while(1)
{
GPIOPinWrite(GPIO_PORTB_BASE,PINS,~PINS);
         delay(20000);
          GPIOPinWrite(GPIO_PORTB_BASE,PINS,PINS);
          delay(20000);

}

使用特权

评论回复
11
w522930954| | 2013-11-20 11:48 | 只看该作者
是不是写到只读寄存器里面去了?你的使能B模块是不是IO的复用功能?开启后就不能设置IO模式?或者是芯片型号公布一下,让datasheet来帮你把。。

使用特权

评论回复
12
xiachu|  楼主 | 2013-11-20 14:15 | 只看该作者
w522930954 发表于 2013-11-20 11:48
是不是写到只读寄存器里面去了?你的使能B模块是不是IO的复用功能?开启后就不能设置IO模式?或者是芯片型 ...

谢谢您的回复  我用的是LM3S9B92DDW  我再认真看一下。挺感动的,我是个新手,然后这么多人回复我这么幼稚的问题,这个世界真好。

使用特权

评论回复
13
xiachu|  楼主 | 2013-11-20 15:03 | 只看该作者
ayb_ice 发表于 2013-11-20 08:27
找官方例程修改一下即可

相应时钟使能?

GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6,0);

这个函数你什么都没定义,咋个可能有反应呢?
这是官方的回复,我有点看不懂

使用特权

评论回复
14
xiachu|  楼主 | 2013-11-20 16:11 | 只看该作者
谢谢各位的回复,我用HWREG(0x400FE000)=0x1;使能GPIOA  RCG2寄存器数据正确的改变了,然后TI上说是我函数没有定义,我怀疑是不是包含的头文件中,没有调用的函数的相关定义啊?我改怎么解决呢

使用特权

评论回复
15
dirtwillfly| | 2013-11-20 16:50 | 只看该作者
xiachu 发表于 2013-11-20 16:11
谢谢各位的回复,我用HWREG(0x400FE000)=0x1;使能GPIOA  RCG2寄存器数据正确的改变了,然后TI上说是我函 ...

一般GPIO相关的API都在src/gpio.c中

使用特权

评论回复
16
xiachu|  楼主 | 2013-11-20 17:31 | 只看该作者
dirtwillfly 发表于 2013-11-20 16:50
一般GPIO相关的API都在src/gpio.c中

#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
//#define HWREG(x)
void main(void)
{

        HWREG(0x400FE108)=1<<1;//使能GPIOB模块
        HWREG(0x40005400)=0x00000040;//P6为输出
               
            HWREG(0x400053FC)=0x00000040;//输出1
            HWREG(0x400053FC)=0x00000000;//输出0
            HWREG(0x400053FC)=1<<6;//输出1
            HWREG(0x400053FC)=0<<6;//输出0
            HWREG(0x400053FC)=0x1<<6;//输出1
            HWREG(0x400053FC)=0x0<<6;//输出0
            }
可以正确运行了

使用特权

评论回复
17
xiachu|  楼主 | 2013-11-20 17:41 | 只看该作者
谢谢大家的  帮助

使用特权

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

本版积分规则

27

主题

90

帖子

1

粉丝