注册 登录
查看: 2303|回复: 11

[K60] K60学习笔记一:关于寄存器1

[复制链接]
发表于 2013-5-2 10:11:51 | 显示全部楼层 |阅读模式

文: 過期Cookie

关于飞思卡尔的Kinetis系列的CPU确实是比较复杂,而且资料是少了又少,这里飞思卡尔做的确实是比较差劲.而像NXPLPC17xx系列就做的很好,而且官方文档写的很有层次.在我看关于K60的文档时,已经屡不清.尤其是乱七八糟的寄存器.再次吐槽,飞思卡尔在这里做的很不好~~~~~

不管官方做的再怎么样,这系列芯片还是可以的.从我来说,我是学习LPC1786控制器的,转而学习飞思卡尔的K60控制器,虽说两者出至不同的公司,但是真的从学习角度来说,差别不是很大.为什么这样说呢,因为LPC1768是基于ARM Cortex-M3内核定制的,而K60处理器是基于ARMCortex-M4内核的.所以对于学习过ARM Cortex系列的开发者来说,不是很有难度.变化的只是片载资源,真正的内核的一些东西没有变化.先介绍一下K60处理器,由于K60处理器的种类比较多,我就拿我使用的来介绍.

对一个初学者来说,最关心的就是FLASH,SRAM,而不是什么看门狗,DA/AD.这里我的K60型号:MK60DN512ZVLQ10,FLASH是512kb的128KB的SRAM.所以看出,芯片可以说是很强大的了.当然,这次只是让大家学习和熟悉官方这坑爹的文档描述.

还是从点亮一个LED的小灯来熟悉吧.(注意:J-LINK输出的是3.3V的电压,不是5V!!!!)

这里,我使用的是IAR6.31+J-LINK作为调试器+ MK60DN512ZVLQ10最小系统板+山外K60的开发苦.

先来看下山外是怎么对引脚进行初始化并且对引脚输出不同的点位.

void  main(void)

{

    gpio_init (PORTD, 14, GPO, HIGH);      //初始化 PTD14 :输出高电平

    while(1)

    {

            gpio_set(PORTD, 14, HIGH);         //设置PTD14 的电平 设为 1

            time_delay_ms(1000);                //延时1s

            gpio_set(PORTD, 14, LOW);         //设置PTD14 的电平 设为  0

            time_delay_ms(1000);                //延时1s

      }

}

编译后会发现,K60的PD14引脚的LED灯会不停的闪烁.当然,山外使用了自己编写的库,其中gpio_init, gpio_set函数就是库中的函数,当然,初学者了解到这里就够了,但是,具有探索精神的我们要看看这俩函数里面发生了什么.打开山外的GPIO.C会看到这俩函数

/*************************************************************************

*                             山外嵌入式开发工作室

*

* 函数名称:gpio_init

* 功能说明:初始化gpio

* 参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)

*            n           端口引脚

*            IO          引脚方向,0=输入,1=输出

*            data        输出初始状态,0=低电平,1=高电平 (对输入无效)

* 函数返回:无

* 修改时间:2012-1-15   已测试

* 备   注:

*************************************************************************/

void gpio_init (PORTx portx, u8 n,GPIO_CFG cfg, u8 data)

{

   ASSERT( (n < 32u)  && (data < 2u) );           //使用断言检查输入、电平 是否为1bit



   //选择功能脚 PORTx_PCRx ,每个端口都有个寄存器 PORTx_PCRx

   PORT_PCR_REG(PORTX[portx], n) = (0 | PORT_PCR_MUX(1) | cfg);



   //端口方向控制输入还是输出

   if( ( (cfg & 0x01) == GPI) || (cfg == GPI_UP) ||     (cfg== GPI_UP_PF)      )

        //  最低位为0则输入   ||   输入上拉模式  ||   输入上拉,带无源滤波器

   {

        GPIO_PDDR_REG(GPIOx[portx]) &= ~(1<< n);  //设置端口方向为输入

   }

   else

   {

        GPIO_PDDR_REG(GPIOx[portx]) |= (1<< n);    //设置端口方向为输出

        if(data == 1)//output

        {

            GPIO_SET(portx, n, 1);                  //对端口输出控制,输出为1

        }

        else

        {

            GPIO_SET(portx, n, 0);                  //对端口输出控制,输出为0

        }

   }

}



/*************************************************************************

*                             山外嵌入式开发工作室

*

* 函数名称:gpio_set

* 功能说明:设置引脚状态

* 参数说明:PORTx       端口号(PORTA,PORTB,PORTC,PORTD,PORTE)

*            n           端口引脚

*            data        输出初始状态,0=低电平,1=高电平

* 函数返回:无

* 修改时间:2012-1-16   已测试

* 备   注:

*************************************************************************/

void gpio_set (PORTx portx, u8 n, u8data)

{

   ASSERT( (n < 32u)  &&(data < 2u) );           //使用断言检查输入、电平是否为1bit



   if(data == 1)               //输出

        GPIO_SET(portx, n, 1);  //GPIO_PDOR_REG(PORTx) |= (1<<n);

   else

        GPIO_SET(portx, n, 0);  //GPIO_PDOR_REG(PORTx) &= ~(1<<n);

}

看到这,我们就要接触一些底层的代码了,先看void gpio_init (PORTx portx, u8 n, GPIO_CFG cfg, u8 data) 函数.

