本帖最后由 ldptest 于 2024-12-4 16:19 编辑
MCUXpressoIDE是官方提供免费的IDE,可以很方便进行基本设置,此前一直在研究例程,这次尝试从零开始搭建工程,感受这过程带来的便捷。
先不做复杂的事,点个灯。
一、新建工程 1、下载对应的SDK,这里还可以升级旧版的SDK。已安装可以忽略这一步。 2、下载安装SDK后,在菜单或在屏幕右侧选择“Create a new C/C++ project…”。 选择开发板或MCU类型
3、官方提供丰富的组件,选择自己需要组件。 IDE会自动分配一个项目名,我这里把项目名改为new_project,并选择了ADC
如果开始考虑不周也没关系,开发过程中需要增加组件,可以通过点击项目名,选择“Manage SDK Components”进入
4、按下一步,进入项目高级设置,我选择使用PRINTF,可以通过串口printf输出过程状态 按完成,IDE会建立项目的整体框架。
打开board.c,可以看到串口输出运行信息的代码
- void BOARD_InitDebugConsole(void)
- {
- uint32_t uartClkSrcFreq;
- /* SIM_SOPT2[27:26]:
- * 00: Clock Disabled
- * 01: IRC48M
- * 10: OSCERCLK
- * 11: MCGIRCCLK
- */
- CLOCK_SetLpuart0Clock(1);
- uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;
- DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
- }
复制代码
二、GPIO设置
1、按右上角的Pins,打开Pins设置窗口
如果没找到,先打开透视图,再选择Pins
2、选择需要设置的项目
3、可视化的配置界面,方便得不要不要的
先激活Pin复用功能,我要点灯,所以选择电路板RGB灯对应的GPIO(PTD5、PTE29、PTE31)
然后设置GPIO
设置完成后,选择上部的更新源代码。吼吼,设置完成。
来,看看代码
pin_mux.c中Pin的初始化代码全部已生成
- void BOARD_InitDEBUG_UARTPins(void)
- {
- /* Port A Clock Gate Control: Clock enabled */
- CLOCK_EnableClock(kCLOCK_PortA);
- /* Port D Clock Gate Control: Clock enabled */
- CLOCK_EnableClock(kCLOCK_PortD);
- /* Port E Clock Gate Control: Clock enabled */
- CLOCK_EnableClock(kCLOCK_PortE);
- gpio_pin_config_t LED_GREEN_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 1U
- };
- /* Initialize GPIO functionality on pin PTD5 (pin 62) */
- GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_GREEN_GPIO, BOARD_INITDEBUG_UARTPINS_LED_GREEN_PIN, &LED_GREEN_config);
- gpio_pin_config_t LED_BLUE_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 1U
- };
- /* Initialize GPIO functionality on pin PTE29 (pin 17) */
- GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_BLUE_GPIO, BOARD_INITDEBUG_UARTPINS_LED_BLUE_PIN, &LED_BLUE_config);
- gpio_pin_config_t LED_RED_config = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 1U
- };
- /* Initialize GPIO functionality on pin PTE31 (pin 19) */
- GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_RED_GPIO, BOARD_INITDEBUG_UARTPINS_LED_RED_PIN, &LED_RED_config);
- /* PORTA1 (pin 23) is configured as LPUART0_RX */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, kPORT_MuxAlt2);
- /* PORTA2 (pin 24) is configured as LPUART0_TX */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, kPORT_MuxAlt2);
- /* PORTD5 (pin 62) is configured as PTD5 */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_GREEN_PORT, BOARD_INITDEBUG_UARTPINS_LED_GREEN_PIN, kPORT_MuxAsGpio);
- /* PORTE29 (pin 17) is configured as PTE29 */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_BLUE_PORT, BOARD_INITDEBUG_UARTPINS_LED_BLUE_PIN, kPORT_MuxAsGpio);
- /* PORTE30 (pin 18) is configured as ADC0_SE23 */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_ACD0_PORT, BOARD_INITDEBUG_UARTPINS_ACD0_PIN, kPORT_PinDisabledOrAnalog);
- /* PORTE31 (pin 19) is configured as PTE31 */
- PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_RED_PORT, BOARD_INITDEBUG_UARTPINS_LED_RED_PIN, kPORT_MuxAsGpio);
- SIM->SOPT5 = ((SIM->SOPT5 &
- /* Mask bits to zero which are setting */
- (~(SIM_SOPT5_LPUART0TXSRC_MASK | SIM_SOPT5_LPUART0RXSRC_MASK)))
- /* LPUART0 Transmit Data Source Select: LPUART0_TX pin. */
- | SIM_SOPT5_LPUART0TXSRC(SOPT5_LPUART0TXSRC_LPUART_TX)
- /* LPUART0 Receive Data Source Select: LPUART_RX pin. */
- | SIM_SOPT5_LPUART0RXSRC(SOPT5_LPUART0RXSRC_LPUART_RX));
- }
复制代码
三、点灯
点灯需要延时(中断方式以后再研究)
方法一:自己建立延时函数
这个比较简单自己根据时钟建立一个延时函数
- void delay_ms(uint32_t ms)
- {
- while (ms--)
- {
- for(uint32_t i=0;i<48000;i++) {} // 系统使用48Mhz
- }
- }
复制代码
方法二:官方提供一个微妙级的延时函数,同样使用循环方式进行延时
- void Delay_ms(uint32_t ms)
- {
- SDK_DelayAtLeastUs(1000 * ms, SystemCoreClock);
- }
复制代码
方法三:使用SysTick定时器,这个是使用中断方法,不容易受其他中断程序而影响延时精度。
- volatile uint32_t uwTick; // 定义一个记录Tick数的全局变量
- void SysTick_Handler(void) // 中断Handler程序
- {
- if (uwTick != 0U)
- {
- uwTick--; // 每次中断Tick数自减1
- }
- }
- void SysTick_Delay(uint32_t ms) // 延时函数主体
- {
- uwTick = ms;
- while (uwTick != 0U) // 直到Tick为0时退出
- {
- }
- }
复制代码
并且在int main(void)中初始化时加入:
- SysTick_Config(SystemCoreClock / 1000U);
复制代码
我的点灯部分程序,在int main(void)循环体中
- int i = 0 ;
- /* Enter an infinite loop, just incrementing a counter. */
- while(1) {
- i++ ;
- switch (i % 3)
- {
- case 0:
- LED_BLUE_ON();
- LED_GREEN_OFF();
- PRINTF("Turn on Blue\r\n");
- break;
- case 1:
- LED_RED_ON();
- LED_BLUE_OFF();
- PRINTF("Turn on Red\r\n");
- break;
- case 2:
- LED_GREEN_ON();
- LED_RED_OFF();
- PRINTF("Turn on Green\r\n");
- break;
- }
- SysTick_Delay(500); // 每秒更新两次
复制代码
四、效果:
|