打印
[资料分享与下载]

GPIO的操作

[复制链接]
1227|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roderman_z|  楼主 | 2015-10-31 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在体验了流水灯之后,打算一探其奥秘,只看参考手册和例程和纸上谈兵差不多,会运用才是硬道理。
打开光盘自带的源文件GPIO下的Demo_GPIO下的kinetis_l_demo.uvprojx工程,可以看到左边工程面板里的文件,给我的感觉似曾相识,启动文件,驱动文件,应用文件(说白了用户写的代码).

int  main (void)
{
    SystemCoreClockUpdate();
    SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
                | SIM_SCGC5_PORTB_MASK
                 | SIM_SCGC5_PORTC_MASK
                  | SIM_SCGC5_PORTD_MASK
                | SIM_SCGC5_PORTE_MASK );                                             
    uart0Init(9600,0,0,8,1);
    printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
    PORT_ENABLE_CLK(MKL_PORTB);                                       
    PORT_ENABLE_CLK(MKL_PORTD);
   
    IO_FUN_SEL(MKL_PORTB,18,1);                                       
    IO_FUN_SEL(MKL_PORTB,19,1);
   IO_FUN_SEL(MKL_PORTD,1,1);   
     
    GPIO_DDR_OUTPUT(MKL_PORTB,18);                                    
   GPIO_DDR_OUTPUT(MKL_PORTB,19);
   GPIO_DDR_OUTPUT(MKL_PORTD,1);   
   
   GPIO_SET(MKL_PORTB,18);                                            
   GPIO_SET(MKL_PORTB,19);
    GPIO_SET(MKL_PORTD,1);
   
    while(1)
{                                                      
        
       GPIO_TOGGLE(MKL_PORTB,18);
      myDelay(200);
      GPIO_TOGGLE(MKL_PORTB,19);
       myDelay(200);
     GPIO_TOGGLE(MKL_PORTD,1);
   myDelay(200);
    }   
}


相关帖子

沙发
Roderman_z|  楼主 | 2015-10-31 10:42 | 只看该作者
使用了系统模块时钟寄存器SIM_SCGC5


开发板上使用PTB18、PTB19和PTD1三个脚外接三个LED,
也就是上电后的流水灯。

要使用这三个脚,必须打开端口时钟门,
SIM_SCGC5 |= 1u<<12|1u<<10;
使用管脚,还需要配置一下功能。Pin Control Register n (PORTx_PCRn) mux=0b 001


PORTB_PCR18|= 0x00000100u;
    PORTB_PCR19|= 0x00000100u;        

   PORTD_PCR1|= 0x00000100u;
设置方向寄存器FGPIO_PDDR,也就是输入或者输出   
  
    GPIOB_PDDR |= 1U<<18;              
    GPIOB_PDDR |= 1U<<19;               
    GPIOD_PDDR |= 1U<< 1;

初始化设置寄存器FGPIO_PSOR,设置为高电平,灯熄灭

使用特权

评论回复
板凳
Roderman_z|  楼主 | 2015-10-31 10:43 | 只看该作者


    GPIOB_PSOR |= 1U<< 18;               
    GPIOB_PSOR |= 1U<< 19;
    GPIOD_PSOR |= 1U<< 1;

端口状态翻转寄存器FGPIO_PTOR
GPIOB_PTOR =1U<< 18;
        myDelay(200);
        GPIOB_PTOR =1U<< 19;
        myDelay(200);
        GPIOD_PTOR =1U<< 1;
        myDelay(200);

f6.JPG (27.71 KB, 下载次数: 0)
下载附件
2015-3-19 18:49 上传



程序中还有个延时函数myDelay()。
int  main (void)
{
    SystemCoreClockUpdate();                //系统核时钟的初始化
    SIM_SCGC5 |= 1u<<12|1u<<10;     //开启PORTB PORTD模块时钟
    uart0Init(9600,0,0,8,1);
    printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
   
    PORTB_PCR18|= 0x00000100u;
    PORTB_PCR19|= 0x00000100u;        
    PORTD_PCR1|= 0x00000100u;           //设置为复用GPIO模式
   
    FGPIOB_PSOR |= 1U<< 18;                //初始化GPIO为高电平
    FGPIOB_PSOR |= 1U<< 19;
    FGPIOD_PSOR |= 1U<< 1;               
   
    FGPIOB_PDDR |= 1U<<18;                //设置GPIO为输出
    FGPIOB_PDDR |= 1U<<19;               
    FGPIOD_PDDR |= 1U<< 1;
   
   
    while(1)
{                                                           
        FGPIOB_PTOR =1U<< 18;
        myDelay(200);
        FGPIOB_PTOR =1U<< 19;
        myDelay(200);
        FGPIOD_PTOR =1U<< 1;
        myDelay(200);
   }   
}

替换到原来的程序,编译,发送到mbed,按复位键,流水灯实现了。
看着熟悉的代码,你是否会想起点什么。

使用特权

评论回复
地板
quray1985| | 2015-10-31 16:07 | 只看该作者
这个mbed用的这么火,真得学一下

使用特权

评论回复
5
quray1985| | 2015-11-1 20:35 | 只看该作者

这样看来对GPIO的操作还是比较容易的啊

使用特权

评论回复
6
huangxz| | 2015-11-1 23:10 | 只看该作者
感觉楼主对PSOR 没有理解吧,这个不需要再 |= 了,可以直接 = 的,有效位就是1的位置的。

使用特权

评论回复
7
WAMCNCN| | 2015-11-2 09:31 | 只看该作者
huangxz 发表于 2015-11-1 23:10
感觉楼主对PSOR 没有理解吧,这个不需要再 |= 了,可以直接 = 的,有效位就是1的位置的。 ...

这不是楼主写的
你说的很对,确实不需要|=了,这是我在FSL社区第一次学习FSL的YL-k26写的,理解有点浅。

使用特权

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

本版积分规则

41

主题

354

帖子

2

粉丝