查看: 1469|回复: 3

[原创] 【MCXC444分享】4、PIT定时器中断及LPuart0时钟设置

[复制链接]
  • TA的每日心情
    开心
    昨天 09:48
  • 签到天数: 971 天

    连续签到: 11 天

    [LV.10]以坛为家III

    14

    主题

    4645

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7747
    最后登录
    2025-8-26
    发表于 2024-12-5 14:28:14 | 显示全部楼层 |阅读模式
    有论坛的兄弟使用LPTMR定时器点灯,我这里使用PIT点灯。
    仍然继续探索MCUXpressoIDE

    一、PIT:Periodic Interrupt Timer1、在外设中激活PIT功能,并安装SDK相关部件
    建立一个PIT通道
    PIT.png

    2、这里要赞一下MCUXpressoIDE,中断间隔设置直接输入的是时间或频率,而不像其他的还要笨笨地在草稿本上计算几道四则混合运算题,才能正确的输入参数。

    时间.png

    3、复制Handle到代码中,这里建议能否把清楚标志的语句也加入Handle代码中。
    1. PIT_ClearStatusFlags(PIT_PERIPHERAL, PIT_CHANNEL_0, kPIT_TimerFlag);
    复制代码


    句柄.png

    4、并添加点灯代码
    1. uint8_t i;

    2. /* PIT_IRQn interrupt handler */
    3. void PIT_IRQHANDLER(void) {
    4.   /*  Place your code here */
    5.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    6.   Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    复制代码


    二、LPuart0时钟设置
    为何在这里说,这也是困扰了我半天的位置,MCUXpressoIDE设置有点笨笨的。
    1、选择LPuart0时钟源
    01.png

    2、输入频率,没输入这个就没有yes/no选择
    为什么不能先yes/no?
    02.png

    3、这里还要选择yes no
    03.png

    4、最终成功设置好
    04.png



    永远开心快乐
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:48
  • 签到天数: 971 天

    连续签到: 11 天

    [LV.10]以坛为家III

    14

    主题

    4645

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7747
    最后登录
    2025-8-26
     楼主| 发表于 2024-12-6 15:10:54 | 显示全部楼层
    顺便问问,我想用定时器定时进行自动多次ADC(不是每次时间中断进入开启ADC),
    当ADC完毕后中断返回结果。
    如何设置?
    永远开心快乐
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:48
  • 签到天数: 971 天

    连续签到: 11 天

    [LV.10]以坛为家III

    14

    主题

    4645

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7747
    最后登录
    2025-8-26
     楼主| 发表于 2024-12-10 17:07:30 | 显示全部楼层
    本帖最后由 ldptest 于 2024-12-10 17:12 编辑
    ldptest 发表于 2024-12-6 15:10
    顺便问问,我想用定时器定时进行自动多次ADC(不是每次时间中断进入开启ADC),
    当ADC完毕后中断返回结果。 ...

    还是不能使用LPTMR0硬件触发ADC,请各路大神支援一下。

    按照文档中的描述LPTMR0可以硬件触发ADC
    0、理论支持.png

    我的LPTMR0的设置
    1、设置LPTMR0.png

    LPTMR0路由设置为CMP0_output
    2、路由LPTMR0.png

    ADC0路由设置,设置一个输入pin,和一个触发信号 3、路由ADC触发源.png

    ADC0设置,中断、分组
    4、ADC设置.png
    4、ADC设置2.png

    代码:
    1. uint32_t ADC_FullRange = 0x8000;

    2. /* ADC0_IRQn interrupt handler */
    3. void ADC0_IRQHANDLER(void) {
    4.   /* Array of result values*/
    5.           uint32_t result_values[2] = {0};
    6.         uint16_t AD_Volt;
    7.         float Volt = 0.0f;
    8.         PRINTF("ADC conver finish.");
    9.           /* Get flags for each group */
    10.         for ( int i=0; i<2; i++){
    11.                 uint32_t status = ADC16_GetChannelStatusFlags(ADC0_PERIPHERAL, i);
    12.                   if ( status == kADC16_ChannelConversionDoneFlag){
    13.                           result_values[i] = ADC16_GetChannelConversionValue(ADC0_PERIPHERAL, i);
    14.                         AD_Volt = result_values[i];
    15.                         Volt = 3.3 * AD_Volt / ADC_FullRange;                // 计算对应电压值
    16.                         PRINTF("Channel %d ADC Value: %d Volt Value: %f\r\n",i,AD_Volt,Volt);
    17.                   }
    18.         }

    19. }

    20. /*
    21. * @brief   Application entry point.
    22. */
    23. int main(void) {
    24.     /* Init board hardware. */
    25.     BOARD_InitBootPins();
    26.     BOARD_InitBootClocks();
    27.     BOARD_InitBootPeripherals();
    28. #ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    29.     /* Init FSL debug console. */
    30.     BOARD_InitDebugConsole();
    31. #endif
    32.     /* Start the LPTMR timer */
    33.     PRINTF("This project is LPTMR0 trigger ADC0.\r\n");
    34.     /* Force the counter to be placed into memory. */
    35.     volatile static int i = 0 ;
    36.     /* Enter an infinite loop, just incrementing a counter. */
    37.     while(1) {
    38.             i++ ;
    39.         /* 'Dummy' NOP to allow source level single stepping of
    40.             tight while() loop */
    41.         __asm volatile ("nop");
    42.     }
    43.     return 0 ;

    44.   //SDK_ISR_EXIT_BARRIER;
    45.   /* Place your code here */

    46.   /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F
    47.      Store immediate overlapping exception return operation might vector to incorrect interrupt. */
    48. /*  #if defined __CORTEX_M && (__CORTEX_M == 4U)
    49.     __DSB();
    50.   #endif*/
    51. }
    复制代码

    一直不能进入ADC中断,

    分开两步,同样的LPTMR0设置是能正常中断
    单独ADC(停止连续转换和硬件触发)也是可以进入中断的。
    不知哪里的问题
    永远开心快乐
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:48
  • 签到天数: 971 天

    连续签到: 11 天

    [LV.10]以坛为家III

    14

    主题

    4645

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    7747
    最后登录
    2025-8-26
     楼主| 发表于 2024-12-10 17:45:18 | 显示全部楼层
    本帖最后由 ldptest 于 2024-12-10 17:49 编辑
    ldptest 发表于 2024-12-10 17:07
    还是不能使用LPTMR0硬件触发ADC,请各路大神支援一下。

    按照文档中的描述LPTMR0可以硬件触发ADC

    搞定了,是路由错了一直以为是通过CMP0_output把LPTMR和ADC联系起来。
    永远开心快乐
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-8-27 03:33 , Processed in 0.083048 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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