在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币28
TA的每日心情 | 奋斗 2025-5-7 09:07 |
---|
签到天数: 353 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 5785
- 最后登录
- 2025-5-7
|
真是令人汗颜,一周了,从零开始移植一点头绪也没有,只好从音频库下手了。
首先打开C:\Users\wambob\Desktop\lpc54114audio\bsp\lpc5411x_audio下的project工程。
里面好多的好多红色-标记的文件,暂且不管,编译下,错误没有,警告几十个。先修改cpu
修改debug
编译后下载到开发板上,如果没打开串口,在打开串口后复位下开发板,串口打印:
貌似正常,但是这是不正常的进入debug后,停在主main入口,在start.c中:
- /* disable interrupt first */
- rt_hw_interrupt_disable();
- /* startup RT-Thread RTOS */
- rtthread_startup();
- return 0;
复制代码 首先关中断的,然后开始 RT-Thread的启动,最后是返回退出(永远都执行不到)。
单步进入线程启动里。
- void rtthread_startup(void)
- {
- /* initialize board */
- rt_hw_board_init();
- /* show version */
- rt_show_version();
- /* initialize tick */
- rt_system_tick_init();
- /* initialize kernel object */
- rt_system_object_init();
- /* initialize timer system */
- rt_system_timer_init();
- /* initialize system heap */
- rt_system_heap_init(HEAP_BEGIN, HEAP_END);
- /* initialize scheduler system */
- rt_system_scheduler_init();
- /* initialize application */
- rt_application_init();
- /* initialize timer thread */
- rt_system_timer_thread_init();
- /* initialize idle thread */
- rt_thread_idle_init();
- /* start scheduler */
- rt_system_scheduler_start();
- /* never reach here */
- return ;
- }
复制代码 rt_application_init(),从字面上看,是应用的初始化。右键追溯到定义:
- int rt_application_init()
- {
- rt_thread_t tid;
- tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 20);
- if (tid != RT_NULL)
- rt_thread_startup(tid);
-
- return 0;
- }
复制代码 在里面定义了一个tid线程,入口是rt_init_thread_entry,右键追溯到
- void rt_init_thread_entry(void* parameter)
- {
- rt_thread_delay(2);
-
- msd_init("sd0", "spi10");
-
- /* Filesystem Initialization */
- #if defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
- /* initialize the device file system */
- dfs_init();
- /* initialize the elm chan FatFS file system*/
- elm_init();
-
- /* mount sd card fat partition 1 as root directory */
- if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) {
- rt_kprintf("File System initialized!\n");
- }
- else {
- rt_kprintf("File System initialzation failed!\n");
- }
- #endif /* RT_USING_DFS && RT_USING_DFS_ELMFAT */
- #ifdef RT_USING_I2C
- rt_i2c_core_init();
- rt_hw_i2c_init();
- #endif
- codec_hw_init("i2c1");
-
- /* initialization finsh shell Component */
- finsh_system_init();
- demo_init();
- }
复制代码 看最后两行,一个finish shell命令行组件初始化 和 DEMO初始化,在上面的串口中没有显示和运行。注释掉部分代码剩下:
- void rt_init_thread_entry(void* parameter)
- {
- rt_thread_delay(2);
- finsh_system_init();
- demo_init();
- }
复制代码 编译运行,串口显示出了finish shell命令提示符》:到此,RTthread才算真正运行了。
下面继续看看demo初始化里有什么
- int demo_init(void)
- {
- rt_thread_t thread1 = RT_NULL;
- rt_thread_t thread2 = RT_NULL;
-
-
- rt_led_hw_init();
-
-
- thread1 = rt_thread_create("t1",thread1_entry, RT_NULL,512,10,5);
- if (thread1 != RT_NULL)
- rt_thread_startup(thread1);
- thread2 = rt_thread_create("t2",thread2_entry, RT_NULL,512,10,5);
- if (thread2 != RT_NULL)
- rt_thread_startup(thread2);
- return 0;
-
- }
复制代码 里面定义了两个线程,然后是一个初始化:
- static void thread1_entry(void* parameter)
- {
- while(1)
- {
- Led_Control(2,1);
- rt_thread_delay(RT_TICK_PER_SECOND);
- Led_Control(2,0);
- rt_thread_delay(RT_TICK_PER_SECOND);
- }
- }
- static void thread2_entry(void* parameter)
- {
- while(1)
- {
- Led_Control(1,1);
- rt_thread_delay(RT_TICK_PER_SECOND);
- Led_Control(1,0);
- rt_thread_delay(RT_TICK_PER_SECOND);
- }
- }
复制代码 两个LED灭一秒,亮一秒。
先修改下,让我们的板上LED闪起来。
在LED驱动文件中修改:
- static rt_err_t rt_led_init(rt_device_t dev)
- {
- /*led2 Blue:P0.31 ,led1 Green:P0.30 ,led0 Red:P0_29 P38,P32*/
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 29, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 26, (IOCON_FUNC0 | IOCON_MODE_PULLUP | IOCON_DIGITAL_EN));
-
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 29);
- Chip_GPIO_SetPinState(LPC_GPIO, 0, 29, false);
-
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0,25);
- Chip_GPIO_SetPinState(LPC_GPIO, 0,25, true);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 0, 26);
- Chip_GPIO_SetPinState(LPC_GPIO, 0, 26, true);
-
- led.ctrl[0].num = 29;
- led.ctrl[0].port = 0;
-
- led.ctrl[1].num = 25;
- led.ctrl[1].port = 0;
-
- led.ctrl[2].num = 26;
- led.ctrl[2].port = 0;
- return RT_EOK;
-
- }
复制代码 PIO25、26对应着板上的LD7、LD6。
编译后运行,板上的LED 闪了起来。
|
|