kw38_helloworld

kw38_helloworld

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main(void)
{
char ch;

/* Init board hardware. */
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();

PRINTF("hello world.\r\n");

while (1)
{
ch = GETCHAR();
PUTCHAR(ch);
}
}

main功能

这段代码是一个简单的hello world程序,它的作用是在终端输出”hello world.”,并且可以接收终端输入的字符并将其输出。

在main函数中,首先调用了BOARD_InitPins()函数来初始化板子的引脚,然后调用了BOARD_BootClockRUN()函数来初始化时钟,最后调用了BOARD_InitDebugConsole()函数来初始化调试控制台。

接下来,使用PRINTF函数在终端输出”hello world.”,然后进入一个死循环,不断地接收终端输入的字符并将其输出,直到程序结束。

其中,GETCHAR函数用于接收终端输入的字符,PUTCHAR函数用于将字符输出到终端。

main的函数调用

这段代码调用了三个函数,分别是BOARD_InitPins()、BOARD_BootClockRUN()和BOARD_InitDebugConsole()。

  • BOARD_InitPins()函数用于初始化板子的引脚,
  • BOARD_BootClockRUN()函数用于初始化时钟,
  • BOARD_InitDebugConsole()函数用于初始化调试控制台。

在这个程序中,这三个函数的作用是为了确保程序能够正常运行,因为程序需要使用板子的引脚、时钟和调试控制台。

main的包含头文件

这段代码include了以下几个文件:

  • fsl_device_registers.h:包含了芯片的寄存器定义,用于访问芯片的寄存器。
  • fsl_debug_console.h:包含了调试控制台的相关函数,用于在终端输出和输入字符。
  • board.h:包含了板子的相关函数和宏定义,用于初始化板子的引脚和时钟。
  • pin_mux.h:包含了引脚的配置信息,用于初始化板子的引脚。
  • stdbool.h:包含了bool类型的定义,用于定义布尔类型的变量。
  • clock_config.h:包含了时钟的配置信息,用于初始化时钟。

其中,fsl_device_registers.h、fsl_debug_console.h、board.h和pin_mux.h是MCUXpresso SDK提供的库文件,而stdbool.h和clock_config.h是标准C库文件。这些文件的作用是为了确保程序能够正常运行,因为程序需要使用芯片的寄存器、调试控制台、板子的引脚和时钟。

pin_mux.h

这是一个头文件,用于使用 MCUXpresso 配置工具为微控制器配置引脚复用和电气特性。

它提供了一个函数来初始化微控制器使用的引脚,可以在启动期间调用。 该文件定义了用于配置引脚电气特性的宏常量 SOPT5_LPUART0ODE_0b0SOPT5_LPUART0RXSRC_0b0SOPT5_LPUART0TXSRC_0b00

