查看: 3915|回复: 2

[原创] 学习KS22、FRDM_K64F、MAPS_K22GPIO配置-实验一

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-7-7 23:41:56 | 显示全部楼层 |阅读模式
    本帖最后由 zhjb1 于 2016-7-8 10:34 编辑

    实验一
    如题,为了保护焊MAPS_K22和FRDM_K64F板子,试验先从自己焊的KS22板子开始[原因很简单,那板子看的就喜欢,自然不希望小车还没有动,板子就玩完了]。
    经过许多网友的帮助和鼓励,以及他们的经验:SDK2.0与以前的代码是差不多的,于是乎仔细的研究了一番,当然先从GPIO开始。实话实说,这些程序代码与前一段时间学习的KL系列的代码还是有所不同,正如前边的体会,他的层次结构是分开的。下边举例说明GPIO的学习和体会。
    SDK2.0_KS22的代码文件夹:SDK_2.0_MAPS-KS22\boards\mapsks22\driver_examples\gpio\led_output,里面的主程序就是:gpio_led_output.c,此次就从LED开始。
    前边的Include文件就不说了,接着就是定义变量:
    #define BOARD_LED_GPIO BOARD_LED_RED2_GPIO
    #define BOARD_LED_GPIO_PIN BOARD_LED_RED2_GPIO_PIN

    项目搜索,搜到这些变量的定义在:board.h里:
    #define BOARD_LED_RED2_GPIO_PORT PORTB
    #define BOARD_LED_RED2_GPIO_PIN 9U

    显然这里仅仅是声明文档,在对应的.c里,仅仅有一个宏说明。
    接着main中有GPIO_PinInit()——GPIO初始化,搜了一下,在fsl_gpio.c,代码宏一看就明白。下边开始学习理解:
    源代码初始化就不写了,我直接将PORTB和9U带入,初始化程序变为:
    GPIO_PinInit(PORTB,9U,&led_config);
    结果没有问题。
    在fsl_gpio.h中有一个模块是:GPIO_WritePinOutput(GPIO_Type *base, uint32_t pin, uint8_t output)
    写模块,很好立即拿来实验,替换GPIO_TogglePinsOutput,:
    GPIO_WritePinOutput(PORTB,9U,0);
    延时;
    GPIO_WritePinOutput(PORTB,9U,0);
    延时;
    结果很好的运行起来了。
    在尝试增加其他口时发现毫无反应,程序也无报错。于是再看了前边的初始化函数,本次仅仅解决GPIO,其他的就不看了,在pin_mux.c中有BOARD_InitPins初始化函数,看完才知道为何加其他口无效,缺少GPIO定义,于是在里面加上自己的:
        /* Enable gpio port clock */
        CLOCK_EnableClock(kCLOCK_PortC);
        /* Config the LCD IOs */
        PORT_SetPinMux(PORTC,12U,kPORT_MuxAsGpio);
        PORT_SetPinMux(PORTC,13U,kPORT_MuxAsGpio);
        PORT_SetPinMux(PORTC,14U,kPORT_MuxAsGpio);
        PORT_SetPinMux(PORTC,15U,kPORT_MuxAsGpio);

    为了统一自定义变量,LCD串口信号,分别为:
    #define res  GPIOC
    #define resPin 15U
    #define reg  GPIOC
    #define regPin 14U
    #define sda  GPIOC
    #define sdaPin 13U
    #define clk  GPIOC
    #define clkPin 12U

    为了通用,将它们直接写入到board.h中。
    程序中添加了一个ioInit()函数,里面存放定义GPIO;
    //I/O Initial
    void ioInit(void){
    gpio_pin_config_t led_config={kGPIO_DigitalOutput,0,};
    GPIO_PinInit(res,resPin,&led_config);//PTC15
    GPIO_PinInit(reg,regPin,&led_config);//PTC14
    GPIO_PinInit(clk,clkPin,&led_config);//PTC13
    GPIO_PinInit(sda,sdaPin,&led_config);//PTC12
    }

    这样我的主程序代码就统一为变量了。
    int main(void){
    /* Define the init structure for the output LED pin*/
    //gpio_pin_config_t led_config ={ kGPIO_DigitalOutput, 0,};

    /* Board pin, clock, debug console init */
    BOARD_InitPins();
    BOARD_BootClockHSRUN();
    BOARD_InitDebugConsole();
    ioInit();
    /* Print a note to terminal. */
    //PRINTF("\r\n GPIO Driver example\r\n");
    //PRINTF("\r\n The LED is taking turns to shine.\r\n");

    for(;;){
      GPIO_WritePinOutput(res,resPin,1);
      GPIO_WritePinOutput(reg,regPin,0);
      GPIO_WritePinOutput(clk,clkPin,1);
      GPIO_WritePinOutput(sda,sdaPin,0);
      delay(2000);
      GPIO_WritePinOutput(res,resPin,0);
      GPIO_WritePinOutput(reg,regPin,1);
      GPIO_WritePinOutput(clk,clkPin,0);
      GPIO_WritePinOutput(sda,sdaPin,1);
      delay(2000);
    }
    }

    当然,前边还有一个延时函数delay();
    结果是PTC15~124个口LED闪亮。
    NXP的程序对于已有经验的寄存器写者,可能开始会有点麻烦,但真正看懂了后还是不难学的。
    实际上他的程序结构可以这么理解:
    主函数只是表象定义变量;一些初始化函数定义功能和用途;有单独的宏来描述这些GPIO口或其他模块的类型或什么的;所有的操作尽量以变量进行,最后由芯片定义来解释这些。有点像用户层、底层描述、中间接口的层次结构。
    明天要走远门,10天后才回来,先扔上此文,回来立即K64F。照片是成功驱动LCD显示ASCII码。以后再贴LCD的代码。增加3张照片。这款LCD太小,找个大点的LCD放上,这次是采用4线JLINK V7下载的。并且将收到的K64F也放上,下边的K64F是在RAM下用龙丘的K60OLSD显示驱动的,在Flash下不成功——早几天前的实验。



    插针面

    插针面

    MCU面

    MCU面

    针脚面+LCD

    针脚面+LCD

    MCU面

    MCU面

    K64F加电显示

    K64F加电显示
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-11-4 08:26
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    24

    主题

    291

    帖子

    0

    高级会员

    Rank: 4

    积分
    613
    最后登录
    2020-11-21
    发表于 2016-7-8 06:58:58 | 显示全部楼层
    赞一个赞一个赞一个赞一个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2016-7-8 22:43:19 | 显示全部楼层
    楼主高手!
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 22:47 , Processed in 0.086839 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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