在线时间828 小时
UID3079326
注册时间2015-2-11
NXP金币12
TA的每日心情 | 郁闷 2022-4-4 11:28 |
---|
签到天数: 351 天 [LV.8]以坛为家I
金牌会员
- 积分
- 5740
- 最后登录
- 2022-4-4
|
本帖最后由 wambob 于 2017-7-18 21:58 编辑
前面学习了线程的启动。用户应用代码在中初始化,这个是用户线程的入口点。
lpc54114在入口创建了一个线程tid,线程名“init”,入口点rt_init_thread_entry,参数0,栈大小2048,最大优先级32/3,线程时间片20。
- 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做了什么
- 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();
- }
复制代码 注释掉的是SD卡初始化和文件系统初始化,接着条件编译,因为rtconfig.h头文件中定义了,所以是I2C的初始化,这个音频库和活动的板子不配套,所以需要修改外设管脚。
- void rt_hw_i2c_init(void)
- {
- rt_kprintf("install i2c1 \r\n");
- #ifdef RT_USING_I2C_BITOPS
- Chip_IOCON_PinMuxSet(LPC_IOCON, I2C_SDA_PORT, I2C_SDA_PIN, IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP);
- Chip_IOCON_PinMuxSet(LPC_IOCON, I2C_SCL_PORT, I2C_SCL_PIN, IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP);
-
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, I2C_SDA_PORT, I2C_SDA_PIN);
- Chip_GPIO_SetPinState(LPC_GPIO, I2C_SDA_PORT, I2C_SDA_PIN, 1UL);
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, I2C_SCL_PORT, I2C_SCL_PIN);
- Chip_GPIO_SetPinState(LPC_GPIO, I2C_SCL_PORT, I2C_SCL_PIN, 1UL);
-
- rt_memset((void *)&i2c_device, 0, sizeof(struct rt_i2c_bus_device));
- i2c_device.priv = (void *)&bit_ops;
- rt_i2c_bit_add_bus(&i2c_device, "i2c1");
- #else
- // Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
- // Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 26, IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
-
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 1, IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 2, IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
-
- Chip_I2C_Init(LPC_I2C0);
- Chip_I2C_SetClockDiv(LPC_I2C0, 20);
- Chip_I2CM_SetBusSpeed(LPC_I2C0, 100000);
- Chip_I2CM_Enable(LPC_I2C0);
-
- rt_memset((void *)&lpc54110_i2c1, 0, sizeof(struct rt_i2c_bus_device));
- lpc54110_i2c1.ops = &i2c1_ops;
- rt_i2c_bus_device_register(&lpc54110_i2c1, "i2c1");
- #endif
- }
复制代码 原来I2C用的管脚是0端口25、26脚,活动的板子是1端口1、2脚。
接着下面是解码器的使用i2c1这个设备进行初始化。
- rt_err_t codec_hw_init(const char * i2c_bus_device_name)
- {
- struct rt_i2c_bus_device * i2c_device;
- uint32_t ret;
-
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 21, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
- Chip_Clock_SetCLKOUTSource(SYSCON_CLKOUTSRC_MAINCLK, 1);
-
- rt_kprintf("read file page\r\n");
- ret = Chip_Clock_GetMainClockRate();
- rt_kprintf("MainClk %d ", ret);
- ret = Chip_Clock_GetSystemClockRate();
- rt_kprintf("SysClk %d \r\n", ret);
-
- rt_kprintf("codec_hw_init_begin\r\n");
- i2c_device = rt_i2c_bus_device_find(i2c_bus_device_name);
- if(i2c_device == RT_NULL)
- {
- rt_kprintf("i2c bus device %s not found!\r\n", i2c_bus_device_name);
- return -RT_ENOSYS;
- }
- codec.i2c_device = i2c_device;
-
- /* Stop auto trimming of the FRO from USB */
- //Chip_USB_TrimOff(0);
- #if Magicoe
- LPC_SYSCON->FROCTRL = LPC_SYSCON->FROCTRL & ~(SYSCON_FROCTRL_MASK | SYSCON_FROCTRL_USBCLKADJ);
- Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_FRO12MHZ);
- Chip_Clock_SetSystemPLLSource(SYSCON_PLLCLKSRC_FRO12MHZ);
- Chip_Clock_SetPLLFreq(&pll_setup_48KHz);
- //Chip_Clock_SetPLLFreq(&pllSetup);
- Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_PLLOUT);
-
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 17, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
- Chip_Clock_SetMCLKDirOutput();
- Chip_Clock_SetMCLKClockSource(SYSCON_MCLKSRC_PLL, 2);
-
- Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_3CYCLE);
- #else
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 17, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
- Chip_Clock_SetMCLKDirOutput();
- Chip_Clock_SetMCLKClockSource(SYSCON_MCLKSRC_PLL, (1*LPC54110_IIS_MUL));
- #endif
- rt_kprintf("read file page\r\n");
- ret = Chip_Clock_GetMainClockRate();
- rt_kprintf("MainClk %d ", ret);
- ret = Chip_Clock_GetSystemClockRate();
- rt_kprintf("SysClk %d \r\n", ret);
- // Initial I2C here maybe
-
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, IOCON_FUNC1 | IOCON_DIGITAL_EN); // Flexcomm 6 / SDA
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 6, IOCON_FUNC1 | IOCON_DIGITAL_EN); // Flexcomm 6 / WS
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7, IOCON_FUNC1 | IOCON_DIGITAL_EN); // Flexcomm 6 / SCK
- // Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 6, IOCON_FUNC2 | IOCON_DIGITAL_EN); // Flexcomm 7 / SCK
- // Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 7, IOCON_FUNC2 | IOCON_DIGITAL_EN); // Flexcomm 7 / SDA
- // Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 8, IOCON_FUNC2 | IOCON_DIGITAL_EN); // Flexcomm 7 / WS
-
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 12, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SCK */
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 13, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SDA */
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 14, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / WS */
-
- Chip_I2S_Init(I2S_PORT_TX, &audio_fmt_tx); // initialize I2S port
-
- Chip_Clock_SetFLEXCOMMClockSource(I2S7_FLEXCOMM, SYSCON_FLEXCOMMCLKSELSRC_PLL);
- Chip_I2S_Config(I2S_PORT_TX, &audio_fmt_tx); // configure I2S port
- Chip_I2S_FIFO_Config (I2S_PORT_TX, &audio_fmt_tx); // configure I2S FIFO
- Chip_I2S_FIFO_Control(I2S_PORT_TX, &audio_fmt_tx, I2S_FIFO_TXZ_ENABLE); // send zeros if no data is available
- Chip_I2S_FIFO_Control(I2S_PORT_TX, &audio_fmt_tx, I2S_FIFO_ENABLE); // enable FIFO
-
- // Chip_I2S_Init(I2S_PORT_RX, &audio_fmt_rx); // initialize I2S port
- // Chip_Clock_SetFLEXCOMMClockSource(I2S6_FLEXCOMM, SYSCON_FLEXCOMMCLKSELSRC_PLL);
- // Chip_I2S_Config(I2S_PORT_RX, &audio_fmt_rx); // configure I2S port
- // Chip_I2S_FIFO_Config(I2S_PORT_RX, &audio_fmt_rx); // configure I2S FIFO
- // Chip_I2S_FIFO_Control(I2S_PORT_RX, &audio_fmt_rx, I2S_FIFO_ENABLE); // enable FIFO
-
- Chip_I2S_FIFO_SetInterrupt(I2S_PORT_TX, I2S_FIFO_INT_TXERR | I2S_FIFO_INT_TXLVL); // enable tx interrupts
- // Chip_I2S_FIFO_SetInterrupt(I2S_PORT_RX, I2S_FIFO_INT_RXERR | I2S_FIFO_INT_RXLVL); // enable rx interrupts
-
- /* init codec */
- ret = wm8904_init();
- if (ret == LPC_OK) {
- //g_codec.cur_rate = DEF_SAMPLE_RATE;
- /* suspend codec after init to conserve power */
- //Codec_Suspend();
- }
-
- codec.parent.type = RT_Device_Class_Sound;
- codec.parent.rx_indicate = RT_NULL;
- codec.parent.tx_complete = RT_NULL;
- codec.parent.user_data = RT_NULL;
- codec.parent.control = codec_control;
- codec.parent.init = codec_init;
- codec.parent.open = codec_open;
- codec.parent.close = codec_close;
- codec.parent.read = RT_NULL;
- codec.parent.write = codec_write;
- /* set read_index and put index to 0 */
- codec.read_index = 0;
- codec.put_index = 0;
- // NVIC_EnableIRQ(I2S_TX_IRQNUM); // enable tx interrupt
- // Chip_I2S_Start(I2S_PORT_TX); // start tx I2S port
- // NVIC_EnableIRQ(I2S_RX_IRQNUM); // enable rx interrupt
- // Chip_I2S_Start(I2S_PORT_RX); // start rx I2S port
- /* register the device */
- return rt_device_register(&codec.parent, "snd", RT_DEVICE_FLAG_WRONLY | RT_DEVICE_FLAG_DMA_TX);
- }
复制代码 代码有点乱,一点点理解吧,需要修改是灵活通讯串口 7,需要对照自己的板子修改。
接着是
RT-Thread的命令行外壳(shell) 组件的初始化。
最后是一个demo,前面已经学习了,在里面让两个闪烁。
编译下载到板上,打开串口输出。
根据串口打印的信息是读写wm8904寄存器值信息,大家可以追溯到函数里看看什么意思。
文件系统和SD卡初始化待续...
|
|