请选择 进入手机版 | 继续访问电脑版
查看: 268|回复: 0

[原创] 【MCXC444分享】2、MCUXpressoIDE下建新项目及使用SysTick定时器

[复制链接]
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 730 天

    [LV.9]以坛为家II

    12

    主题

    3619

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6150
    最后登录
    2024-12-13
    发表于 2024-11-14 17:11:43 | 显示全部楼层 |阅读模式
    本帖最后由 ldptest 于 2024-12-4 16:19 编辑

    MCUXpressoIDE是官方提供免费的IDE,可以很方便进行基本设置,此前一直在研究例程,这次尝试从零开始搭建工程,感受这过程带来的便捷。
    先不做复杂的事,点个灯。

    一、新建工程
    1、下载对应的SDK,这里还可以升级旧版的SDK。已安装可以忽略这一步。
    00 下载SDK.png
    2、下载安装SDK后,在菜单或在屏幕右侧选择“Create a new C/C++ project…”。
    选择开发板或MCU类型

    3、官方提供丰富的组件,选择自己需要组件。
    IDE会自动分配一个项目名,我这里把项目名改为new_project,并选择了ADC
    01 选择需要组件.png

    如果开始考虑不周也没关系,开发过程中需要增加组件,可以通过点击项目名,选择“Manage SDK Components”进入
    02 重新选择组件.png

    4、按下一步,进入项目高级设置,我选择使用PRINTF,可以通过串口printf输出过程状态
    03 一些设置.png
      按完成IDE会建立项目的整体框架。
      打开board.c,可以看到串口输出运行信息的代码
    1. void BOARD_InitDebugConsole(void)
    2. {
    3.     uint32_t uartClkSrcFreq;
    4.     /* SIM_SOPT2[27:26]:
    5.      *  00: Clock Disabled
    6.      *  01: IRC48M
    7.      *  10: OSCERCLK
    8.      *  11: MCGIRCCLK
    9.     */
    10.     CLOCK_SetLpuart0Clock(1);

    11.     uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;
    12.     DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);
    13. }
    复制代码


    二、GPIO设置
    1、按右上角的Pins,打开Pins设置窗口
    10 打开pins.png

    如果没找到,先打开透视图,再选择Pins
    11 打开透视图.png


    2、选择需要设置的项目
    12 选择项目.png

    3、可视化的配置界面,方便得不要不要的
    先激活Pin复用功能,我要点灯,所以选择电路板RGB灯对应的GPIO(PTD5、PTE29、PTE31)
    13 打开透视图.png


    然后设置GPIO
    14 设置GPIO.png

    设置完成后,选择上部的更新源代码。吼吼,设置完成。
    来,看看代码
    pin_mux.c中Pin的初始化代码全部已生成
    1. void BOARD_InitDEBUG_UARTPins(void)
    2. {
    3.     /* Port A Clock Gate Control: Clock enabled */
    4.     CLOCK_EnableClock(kCLOCK_PortA);
    5.     /* Port D Clock Gate Control: Clock enabled */
    6.     CLOCK_EnableClock(kCLOCK_PortD);
    7.     /* Port E Clock Gate Control: Clock enabled */
    8.     CLOCK_EnableClock(kCLOCK_PortE);

    9.     gpio_pin_config_t LED_GREEN_config = {
    10.         .pinDirection = kGPIO_DigitalOutput,
    11.         .outputLogic = 1U
    12.     };
    13.     /* Initialize GPIO functionality on pin PTD5 (pin 62)  */
    14.     GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_GREEN_GPIO, BOARD_INITDEBUG_UARTPINS_LED_GREEN_PIN, &LED_GREEN_config);

    15.     gpio_pin_config_t LED_BLUE_config = {
    16.         .pinDirection = kGPIO_DigitalOutput,
    17.         .outputLogic = 1U
    18.     };
    19.     /* Initialize GPIO functionality on pin PTE29 (pin 17)  */
    20.     GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_BLUE_GPIO, BOARD_INITDEBUG_UARTPINS_LED_BLUE_PIN, &LED_BLUE_config);

    21.     gpio_pin_config_t LED_RED_config = {
    22.         .pinDirection = kGPIO_DigitalOutput,
    23.         .outputLogic = 1U
    24.     };
    25.     /* Initialize GPIO functionality on pin PTE31 (pin 19)  */
    26.     GPIO_PinInit(BOARD_INITDEBUG_UARTPINS_LED_RED_GPIO, BOARD_INITDEBUG_UARTPINS_LED_RED_PIN, &LED_RED_config);

    27.     /* PORTA1 (pin 23) is configured as LPUART0_RX */
    28.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, kPORT_MuxAlt2);

    29.     /* PORTA2 (pin 24) is configured as LPUART0_TX */
    30.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, kPORT_MuxAlt2);

    31.     /* PORTD5 (pin 62) is configured as PTD5 */
    32.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_GREEN_PORT, BOARD_INITDEBUG_UARTPINS_LED_GREEN_PIN, kPORT_MuxAsGpio);

    33.     /* PORTE29 (pin 17) is configured as PTE29 */
    34.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_BLUE_PORT, BOARD_INITDEBUG_UARTPINS_LED_BLUE_PIN, kPORT_MuxAsGpio);

    35.     /* PORTE30 (pin 18) is configured as ADC0_SE23 */
    36.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_ACD0_PORT, BOARD_INITDEBUG_UARTPINS_ACD0_PIN, kPORT_PinDisabledOrAnalog);

    37.     /* PORTE31 (pin 19) is configured as PTE31 */
    38.     PORT_SetPinMux(BOARD_INITDEBUG_UARTPINS_LED_RED_PORT, BOARD_INITDEBUG_UARTPINS_LED_RED_PIN, kPORT_MuxAsGpio);

    39.     SIM->SOPT5 = ((SIM->SOPT5 &
    40.                    /* Mask bits to zero which are setting */
    41.                    (~(SIM_SOPT5_LPUART0TXSRC_MASK | SIM_SOPT5_LPUART0RXSRC_MASK)))

    42.                   /* LPUART0 Transmit Data Source Select: LPUART0_TX pin. */
    43.                   | SIM_SOPT5_LPUART0TXSRC(SOPT5_LPUART0TXSRC_LPUART_TX)

    44.                   /* LPUART0 Receive Data Source Select: LPUART_RX pin. */
    45.                   | SIM_SOPT5_LPUART0RXSRC(SOPT5_LPUART0RXSRC_LPUART_RX));
    46. }
    复制代码


    三、点灯
    点灯需要延时(中断方式以后再研究)
    方法一:自己建立延时函数
    这个比较简单自己根据时钟建立一个延时函数
    1. void delay_ms(uint32_t ms)
    2. {
    3. while (ms--)
    4. {
    5. for(uint32_t i=0;i<48000;i++) {}   // 系统使用48Mhz
    6. }
    7. }
    复制代码


    方法二:官方提供一个微妙级的延时函数,同样使用循环方式进行延时
    1. void Delay_ms(uint32_t ms)
    2. {
    3.     SDK_DelayAtLeastUs(1000 * ms, SystemCoreClock);
    4. }
    复制代码


    方法三:使用SysTick定时器,这个是使用中断方法,不容易受其他中断程序而影响延时精度。
    1. volatile uint32_t uwTick;           // 定义一个记录Tick数的全局变量

    2. void SysTick_Handler(void)        // 中断Handler程序
    3. {
    4.     if (uwTick != 0U)
    5.     {
    6.             uwTick--;        // 每次中断Tick数自减1
    7.     }
    8. }

    9. void SysTick_Delay(uint32_t ms)        // 延时函数主体
    10. {
    11.         uwTick = ms;
    12.     while (uwTick != 0U)        // 直到Tick为0时退出
    13.     {
    14.     }
    15. }
    复制代码


    并且在int main(void)中初始化时加入:
    1. SysTick_Config(SystemCoreClock / 1000U);
    复制代码


    我的点灯部分程序,在int main(void)循环体中
    1.     int i = 0 ;
    2.     /* Enter an infinite loop, just incrementing a counter. */
    3.     while(1) {
    4.         i++ ;
    5.         switch (i % 3)
    6.         {
    7.                 case 0:
    8.                                 LED_BLUE_ON();
    9.                         LED_GREEN_OFF();
    10.                         PRINTF("Turn on Blue\r\n");
    11.                         break;
    12.                 case 1:
    13.                         LED_RED_ON();
    14.                         LED_BLUE_OFF();
    15.                         PRINTF("Turn on Red\r\n");
    16.                         break;
    17.                 case 2:
    18.                         LED_GREEN_ON();
    19.                         LED_RED_OFF();
    20.                         PRINTF("Turn on Green\r\n");
    21.                         break;
    22.         }
    23.         SysTick_Delay(500);                                                                // 每秒更新两次
    复制代码


    四、效果:
    20 输出.png

    21 输出.png




    永远开心快乐
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-12-13 23:59 , Processed in 0.114504 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表