PORT_PCR_REG(PORTX[portx],n) = (0 | PORT_PCR_MUX(1) | cfg);

这句代码说实话,我一看到就头疼,但是,翻翻文档, PORT_PCR_REG这句居然是句宏定义.位于MK60DZ10.h头文件里面.其中定义了基本的寄存器结构和地址.这里我要再次吐槽飞思卡尔的文档,说的乱七八糟的,大家可以看看周立功大叔的文档,在看看飞思卡尔的文档.一个是天上,一个是地下.这就是差距呀~~~~~~~~~~~~.

   从这个头文件中,可以看出,K60的寄存器结构和地址.直奔主题寄存器-- PORT_PCR_REG.

     #definePORT_PCR_REG(base,index)                ((base)->PCR[index])

   咦,这是什么东西.貌似是条宏定义.但是~~~~…不要着急嘛,往上翻翻,可以看到一个结构体

/**

* @addtogroup PORT_Peripheral PORT

* @{

*/



/** PORT - Peripheral registerstructure */

typedef struct PORT_MemMap

{

   uint32_t PCR[32];      /**< PinControl Register n, array offset: 0x0, array step: 0x4 */

   uint32_t GPCLR;       /**< Global Pin Control Low Register,offset: 0x80 */

   uint32_t GPCHR;      /**< Global Pin Control High Register,offset: 0x84 */

   uint8_t RESERVED_0[24];

   uint32_t ISFR;              /**< Interrupt Status Flag Register,offset: 0xA0 */

   uint8_t RESERVED_1[28];

   uint32_t DFER;            /**<Digital Filter Enable Register, offset: 0xC0 */

   uint32_t DFCR;               /**< Digital Filter ClockRegister, offset: 0xC4 */

   uint32_t DFWR;              /**< Digital Filter WidthRegister, offset: 0xC8 */

} volatile *PORT_MemMapPtr;

说实话,看到这么一大坨东西我真想打它,这里必须得看下官方的文档了. (未完)

回复

使用道具 举报

 楼主| 发表于 2013-5-2 10:14:52 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-5-2 10:36:09 | 显示全部楼层
不错哦,多研究底层,还是学得很多东西

注意:J-LINK输出的是3.3V的电压,不是5V!!!! ,这个话不对,jlink是可输出 3.3V 和 5V 的,其中 power on 命令就是控制输出 5V。看 20PIN 的管脚定义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-2 12:11:49 | 显示全部楼层
J-LINK使用的不是很多,只是测试时候V8连接最小系统板时才发现输出的3.3V
回复 支持 反对

使用道具 举报

发表于 2013-5-5 18:33:15 | 显示全部楼层
哥们,学得不错哦……我还没时间研究底层
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-6 10:58:47 | 显示全部楼层
虚竹 发表于 2013-5-5 18:33
哥们,学得不错哦……我还没时间研究底层

嗯。原来就研究研究嵌入式。不过既然山外做了库而且BUG很少,所以底层就了解一下就行。
回复 支持 反对

使用道具 举报

发表于 2013-11-22 21:40:11 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-2 10:36
不错哦,多研究底层,还是学得很多东西

注意:J-LINK输出的是3.3V的电压,不是5V!!!! ,这个话不对 ...

请问作为一个初学者,是不是把山外写的主函数和调用的一些函数看明白就行了,至于一些底成寄存器的配置有必要弄明白吗?
回复 支持 反对

使用道具 举报

发表于 2013-11-22 23:10:27 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-2 10:36
不错哦,多研究底层,还是学得很多东西

注意:J-LINK输出的是3.3V的电压,不是5V!!!! ,这个话不对 ...

新版的库什么时候发布呀,很是期待呢。
回复 支持 反对

使用道具 举报

发表于 2013-11-22 23:10:43 | 显示全部楼层
山外メ雲ジ 发表于 2013-5-2 10:36
不错哦,多研究底层,还是学得很多东西

注意:J-LINK输出的是3.3V的电压,不是5V!!!! ,这个话不对 ...

新版的库什么时候发布呀,很是期待呢。
回复 支持 反对

使用道具 举报

发表于 2013-11-22 23:12:14 | 显示全部楼层
云端的雨 发表于 2013-11-22 21:40
请问作为一个初学者,是不是把山外写的主函数和调用的一些函数看明白就行了,至于一些底成寄存器的配置有 ...

初学者的话可以先略过,但以后这些东西是要弄明白的。毕竟未来自己接手项目,诸如移植代码之类的工作,都是要对各个设备的底层架构有充足的理解。
回复 支持 反对

使用道具 举报

发表于 2013-11-24 21:29:07 | 显示全部楼层
Daniel_Lau 发表于 2013-11-22 23:12
初学者的话可以先略过,但以后这些东西是要弄明白的。毕竟未来自己接手项目,诸如移植代码之类的工作,都 ...

现在学习K60主要是用在智能车上,那些寄存器的底成配置也可以略过吗?
回复 支持 反对

使用道具 举报

发表于 2013-11-24 21:45:32 | 显示全部楼层
云端的雨 发表于 2013-11-24 21:29
现在学习K60主要是用在智能车上,那些寄存器的底成配置也可以略过吗?

到明年比赛时间还早呢,有精力可以由浅到深的学习一下。不过做智能车还是先把 控制 做好吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部