在线时间149 小时
UID394920
注册时间2015-6-5
NXP金币24
TA的每日心情 | 开心 2018-11-17 09:58 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
金牌会员
- 积分
- 2975
- 最后登录
- 2019-10-21
|
本帖最后由 creep 于 2018-11-22 23:57 编辑
很幸运赶上了活动的末班车入手了一块LPC11U68开发板,作为一款入门级的开发板非常适合我这样刚接触NXP芯片的新手学习,感谢@NXP管管和中电港萤火工场提供给新手学习NXP芯片的机会。板子小气精致,让人看了就有想要好好学下去的感觉。
板子一到手就跟着论坛上大神分享的帖子升级了板载下载器的固件,首先升级了高大上的jlink固件,升级后可以正常的下载程序但debug的时候总是提示错误,然后就又升级了CMSIS-DAP,终于可以在线硬件调试了。
接着就在NXP在官网上下载了软件包:http://dwz.cn/pZ9bld4L
软件包里面提供了驱动和比较丰富的例子
官方的例子中为了方便就把开发板外设驱动都编译成了库文件,然后在工程中直接使用即可。但是这样在工程中想要查看一些函数的定义就还要去编译库那个工程中去找了,LIB文件中没法看到,这对新手来说多少有点不太友好,特别是你喜欢刨根问底想要看看底层寄存器怎么实现的。所以下面我们就直接使用外设库源文件建个的工程作为入门吧,待他日熟练了再直接使用编译好的外设lib文件.
因为KEIL4还支持LPC11U68,所以就使用了相对而言比较好用的KEIL4来建工程了,LPC11U68外设文件主要再下面几个文件夹里面
将上面的文件加入到工程中并包含文件头路径,然后再添加上mian.c文件,最简单的工程就完成了。
然后我们再去下载的软件包里面找个点灯的程序复制到main中,再稍加整理一下,我为了使用延时就使用SysTick中断来实现了。
从原理图中我们可以看到LPC_USART0直接接到了调试器的虚拟串口,这样我们就可以使用这个串口输出信息了。
- <font size="3">int main(void)
- {
- SystemCoreClockUpdate();
- Board_Init();
- SysTick_Config(SystemCoreClock / 1000);
- printf("hello,world\n");
- while(1)
- {
- Board_LED_Toggle(1);
- NXP_Delay(1000);
- printf("hello,world\n");
- }
- }
- </font>
复制代码 编译下载就可以看到开发板上让人亮瞎的灯在闪了,我实在没法直视这个灯所以就打开了一个绿色,是不是NXP/FSL特别喜欢用这个酷炫的三色灯大灯。
串口也会同步输出打印信息。通过一个点灯和输出信息建立一个工程模板,下面就可以细看代码学习具体的时钟外设是怎么设置怎么工作的。
接下来我们就可以学习更多的外设了,NXP的软件包里面提供了非常丰富的例子代码,
每个工程里面都提供了例子的说明和主要的函数实现代码,我们可以将上面的工程里的代码直接复制到我们上面建立的工程的main函数里面,然后编译下载后直接开发板上运行,比如下面的periph_clkout里面的代码复制main里面
- int main(void)
- {
- CHIP_SYSCTL_CLKOUTSRC_T clkoutClks;
- SystemCoreClockUpdate();
- Board_Init();
- Board_LED_Set(0, false);
- /* Enable and setup SysTick Timer at a 100Hz rate */
- SysTick_Config(SystemCoreClock / 100);
- /* WDT oscillator freq = 0.6MHz divided by 64 = 9.375khz */
- Chip_Clock_SetWDTOSC(WDTLFO_OSC_0_60, 64);
- /* Enable the power to the WDT */
- Chip_SYSCTL_PowerUp(SYSCTL_SLPWAKE_WDTOSC_PD);
- #if (CLKOUT_PIO0_1 == 1)
- /* Configure PIN0.1 for CLKOUT */
- Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 1, IOCON_FUNC1);
- #endif
- /* Cycle through all clock sources for the CLKOUT pin */
- while (1) {
- for (clkoutClks = SYSCTL_CLKOUTSRC_IRC;
- clkoutClks <= SYSCTL_CLKOUTSRC_MAINSYSCLK; clkoutClks++) {
- /* The CLKOUT source selection may hang if a clock is selected
- for CLKOUT that is not operational. */
- /* Setup CLKOUT pin for specific clock with a divider of 1 */
- Chip_Clock_SetCLKOUTSource(clkoutClks, 24);
- /* Wait 5 seconds */
- ticks100 = 0;
- while (ticks100 < 500) {
- __WFI();
- }
- }
- /* Disable CLKOUT pin by setting divider to 0 */
- Chip_Clock_SetCLKOUTSource(SYSCTL_CLKOUTSRC_MAINSYSCLK, 0);
- }
- return 0;
- }
复制代码 代码实现输出几个时钟到IO口,
- typedef enum CHIP_SYSCTL_CLKOUTSRC {
- SYSCTL_CLKOUTSRC_IRC = 0, /*!< Internal oscillator for CLKOUT */
- SYSCTL_CLKOUTSRC_MAINOSC, /*!< Main oscillator for CLKOUT */
- SYSCTL_CLKOUTSRC_SYSOSC = SYSCTL_CLKOUTSRC_MAINOSC,
- SYSCTL_CLKOUTSRC_WDTOSC, /*!< Watchdog oscillator for CLKOUT */
- SYSCTL_CLKOUTSRC_MAINSYSCLK, /*!< Main system clock for CLKOUT */
- } CHIP_SYSCTL_CLKOUTSRC_T;
复制代码 为了使用低端的逻辑分析仪看输出波形,我将时钟进行了24分频,下面48M主时钟和12M内部时钟的输出
得益官方提供了详细的代码例子,我们可以很快的上手实现简单特定的功能。通过自己建立外设源码的工程,可以根据库函数的实现来学习了解底层寄存器的具体实现过程,这样能更好的学习和解决问题。
测试代码:
periph_led.rar
(293.33 KB, 下载次数: 19)
|
|