一起学CC3200系列教程之跑马灯---寄存器版

来源:互联网 发布:淘宝买家信用积分规则 编辑:程序博客网 时间:2024/05/17 02:36

本文为原创,转载请注明:http://blog.csdn.net/hytgab?viewmode=contents
注:能力有限,有问题请联系我,可不能害了大家,MADE BY 阿汤哥,QQ1519256298   hytga@163.com
本来是写在word上的,结果不能一键复制,图片还得一个一个拖过来,不知道效果怎么样
提供PDF下点击打开链接
现在我们来学习
CC3200的跑马灯的寄存器例程。我们将学习如何把CC3200IO口设置成输出模式,实现跑马灯效果。

(一)CC3200IO口简介

(二)硬件设计

(三)软件设计

 

 

 

(一)CC3200IO口简介

学过其他单片机的人都知道,把IO口设置成输出,一般需要4个步骤

1、 开启时钟信号

2、 设置映射

3、 设置IO口的输入输出模式

4、 设置IO的电平

因此,我们将介绍4个部分涉及到的寄存器,

1、 时钟寄存器

CC3200datasheet有一个章节叫Power Reset and  Clock manage(简称PRCM)其中有一部分就是时钟的设置,PRCM有以下的寄存器


这里我们只关心


CC3200GPIO分成了4组,分别为GPIO A0 A1A2A3,其中GPIO0CLKEN寄存器就是管理A0的时钟使能问题,依次类推。

GPIO0CLKEN


这里我们可以看到有3个位可以设置,当芯片是run模式,我们就设置成0x01,睡眠模式0x10,深度睡眠0x100

2、 引脚的映射成GPIOdatasheet有一章是IO Pads and Pin Multiplexing

下面是引脚映射表的局部,表示了一个引脚能够被映射成什么功能,不同的引脚能够被映射成不同的功能,一般地有GPIOI2CUART等,需要用到什么引脚就去看这个引脚的映射表


每一个引脚都有其对应的映射配置寄存器,如上图,其映射配置寄存器就是GPIO_PAD_CONDIG_10,

映射配置寄存器:


 

根据其描述,我们设置成GPIO模式,一般可以设置成0x20

 

3、 设置成输出模式

因为CC32004GPIO,因此有4组寄存器,


每组GPIO都有以下的寄存器


其中GPIODIR就是其输出输入配置寄存器


4、 接下来就是GPIO的数据配置寄存器


这个寄存器配置起来有点麻烦,

GPIO A0 GPIODATA的地址是0x40004000,长度是0x400GPIODATA寄存器占据4个字节,那么照理来说应该是0x100GPIODATA,但是在这个0x400只有8个字节,那么是如何分配的了?

TIdatasheet给出了一张图

写例程:


读例程:


(本来是没看到上面的图的,然后按照自己的想法写了下面的内容,后面就把Ti的图给补上了)。

举例来说 GPIO A0的第0个引脚的GPIODATA寄存器的地址是


GPIO A0的第1个引脚的GPIODATA寄存器的地址是


GPIO A0的第2个引脚的GPIODATA寄存器的地址是


其他引脚以此类推,

规律就是

地址线的[9 : 2] 就是决定是哪个寄存器

[2]决定的是第0

[3]决定的是第1

[4]决定的是第2

[5]决定的是第3

[6]决定的是第4

[7]决定的是第5

[8]决定的是第6

[9]决定的是第7

刚刚好分配完。

那么应该对GPIODATA写入什么值了.

规律

多个引脚的电平 地址线[9:2] &值。

譬如:

地址线:位表示


值:位表示


运行代码

 HWREG(0x1fc) = 0x7F

结果:

GPIO 除了第0个引脚(不受影响),其他全部输出高电平。

(二)硬件设计

采用的是CC3200launchxla板子


引脚的映射配置寄存器的地址分别是


 

三个引脚是对应于GPIO的第几组内的第几个引脚?:TI给出了一张表格

 


GPIO_11 对应于 GPIO A1 的第3引脚

GPIO_10 对应于 GPIO A1 的第2引脚

GPIO_9  对应于 GPIO A1 的第1引脚

 

GPIO PORT A1的时钟地址是(0x44025000 + 0x58)这个地址我在datasheet没有看到,是在例程找到的

 

GPIO PORT A1 的寄存器基地址是 0x4000 5000

现在我们都找到了所有的寄存器地址

(三) 软件设计

 

void delay(int temp) {

    int i = 0;

    for (i = 0;i < temp;i++) {

 

    }

 

}

void main(void) {

    //初始化板子,我看了一下大概是中断向量表的映射,和其他的一些东西,这里我们不关心

    BoardInit();

    //使能GPIO A1 时钟

    HWREG(0x44025000 + 0x58) = 0x01;

 

    //设置GPIO 9的映射配置寄存器:GPIO模式

    HWREG( 0x4402E0C4) = 0x20;

    //设置GPIO 9的输入输入寄存器,输出

    HWREG(0x40005000 + 0x400) |= 0x2;

 

 

 

 

    //设置GPIO 10的映射配置寄存器:GPIO模式

    HWREG( 0x4402E0C8) = 0x20;

    //设置GPIO 10的输入输入寄存器,输出

    HWREG(0x40005000 + 0x400) |= 0x4;

 

    //设置GPIO 11的映射配置寄存器:GPIO模式

    HWREG( 0x4402E0CC) = 0x20;

    //设置GPIO 11的输入输入寄存器,输出

    HWREG(0x40005000 + 0x400) |= 0x8;

 

 

    //这里我多设置了一个GPIO,用于验证程序

    //设置GPIO 8的映射配置寄存器:GPIO模式

    HWREG( 0x4402E0C0) = 0x20;

    //设置GPIO 8的输入输入寄存器,输出

    HWREG(0x40005000 + 0x400) |= 0x1;

 

#if 1 //设置GPIO 8 输出1

    HWREG(0x40005000 + 4 ) = 1;

#else//设置GPIO 8 输出0

    HWREG(0x40005000 + 4 ) = 0;

#endif

 

    while(1)  {

#if 0//全闪,后全灭

        HWREG(0x40005000 + (16+32+8 )) = 4 + 8 + 2 ;

 

        delay(0xfffff);

        HWREG(0x40005000 +(16+32+8)) = 0;

        delay(0xfffff);

#else //跑马灯现象,闪的速度有点慢,自己调速度,

            HWREG(0x40005000 + (8)) = 2;

            delay(0xffffff);

            HWREG(0x40005000 +(8)) = 0;

            delay(0xffffff);

 

 

        HWREG(0x40005000 + (16)) = 4;

        delay(0xffffff);

        HWREG(0x40005000 +(16)) = 0;

        delay(0xffffff);

 

        HWREG(0x40005000 + (32))= 8;

        delay(0xfffffff);

        HWREG(0x40005000 +(32)) = 0;

        delay(0xffffff);

    #endif

    }

}

 

 

1 0
原创粉丝点击