头文件由包含保护 (#ifndef _PIN_MUX_H_) 保护,确保它在编译单元中仅包含一次。

1
2
3
#define SOPT5_LPUART0ODE_0b0 0x00u    /*LPUART0开漏禁用*/
#define SOPT5_LPUART0RXSRC_0b0 0x00u /*LPUART0接收数据源选择:LPUART_RX pin */
#define SOPT5_LPUART0TXSRC_0b00 0x00u /*LPUART0发送数据源选择:LPUART_TX pin */

声明了两个函数:

  • void BOARD_InitPins(void); 配置引脚routing和可选引脚电气特性
  • void BOARD_InitBootPins(void); 初始化启动引脚;

pin_mux.c

void BOARD_IninPins(void)

这段代码是来自项目中的“pin_mux.c”文件,该文件包含了MKW38A512微控制器的引脚配置函数。

所选代码块是函数“BOARD_InitPins()”,它配置了LPUART0外设的引脚路由和电气特性。

具体来说,它将

  1. 使能PortC的时钟;
  2. 42号和43号引脚的引脚复用设置为LPUART0_RX和LPUART0_TX。
  3. 将LPUART0传输数据源设置为LPUART0_TX引脚,将LPUART0接收数据源设置为LPUART_RX引脚,并在LPUART0上禁用了开漏特性。

该函数由“BOARD_InitBootPins()”调用,在引导过程中调用以初始化引脚。

clock_config.c

void BOARD_BootClockRUN(void)

这段代码是MKW38A512芯片的时钟配置代码,主要包括两个函数:BOARD_BootClockRUN和BOARD_BootClockVLPR。

这两个函数分别用于配置系统在RUN模式和VLPR模式下的时钟。在这两个函数中,主要使用了MCUXpresso Config Tools提供的时钟驱动函数来配置系统时钟。具体来说,这两个函数的主要步骤如下:

  1. BOARD_RfOscInit函数:初始化射频晶振,用于提供系统时钟的参考时钟
  2. CLOCK_SetSimSafeDivs函数:设置系统时钟分频器的初始值,以确保在时钟模式切换时,核心时钟、总线时钟、flexbus时钟和flash时钟都在允许的范围内。
  3. BOARD_InitOsc0函数:初始化MCG OSC,用于提供系统时钟的参考时钟。
  4. CLOCK_BootToFeeMode函数:将MCG模式设置为FEE模式,即FLL Engaged External模式,此时FLL时钟和外部参考时钟都被使能。
  5. CLOCK_SetInternalRefClkConfig函数:配置内部参考时钟MCGIRCLK
  6. CLOCK_SetSimConfig函数:设置SIM模块的时钟配置
  7. SystemCoreClock变量:设置当前系统核心时钟的频率。

其中,BOARD_BootClockRUN函数用于配置系统在RUN模式下的时钟,而BOARD_BootClockVLPR函数用于配置系统在VLPR模式下的时钟。

在这两个函数中,主要的区别在于MCG模式的设置不同,以及时钟分频器的设置不同

  • 在RUN模式下,MCG模式被设置为FEE模式,时钟分频器的初始值为1,2,2,5,
  • 而在VLPR模式下,MCG模式被设置为BLPI模式,时钟分频器的初始值为1,5,1,

board.c

void BOARD_InitDebugConsole(void)

这段代码是初始化调试控制台的函数。在这个函数中,首先设置了LPUART0的时钟源为OSCERCLK,然后初始化了调试控制台。

调试控制台的初始化使用了MCUXpresso SDK提供的DbgConsole_Init函数,该函数需要传入调试控制台的实例、波特率、类型和时钟源频率等参数。在这个函数中,调试控制台的实例为BOARD_DEBUG_UART_INSTANCE,波特率为BOARD_DEBUG_UART_BAUDRATE,类型为BOARD_DEBUG_UART_TYPE,时钟源频率为uartClkSrcFreq。

fsl_debug_console.c

int DbgConsole_Printf(const char *formatString, …)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* See fsl_debug_console.h for documentation of this function. */
int DbgConsole_Printf(const char *formatString, ...)
{
va_list ap;
int logLength = 0, dbgResult = 0;
char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\0'};

if (NULL != g_serialHandle)
{
va_start(ap, formatString);
/* format print log first */
logLength = StrFormatPrintf(formatString, ap, printBuf, DbgConsole_PrintCallback);
/* print log */
dbgResult = DbgConsole_SendDataReliable((uint8_t *)printBuf, (size_t)logLength);

va_end(ap);
}
return dbgResult;
}

这段代码是fsl_debug_console.c文件的一部分。该文件包含了调试控制台模块的实现。调试控制台模块提供了一组函数来初始化、去初始化、打印和从调试控制台读取数据。

所选代码是DbgConsole_Printf函数的实现。该函数用于将格式化数据打印到调试控制台。

该函数接受一个格式字符串一个可变数量的参数。格式字符串指定输出字符串的格式,参数是要格式化和打印的值。

该函数首先使用StrFormatPrintf函数格式化输出字符串。该函数将格式字符串、可变参数和回调函数作为输入。回调函数用于输出格式化数据。在这种情况下,回调函数是DbgConsole_PrintCallback。

格式化输出字符串后,该函数使用DbgConsole_SendDataReliable函数将数据发送到调试控制台。该函数可靠地发送数据,这意味着它将重试发送数据,直到成功发送为止。

后缀代码包含了DbgConsole_Putchar和DbgConsole_Scanf函数的实现。DbgConsole_Putchar函数用于将单个字符打印到调试控制台。该函数只需调用DbgConsole_SendDataReliable函数并传递要打印的字符即可。

DbgConsole_Scanf函数用于从调试控制台读取格式化数据。该函数接受一个格式字符串和一个可变数量的参数。格式字符串指定输入数据的格式,参数是指向存储输入数据的变量的指针。

该函数首先使用DbgConsole_ReadLine函数读取一行输入。然后使用StrFormatScanf函数格式化输入数据,并将格式化数据存储在由参数指向的变量中。

总的来说,这些函数提供了一种方便的方式来与调试控制台交互,并打印和读取格式化数据。

关于引脚的四种输出情况

上拉 (Pull-up) 和下拉 (Pull-down) 是指在数字电路中使用电阻将输入或输出引脚连接到电源或地,以确保在没有输入信号的情况下,引脚保持在一个已知状态。具体来说,上拉是指将引脚连接到电源(通常是高电平),下拉是指将引脚连接到地(通常是低电平)。在某些情况下,还可以使用弱上拉或弱下拉,即使用较大阻值的电阻。

开漏 (Open-Drain) 和推挽 (Push-Pull) 是指输出引脚的驱动方式。开漏输出只能将引脚拉到低电平,而不能将其拉到高电平,而推挽输出可以将引脚驱动到高电平或低电平。在使用开漏输出时,还需要在输出引脚和电源之间连接一个上拉电阻,以确保输出引脚能够被拉到高电平。

开漏输出通常用于需要将多个设备连接到同一个总线上的情况,而推挽输出则更适用于需要直接驱动其他器件的情况。

作者

Gavin

发布于

2023-03-24

更新于

2023-03-24

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×