21ic电子技术开发论坛

标题: 思卡尔MAPS四色板体验 [打印本页]

作者: 西门扫雪    时间: 2015-7-20 20:23
标题: 思卡尔MAPS四色板体验
实验目标:利用遥感开关往不同方向按下时在LCD显示屏分别显示表示方向的箭头。
实验原理:
(1)GPIO:K60的I/O口具有多功能信号复用、DMA或中断触发控制以及GPIO功能。
GPIO是单片机同外围设备数据传输的通道。单片机的大部分I/O口方向寄存器来配置成为输入或者输出功能。I/O作为输入使用时,可以对输入的信号进行检测,根据输入信号的电压大小,单片机可以将相应的电压信号转化为逻辑信号。
(2)Joystick:五个按键,包括上下左右和中间的按键,中间的select按键有外部的上拉电阻,其他四个方向键可以自由配置上拉或下拉电阻。当按下按键时相应的GPIO口就能检测到按键状态。
(3)LCD:像素为320X240。
(4)FlexBus:
知识点1:GPIO配置
(1)引脚控制寄存器:PORTx_PCRn


10-8:引脚复用功能选择:可以配置为GPIO、中断或其他复用功能等,当这三位配置为001时是GPIO功能。
(2)GPIO时钟配置寄存器:SIM_SCGC5


13-9.PORTx:分别使能或禁止端口时钟;
(3)GPIO数据方向寄存器:GPIOx_PDDR


31-0.PDD:配置为0则为输入,配置为1则为输出
(4)GPIO数据输入寄存器:GPIOx_PDIR


GPIO口会将读入的数据转化为高或低电平。
实验步骤:
  1.确定原理图引脚


其中UP按键与PORTA24脚相连,RIGHT按键与PORTA26脚相连,LEFT与PORTA27脚相连,DOWN按键与PORTA25脚相连,SELECT按键与PORTA4脚相连。
2.软件部分
  (1)GPIO引脚重命名
复制
  1. kGpio_up=GPIO_MAKE_PIN(HW_GPIOA,24U),

  2. kGpio_down=GPIO_MAKE_PIN(HW_GPIOA,25U),

  3. kGpio_left=GPIO_MAKE_PIN(HW_GPIOA,27U),

  4. kGpio_right=GPIO_MAKE_PIN(HW_GPIOA,26U),

  5. kGpio_select=GPIO_MAKE_PIN(HW_GPIOA,4U),



作者: 西门扫雪    时间: 2015-7-20 20:24
(2)引脚配置
复制
  1. const gpio_input_pin_user_config_t upkey[] = {

  2. {

  3. .pinName = kGpio_up,

  4. .config.isPullEnable = true,

  5. .config.pullSelect = kPortPullUp,

  6. .config.isPassiveFilterEnabled = false,

  7. .config.interrupt = kPortIntDisabled,

  8. },

  9. // {

  10. // .pinName = GPIO_PINS_OUT_OF_RANGE,

  11. // }

  12. };

其他GPIO口如downkey、leftkey、rightkey、selectkey相同配置。

作者: 西门扫雪    时间: 2015-7-20 20:25
(3)使能端口时钟,配置方向与初始化
复制
  1. SIM_HAL_EnablePortClock(SIM_BASE, 0); //initial PORTA clock

  2. //initial upkey

  3. GPIO_DRV_SetPinDir(kGpio_up,kGpioDigitalInput); //

  4. PORT_HAL_SetMuxMode(PORTA_BASE,0x18, kPortMuxAsGpio);

  5. GPIO_DRV_InputPinInit(upkey);

其他端口类似配置


作者: 西门扫雪    时间: 2015-7-20 20:25
(4)LCD配置与初始化
复制
  1. /* Initialize standard SDK demo application pins */

  2. for (i = 0; i < HW_PORT_INSTANCE_COUNT; i++) {

  3. CLOCK_SYS_EnablePortClock(i);

  4. }

  5. lcd_flexbus_init();

  6. CLOCK_SYS_GetFreq(kFlexBusClock,&freq);

  7. LCDC_Init();




作者: 西门扫雪    时间: 2015-7-20 20:26
(5)设置指针指向图片信息,并拷贝图片数据到SDRAM中
复制
  1. for(i=0; i<320*240; i++)

  2. {

  3. p1[i] = *((uint16_t *)&gImage_ecbc[j]);;

  4. j+=2;

  5. }

  6. LCDC_Bmp(0,0,320,240,(unsigned short *)p1);




作者: 西门扫雪    时间: 2015-7-20 20:26
(6)进入主循环,获取按键的信息,分别显示对应的按键图片
复制
  1. while(1)

  2. {

  3. upkey_value=GPIO_DRV_ReadPinInput(kGpio_up);

  4. downkey_value=GPIO_DRV_ReadPinInput(kGpio_down);

  5. leftkey_value=GPIO_DRV_ReadPinInput(kGpio_left);

  6. rightkey_value=GPIO_DRV_ReadPinInput(kGpio_right);

  7. selectkey_value=GPIO_DRV_ReadPinInput(kGpio_select);

  8. //

  9. if(upkey_value == 0)

  10. {

  11. //LCDC_Init();

  12. j=0;

  13. for(i=0; i<320*240; i++)

  14. {

  15. p1[i] = *((uint16_t *)&gImage_up[j]);;

  16. j+=2;

  17. }

  18. LCDC_Bmp(0,0,320,240,(unsigned short *)p1);

  19. //for(i=0;i<10000000;i++);

  20. for(i=0;i<100;i++);

  21. //LCDC_Init();

  22. }








欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5