[资料分享与下载] 万利Kinetis L46开发板之GPIO

[复制链接]
1049|5
 楼主| Messi1999 发表于 2015-8-15 21:56 | 显示全部楼层 |阅读模式
无论拿到哪种芯片, 都习 惯首先看GPIO模块, 先从流水灯开始玩起, 简单不会让人产生很难的感觉,
kL46的GPIO有5个组IO口 :
  • A口
  • B口
  • C口
  • D口
  • E口
另外KL系列的还有两种GPIO,一种是普通的 GPIO,另一种是高速的 GPIO(FGPIO)。 FGPIO 是单总线周期的工作模式,FGPIO可实现1-cycle单周期执行GPIO操作, 因此用户在用软件模拟各种协议, 比如SPI或者UART等标准时, 速度更快, 操作更加容易。
今天我就KL46的普通GPIO实现软件SPI,来刷OLED。
GPIO涉及几个寄存器:
管脚控制寄存器:  Pin Control Register n (PORTx_PCRn)
我们把管脚设为GPIO,我们只需设置MUX(10~8位)配置成GPIO模式即可,如手册的说明:

[url=]只要把MUX[/url]配置成001即可把你所选择的管脚设置位GPIO,如把PORTC5设置位GPIO模式的例子是:PORTC_PCR5  = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;
还有值得提醒的是DSE位,这个位把IO口的驱动能力设置成驱动能力强模式,相对还有驱动能力弱模式,如手册的说明截图:

管脚数据输出寄存器:Port Data Direction Register ([url=]GPIOx_PDDR[/url])
这个寄存器是把管脚的状态输出,把相应管脚的GPIOx_PDDR置一就是设置管脚位输出,否则就是设为输入,如把PORTC5设置为输出的例子:GPIOC_PDDR |= (1<<5);
手册上说明如下:

管脚置位输出寄存器:Port Set Output Register (GPIOx_PSOR)
这个寄存器是控制PDORn的值,而[url=]PDORn[/url]如果是1,在管脚设置为输出时,管脚就会输出高电平,否则低电平,如手册的关于PDORn的说明:

[url=]然后用户可以通过对GPIOx_PSOR[/url]寄存器写1就是把PDORn设为1,这样管脚就会输出高电平了(在管脚设置为输出时),还有注意的是,对GPIOx_PSOR写0是不会影响PDORn寄存器的值的,这点大家要注意,手册的说明如下:

管脚清零输出寄存器:Port Clear Output Register (GPIOx_PCOR)
这个寄存器跟上面的Port Set Output Register (GPIOx_PSOR)寄存器是一样的,用户对这个寄存器写1,就是把[url=]PDORn[/url]的值写为0,这样管脚就会输出低电平。同样要注意的是对这个寄存器写0是不会影响到PDORn的值的。手册的说明如下图:

现在我来讲解我的程序的流程吧。
首先是运行执行main函数之前,会进行系统时钟初始化这些操作,把时钟倍频到48M。
这部分我前面关于时钟这里有说明,大家可以参考那个帖子:
然后就是进行OLED的初始化,源代码如下:

 楼主| Messi1999 发表于 2015-8-15 21:56 | 显示全部楼层
  1.     void LCD_Init(void)        
  2.     {
  3.             OLED_GPIO_Init();
  4.         
  5.         LCD_SCL_H;
  6.         //LCD_CS=1;
  7.         
  8.         LCD_RST_L;
  9.         LCD_DLY_ms(50);
  10.         LCD_RST_H;
  11.         

  12.       Set_Display_On_Off(0x00);       // Display Off (0x00/0x01)
  13.       Set_Display_Clock(0x80);        // Set Clock as 100 Frames/Sec
  14.       Set_Multiplex_Ratio(0x3F);        // 1/64 Duty (0x0F~0x3F)
  15.       Set_Display_Offset(0x00);       // Shift Mapping RAM Counter (0x00~0x3F)
  16.       SetStartLine(0x00);                 // Set Mapping RAM Display Start Line (0x00~0x3F)
  17.       Set_Charge_Pump(0x04);            // Enable Embedded DC/DC Converter (0x00/0x04)
  18.       SetAddressingMode(0x02);        // Set Page Addressing Mode (0x00/0x01/0x02)
  19.       Set_Segment_Remap(0x01);        // Set SEG/Column Mapping     0x00???? 0x01??
  20.       Set_Common_Remap(0x08);             // Set COM/Row Scan Direction 0x00???? 0x08??
  21.       Set_Common_Config(0x10);        // Set Sequential Configuration (0x00/0x10)
  22.       SetContrastControl(Brightness);   // Set SEG Output Current
  23.       Set_Precharge_Period(0xF1);       // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  24.       Set_VCOMH(0x40);                  // Set VCOM Deselect Level
  25.       Set_Entire_Display(0x00);       // Disable Entire Display On (0x00/0x01)
  26.       Set_Inverse_Display(0x00);        // Disable Inverse Display On (0x00/0x01)  
  27.       Set_Display_On_Off(0x01);       // Display On (0x00/0x01)
  28.       LCD_Fill(0x00);  //????
  29.       LCD_Set_Pos(0,0);
  30.         

  31.         
  32.     }
 楼主| Messi1999 发表于 2015-8-15 21:56 | 显示全部楼层
前面是GPIO的初始化,后面是设置OLED的相关显示参数。
OLED管脚的初始化源代码:
  1. void OLED_GPIO_Init(void)

  2. {

  3. //把PORTC5,PORTC7,PORTC9,PORTC11设为GPIO

  4. PORTC_PCR5 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;

  5. PORTC_PCR7 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;

  6. PORTC_PCR9 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;

  7. PORTC_PCR11 = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK;

  8. //把PORTC5,PORTC7,PORTC9,PORTC11管脚的方向设为输出

  9. GPIOC_PDDR |= (1<<5);

  10. GPIOC_PDDR |= (1<<7);

  11. GPIOC_PDDR |= (1<<9);

  12. GPIOC_PDDR |= (1<<11);

  13. //把PORTC5,PORTC7,PORTC9,PORTC11的电平初始化为高电平

  14. GPIOC_PSOR |= (1<<5);

  15. GPIOC_PSOR |= (1<<7);

  16. GPIOC_PSOR |= (1<<9);

  17. GPIOC_PSOR |= (1<<11);

  18. }
 楼主| Messi1999 发表于 2015-8-15 21:57 | 显示全部楼层
管脚的定义:
  1.     #define LCD_SCL_H       GPIOC_PSOR = (1<<5)
  2.     #define LCD_SDA_H   GPIOC_PSOR = (1<<7)
  3.     #define LCD_RST_H       GPIOC_PSOR = (1<<9)
  4.     #define LCD_DC_H        GPIOC_PSOR = (1<<11)

  5.     #define LCD_SCL_L       GPIOC_PCOR = (1<<5)
  6.     #define LCD_SDA_L   GPIOC_PCOR = (1<<7)
  7.     #define LCD_RST_L       GPIOC_PCOR = (1<<9)
  8.     #define LCD_DC_L        GPIOC_PCOR = (1<<11)
 楼主| Messi1999 发表于 2015-8-15 21:57 | 显示全部楼层
[url=]然后就是我的显示效果图:[/url]



效果还是不错滴

FSL_TICS_Jeremy 发表于 2015-8-17 08:40 | 显示全部楼层
谢谢楼主分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

363

帖子

1

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