查看: 3422|回复: 0

[原创] 【LPC54114双核任务四】再探lpc54114音频库

[复制链接]
  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5785
    最后登录
    2025-5-7
    发表于 2017-7-15 22:00:39 | 显示全部楼层 |阅读模式
         真是令人汗颜,一周了,从零开始移植一点头绪也没有,只好从音频库下手了。
    首先打开C:\Users\wambob\Desktop\lpc54114audio\bsp\lpc5411x_audio下的project工程。
    无标题.jpg
    里面好多的好多红色-标记的文件,暂且不管,编译下,错误没有,警告几十个。先修改cpu
    1.jpg
    修改debug
    2.jpg
    编译后下载到开发板上,如果没打开串口,在打开串口后复位下开发板,串口打印:
    3.jpg
    貌似正常,但是这是不正常的
    进入debug后,停在主main入口,在start.c中:
    1. /* disable interrupt first */
    2.         rt_hw_interrupt_disable();

    3.         /* startup RT-Thread RTOS */
    4.         rtthread_startup();

    5.         return 0;
    复制代码
    首先关中断的,然后开始 RT-Thread的启动,最后是返回退出(永远都执行不到)。
    单步进入线程启动里。
    1. void rtthread_startup(void)
    2. {
    3.         /* initialize board */
    4.         rt_hw_board_init();

    5.         /* show version */
    6.         rt_show_version();

    7.         /* initialize tick */
    8.         rt_system_tick_init();

    9.         /* initialize kernel object */
    10.         rt_system_object_init();

    11.         /* initialize timer system */
    12.         rt_system_timer_init();

    13.   /* initialize system heap */
    14.   rt_system_heap_init(HEAP_BEGIN, HEAP_END);

    15.         /* initialize scheduler system */
    16.         rt_system_scheduler_init();

    17.         /* initialize application */
    18.         rt_application_init();

    19.   /* initialize timer thread */
    20.   rt_system_timer_thread_init();

    21.         /* initialize idle thread */
    22.         rt_thread_idle_init();

    23.         /* start scheduler */
    24.         rt_system_scheduler_start();

    25.         /* never reach here */
    26.         return ;
    27. }
    复制代码
    rt_application_init(),从字面上看,是应用的初始化。右键追溯到定义:
    1. int rt_application_init()
    2. {
    3.     rt_thread_t tid;

    4.     tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 20);
    5.     if (tid != RT_NULL)
    6.         rt_thread_startup(tid);
    7.                
    8.     return 0;
    9. }
    复制代码
    在里面定义了一个tid线程,入口是rt_init_thread_entry,右键追溯到
    1. void rt_init_thread_entry(void* parameter)
    2. {
    3.           rt_thread_delay(2);
    4.        
    5.           msd_init("sd0", "spi10");
    6.        
    7.     /* Filesystem Initialization */
    8. #if defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
    9.           /* initialize the device file system */
    10.           dfs_init();

    11.           /* initialize the elm chan FatFS file system*/
    12.           elm_init();
    13.    
    14.     /* mount sd card fat partition 1 as root directory */
    15.     if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) {
    16.         rt_kprintf("File System initialized!\n");
    17.     }
    18.     else {
    19.         rt_kprintf("File System initialzation failed!\n");
    20.     }
    21. #endif /* RT_USING_DFS && RT_USING_DFS_ELMFAT */

    22. #ifdef RT_USING_I2C
    23.     rt_i2c_core_init();
    24.     rt_hw_i2c_init();
    25. #endif

    26.     codec_hw_init("i2c1");
    27.                
    28.         /* initialization finsh shell Component */
    29.     finsh_system_init();

    30.                 demo_init();
    31. }
    复制代码
    看最后两行,一个finish shell命令行组件初始化 和 DEMO初始化,在上面的串口中没有显示和运行。注释掉部分代码剩下:
    1. void rt_init_thread_entry(void* parameter)
    2. {
    3.           rt_thread_delay(2);
    4. finsh_system_init();

    5.                 demo_init();
    6. }
    复制代码
    编译运行,串口显示出了finish shell命令提示符》:到此,RTthread才算真正运行了。
    4.jpg
    下面继续看看demo初始化里有什么
    1. int demo_init(void)
    2. {
    3.         rt_thread_t  thread1 = RT_NULL;
    4.         rt_thread_t  thread2 = RT_NULL;
    5.        
    6.        
    7.         rt_led_hw_init();
    8.        
    9.        
    10.   thread1 = rt_thread_create("t1",thread1_entry, RT_NULL,512,10,5);                             
    11.   if (thread1 != RT_NULL)                 
    12.                         rt_thread_startup(thread1);

    13.         thread2 = rt_thread_create("t2",thread2_entry, RT_NULL,512,10,5);        
    14.         if (thread2 != RT_NULL)                 
    15.                         rt_thread_startup(thread2);

    16.         return 0;
    17.        
    18. }
    复制代码
    里面定义了两个线程,然后是一个初始化:
    1. static void thread1_entry(void* parameter)                                       
    2. {
    3.     while(1)
    4.     {
    5.                         Led_Control(2,1);
    6.                         rt_thread_delay(RT_TICK_PER_SECOND);
    7.                         Led_Control(2,0);
    8.                         rt_thread_delay(RT_TICK_PER_SECOND);
    9.     }
    10. }

    11. static void thread2_entry(void* parameter)                                       
    12. {
    13.     while(1)
    14.     {
    15.                         Led_Control(1,1);
    16.                         rt_thread_delay(RT_TICK_PER_SECOND);
    17.                         Led_Control(1,0);
    18.                         rt_thread_delay(RT_TICK_PER_SECOND);
    19.     }        
    20. }
    复制代码
    两个LED灭一秒,亮一秒。
    先修改下,让我们的板上LED闪起来。
    5.jpg
    6.jpg
    在LED驱动文件中修改:
    1. static rt_err_t rt_led_init(rt_device_t dev)
    2. {
    3.         /*led2 Blue:P0.31 ,led1 Green:P0.30 ,led0 Red:P0_29  P38,P32*/
    4.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 29, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
    5.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
    6.         Chip_IOCON_PinMuxSet(LPC_IOCON, 0,  26, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
    7.        
    8.   Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 29);
    9.   Chip_GPIO_SetPinState(LPC_GPIO, 0, 29, false);
    10.        
    11.   Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0,25);
    12.   Chip_GPIO_SetPinState(LPC_GPIO, 0,25, true);

    13.   Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 26);
    14.   Chip_GPIO_SetPinState(LPC_GPIO, 0, 26, true);
    15.        
    16.         led.ctrl[0].num = 29;
    17.         led.ctrl[0].port = 0;
    18.        
    19.         led.ctrl[1].num = 25;
    20.         led.ctrl[1].port = 0;
    21.        
    22.         led.ctrl[2].num =  26;
    23.         led.ctrl[2].port = 0;

    24.         return RT_EOK;
    25.        
    26. }
    复制代码
    PIO25、26对应着板上的LD7、LD6。
    编译后运行,板上的LED 闪了起来。














    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-26 13:48 , Processed in 0.079832 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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