[资料分享与下载] GPIO的操作

[复制链接]
 楼主| Roderman_z 发表于 2015-10-31 10:41 | 显示全部楼层 |阅读模式
在体验了流水灯之后,打算一探其奥秘,只看参考手册和例程和纸上谈兵差不多,会运用才是硬道理。
打开光盘自带的源文件GPIO下的Demo_GPIO下的kinetis_l_demo.uvprojx工程,可以看到左边工程面板里的文件,给我的感觉似曾相识,启动文件,驱动文件,应用文件(说白了用户写的代码).

  1. int  main (void)
  2. {
  3.     SystemCoreClockUpdate();
  4.     SIM_SCGC5 |= (SIM_SCGC5_PORTA_MASK
  5.                 | SIM_SCGC5_PORTB_MASK
  6.                  | SIM_SCGC5_PORTC_MASK
  7.                   | SIM_SCGC5_PORTD_MASK
  8.                 | SIM_SCGC5_PORTE_MASK );                                             
  9.     uart0Init(9600,0,0,8,1);
  10.     printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
  11.     PORT_ENABLE_CLK(MKL_PORTB);                                       
  12.     PORT_ENABLE_CLK(MKL_PORTD);
  13.    
  14.     IO_FUN_SEL(MKL_PORTB,18,1);                                       
  15.     IO_FUN_SEL(MKL_PORTB,19,1);
  16.    IO_FUN_SEL(MKL_PORTD,1,1);   
  17.      
  18.     GPIO_DDR_OUTPUT(MKL_PORTB,18);                                    
  19.    GPIO_DDR_OUTPUT(MKL_PORTB,19);
  20.    GPIO_DDR_OUTPUT(MKL_PORTD,1);   
  21.    
  22.    GPIO_SET(MKL_PORTB,18);                                            
  23.    GPIO_SET(MKL_PORTB,19);
  24.     GPIO_SET(MKL_PORTD,1);
  25.    
  26.     while(1)
  27. {                                                      
  28.         
  29.        GPIO_TOGGLE(MKL_PORTB,18);
  30.       myDelay(200);
  31.       GPIO_TOGGLE(MKL_PORTB,19);
  32.        myDelay(200);
  33.      GPIO_TOGGLE(MKL_PORTD,1);
  34.    myDelay(200);
  35.     }   
  36. }


 楼主| 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
  1. GPIOB_PTOR =1U<< 18;
  2.         myDelay(200);
  3.         GPIOB_PTOR =1U<< 19;
  4.         myDelay(200);
  5.         GPIOD_PTOR =1U<< 1;
  6.         myDelay(200);

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



程序中还有个延时函数myDelay()。
  1. int  main (void)
  2. {
  3.     SystemCoreClockUpdate();                //系统核时钟的初始化
  4.     SIM_SCGC5 |= 1u<<12|1u<<10;     //开启PORTB PORTD模块时钟
  5.     uart0Init(9600,0,0,8,1);
  6.     printf("YL-KL25Z128 GPIO_Blinky Test start\r\n");
  7.    
  8.     PORTB_PCR18|= 0x00000100u;
  9.     PORTB_PCR19|= 0x00000100u;        
  10.     PORTD_PCR1|= 0x00000100u;           //设置为复用GPIO模式
  11.    
  12.     FGPIOB_PSOR |= 1U<< 18;                //初始化GPIO为高电平
  13.     FGPIOB_PSOR |= 1U<< 19;
  14.     FGPIOD_PSOR |= 1U<< 1;               
  15.    
  16.     FGPIOB_PDDR |= 1U<<18;                //设置GPIO为输出
  17.     FGPIOB_PDDR |= 1U<<19;               
  18.     FGPIOD_PDDR |= 1U<< 1;
  19.    
  20.    
  21.     while(1)
  22. {                                                           
  23.         FGPIOB_PTOR =1U<< 18;
  24.         myDelay(200);
  25.         FGPIOB_PTOR =1U<< 19;
  26.         myDelay(200);
  27.         FGPIOD_PTOR =1U<< 1;
  28.         myDelay(200);
  29.    }   
  30. }

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

quray1985 发表于 2015-10-31 16:07 来自手机 | 显示全部楼层
这个mbed用的这么火,真得学一下
quray1985 发表于 2015-11-1 20:35 | 显示全部楼层

这样看来对GPIO的操作还是比较容易的啊
huangxz 发表于 2015-11-1 23:10 | 显示全部楼层
感觉楼主对PSOR 没有理解吧,这个不需要再 |= 了,可以直接 = 的,有效位就是1的位置的。
WAMCNCN 发表于 2015-11-2 09:31 | 显示全部楼层
huangxz 发表于 2015-11-1 23:10
感觉楼主对PSOR 没有理解吧,这个不需要再 |= 了,可以直接 = 的,有效位就是1的位置的。 ...

这不是楼主写的
你说的很对,确实不需要|=了,这是我在FSL社区第一次学习FSL的YL-k26写的,理解有点浅。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

41

主题

354

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部