注册 登录
查看: 1728|回复: 2

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

[复制链接]
发表于 2013-5-2 10:13:16 | 显示全部楼层 |阅读模式
文: 過期Cookie
uint32_tPCR[32]这个寄存器主要用于选择引脚功能的.一个引脚可能会有好多功能,比如当一个引脚是J-LINK功能,也是AD输入,和一个最基本的功能GPIO功能.当启用不同的功能时,就需要向这个寄存器的10-8位写入你想启用的功能:
10–8
MUX
引脚复用控制
相应的配置如下
000 引脚禁止(模拟)。
001 功能选择1 (GPIO).
010 功能选择2 (具体芯片不同功能).
011 功能选择3 (具体芯片不同功能).
100 功能选择4 (具体芯片不同功能).
101 功能选择5 (具体芯片不同功能).
110 功能选择6 (具体芯片不同功能).
111 功能选择7 (具体芯片不同功能/ JTAG / NMI).
当写入001时,这个对应的引脚就会配置位普通的GPIO端口使用.所以就会看到这句宏定义#definePORT_PCR_REG(base,index)                ((base)->PCR[index]) .但是,仔细看看这句宏,总感觉不对劲.BASE是什么玩意,index是干嘛的,这些疑问还得继续往下翻,会看到另外一些宏.
/* PORT - Peripheral instance baseaddresses */
/** Peripheral PORTA base pointer */
#define PORTA_BASE_PTR                          ((PORT_MemMapPtr)0x40049000u)
/** Peripheral PORTB base pointer */
#define PORTB_BASE_PTR                          ((PORT_MemMapPtr)0x4004A000u)
/** Peripheral PORTC base pointer */
#define PORTC_BASE_PTR                          ((PORT_MemMapPtr)0x4004B000u)
/** Peripheral PORTD base pointer */
#define PORTD_BASE_PTR                          ((PORT_MemMapPtr)0x4004C000u)
/** Peripheral PORTE base pointer */
#define PORTE_BASE_PTR                          ((PORT_MemMapPtr)0x4004D000u)
这些宏才是重点,它们定义了PORTA,PORTB,PORTC,PORTD的PCR, GPCLR这些寄存器的地址.大家可以看到0x40049000u地址的类型是PORT_MemMapPtr结构的指针型的.也就是说PORT_MemMapPtr里面的成员会从0x40049000u地址开始线性排布.所以0x40049000u到0x4004A000u之间,是PORTA端口的配置寄存器所在位置.好,配置寄存器就介绍到这里,当开启GPIO功能时,咱们就需要配置GPIO的电位,方向,电阻的上拉下拉等等.相同的原理,对于GPIO,仍然是使用一个结构体指针保存的.
/* GPIO - Register accessors */
#define GPIO_PDOR_REG(base)                      ((base)->PDOR)
#define GPIO_PSOR_REG(base)                      ((base)->PSOR)
#define GPIO_PCOR_REG(base)                      ((base)->PCOR)
#define GPIO_PTOR_REG(base)                      ((base)->PTOR)
#define GPIO_PDIR_REG(base)                      ((base)->PDIR)
#define GPIO_PDDR_REG(base)                      ((base)->PDDR)
从而定义PA,PB,PC,PD四个端口的地址
/* GPIO - Register instancedefinitions */
/* PTA */
#define GPIOA_PDOR                              GPIO_PDOR_REG(PTA_BASE_PTR)
#define GPIOA_PSOR                              GPIO_PSOR_REG(PTA_BASE_PTR)
#define GPIOA_PCOR                              GPIO_PCOR_REG(PTA_BASE_PTR)
#define GPIOA_PTOR                              GPIO_PTOR_REG(PTA_BASE_PTR)
#define GPIOA_PDIR                              GPIO_PDIR_REG(PTA_BASE_PTR)
#define GPIOA_PDDR                               GPIO_PDDR_REG(PTA_BASE_PTR)
/* PTB */
#define GPIOB_PDOR                              GPIO_PDOR_REG(PTB_BASE_PTR)
#define GPIOB_PSOR                              GPIO_PSOR_REG(PTB_BASE_PTR)
#define GPIOB_PCOR                               GPIO_PCOR_REG(PTB_BASE_PTR)
#define GPIOB_PTOR                              GPIO_PTOR_REG(PTB_BASE_PTR)
#define GPIOB_PDIR                              GPIO_PDIR_REG(PTB_BASE_PTR)
#define GPIOB_PDDR                              GPIO_PDDR_REG(PTB_BASE_PTR)
/* PTC */
#define GPIOC_PDOR                              GPIO_PDOR_REG(PTC_BASE_PTR)
#define GPIOC_PSOR                              GPIO_PSOR_REG(PTC_BASE_PTR)
#define GPIOC_PCOR                              GPIO_PCOR_REG(PTC_BASE_PTR)
#define GPIOC_PTOR                              GPIO_PTOR_REG(PTC_BASE_PTR)
#define GPIOC_PDIR                              GPIO_PDIR_REG(PTC_BASE_PTR)
#define GPIOC_PDDR                              GPIO_PDDR_REG(PTC_BASE_PTR)
/* PTD */
#define GPIOD_PDOR                               GPIO_PDOR_REG(PTD_BASE_PTR)
#define GPIOD_PSOR                              GPIO_PSOR_REG(PTD_BASE_PTR)
#define GPIOD_PCOR                              GPIO_PCOR_REG(PTD_BASE_PTR)
#define GPIOD_PTOR                               GPIO_PTOR_REG(PTD_BASE_PTR)
#define GPIOD_PDIR                              GPIO_PDIR_REG(PTD_BASE_PTR)
#define GPIOD_PDDR                              GPIO_PDDR_REG(PTD_BASE_PTR)
/* PTE */
#define GPIOE_PDOR                              GPIO_PDOR_REG(PTE_BASE_PTR)
#define GPIOE_PSOR                              GPIO_PSOR_REG(PTE_BASE_PTR)
#define GPIOE_PCOR                              GPIO_PCOR_REG(PTE_BASE_PTR)
#define GPIOE_PTOR                              GPIO_PTOR_REG(PTE_BASE_PTR)
#define GPIOE_PDIR                               GPIO_PDIR_REG(PTE_BASE_PTR)
#define GPIOE_PDDR                              GPIO_PDDR_REG(PTE_BASE_PTR)
这个我就不解释了,我看的头大了,现在从底层让一个引脚输出高电位.
void main(void)
{
   
   PORT_PCR_REG(PORTD_BASE_PTR, 14)=0x100;
   GPIO_PDDR_REG(PTD_BASE_PTR) |= (1 << 14);    //设置端口方向为输出
   GPIOD_PDOR&=(0 << 14);
   while(1)
   {
            GPIOD_PDOR&=(0 << 14);
            time_delay_ms(1000);                //延时1s
           GPIOD_PDOR|=(1 << 14);
            time_delay_ms(1000);                //延时1s
   }
}
下载到K60中会发现PD14接口的LED会闪烁,从代码上来看,
           PORT_PCR_REG(PORTD_BASE_PTR,14)=0x100;
这句代码说明了PD14引脚的功能时GPIO功能.大家记得前面的PCR寄存器的定义吧,其中位8-10是选择功能.其中001是GPIO功能.那好,咱们展开0x100=0001,0000,0000b.其中第10-8位是001,所以选择的是第一种功能.注意,此处的1是第8位,计算机是从0位开始计算的.
GPIO_PDDR_REG(PTD_BASE_PTR) |= (1<< 14);    //设置端口方向为输出
GPIOD_PDOR&=(0<< 14);
这两句是定义GPIO的方向和输出数据,相信我不解释,大家也可以看明白了吧.
   后记:就写到这里了,对于K60我也是新接触的,不过希望新手们少走弯路.嘿嘿,我的QQ954059307,欢迎大家与我交流讨论.
回复

使用道具 举报

发表于 2013-5-2 10:37:41 | 显示全部楼层
呵呵,建议多加点空行,不然很多人 看到 一堆东西,会头晕
回复 支持 反对

使用道具 举报

发表于 2015-7-18 16:48:54 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

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

本版积分规则

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