mpc5748G开发板学习笔记(三:STM系统时钟)

前言

1、mpc5748G开发板学习笔记(一:点灯)

2、mpc5748G开发板学习笔记(二:ADC)

代码已上传github

本文做一下STM系统定时器模块的笔记。

1 时钟 clock

时钟,是计算机系统的脉搏,也决定着处理器的运行频率。以MPC5748G来说,它有三个内核,分别为2个32位的e200Z4内核和1个32位的e200Z2内核。
其中Z4核的运行频率为160MHz,Z2核则为80MHz。
如果写一个软件延时:


void delay(uint32_t count) {
    for (volatile uint32_t i = 0; i < count; i++) {
        for (volatile uint32_t j = 0; j < 1000; j++) {
            // 简单的循环来模拟延时
        }
    }
}

分别在这三个核中调用该延时函数,循环点亮一个LED灯,会发现Z2核点亮的LED亮灭速度要慢一倍。

MPC5748G一共有五个时钟源:

  • 4 个时钟振荡器:

    • 8 - 40 MHz 快速外部振荡器 FXOSC
    • 16 MHz 快速内部RC振荡器 FIRC
    • 32 KHz 慢速内部振荡器 SXOSC
    • 128 KHz 慢速内部RC振荡器 SIRC
  • 1 个调频锁相环(FMPLL)

    • 乘四个时钟振荡器中的一个 :最高 160 MHz。

在时钟树里也可以自己选择系统时钟的时钟源:

在这里插入图片描述

2 系统定时器模块System Timer Module(STM)

MPC5748G上的定时器模块有很多,包括

  • 周期中断定时器(PIT)
  • Software Watchdog Timer (SWT)
  • Real Time Clock (RTC-API)
  • System Timer Module (STM)

作为普通定时器常用的是1个PIT和3个STM,PIT的使用方法参考定时器 timing_pal,本文使用的是系统定时器模块STM。

MPC5748G一共有三个STM模块,三个核各有一个。
每个STM包括:

  • 一个32位递增计数器
  • 四个比较通道
  • 每个通道有一个单独的中断源

在这里插入图片描述

特点:

•	一个带8位预分频器的32位递增计数器
•	四个32位比较通道
•	每个通道的独立中断源
•	计数器可以在调试模式下停止
•	可编程选择用于定时器操作的系统时钟或FXOSC时钟

3 编程思路

三个STM定时器只用一个STM_0,其中四个通道只用一个0通道,即 STM_0_Ch0。

  • 定时器的定时原理为:

    • STM的32位计数寄存器(STM_CNT)自使能以后便开始累加,从0x0000 0000一直累加到0xFFFF FFFF,加满回滚至0x0000 0000,所以其最大值为4294967296。

    • 可以设定0通道的32位比较寄存器(STM_CMP0)的值,当 CNT的值 = CMP0的值时,就会触发0通道的中断函数。

在这里插入图片描述

了解原理后,就可以设计程序了。

最简单的定时器程序就是控制LED的亮灭了,本程序使用了PA10端口的LED,设置一秒的定时,每过一秒,该LED的值翻转,也就是从亮变灭或者从灭变亮。

4 生成代码

  • 勾选PA[10]为out
    在这里插入图片描述

  • 在模型库中选择stm模块
    在这里插入图片描述

注:加入后可能名为:stm1:stm ,但实际使用的还是STM_0定时器,我把名字改掉了。

  • 设置STM定时器,可以在Sourece Selection看到时钟源为FS80:
    在这里插入图片描述

  • 看一眼时钟树,看到FS80的频率为80MHz:
    在这里插入图片描述

  • 点击生成代码:
    在这里插入图片描述

5 主函数编写

/* ###################################################################
**     Filename    : main.c
**     Processor   : MPC574xG
**     Abstract    :
**         Main module.
**         This module contains user's application code.
**     Settings    :
**     Contents    :
**         No public methods
**
** ###################################################################*/
/*!
** @file main.c
** @version 01.00
** @brief
**         Main module.
**         This module contains user's application code.
*/         
/*!
**  @addtogroup main_module main module documentation
**  @{
*/         
/* MODULE main */


/* Including necessary module. Cpu.h contains other modules needed for compiling.*/
#include "Cpu.h"

  volatile int exit_code = 0;
/* User includes (#include below this line is not maintained by Processor Expert) */
#define PORT	PTA
#define LED		10

uint32_t ticks;	/* The number of ticks */

void STM0_Ch0_IRQHandler(void)
{
    /* Clear channel interrupt flag */
    STM_DRV_ClearStatusFlags(INST_STM0, stm0_ChnConfig0.channel);
    /* Toggle Led to check period */
    PINS_DRV_TogglePins(PORT, (1 << LED));
    /* Increase the number of ticks in compare register to create a periodic for next event */
    STM_DRV_IncrementTicks(INST_STM0, stm0_ChnConfig0.channel, ticks);

}
/*! 
  \brief The main function for the project.
  \details The startup initialization sequence is the following:
 * - startup asm routine
 * - main()
*/

int main(void)
{
  /* Write your local variable definition here */

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  #ifdef PEX_RTOS_INIT
    PEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of Processor Expert internal initialization.                    ***/

  /* Write your code here */
  /* For example: for(;;) { } */
    /* Initialize clock gate*/
    CLOCK_SYS_Init(g_clockManConfigsArr,   CLOCK_MANAGER_CONFIG_CNT,
                   g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
    /* Initialize and configure pins */
    PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
    /* Initialize STM */
    STM_DRV_Init(INST_STM0, &stm0_InitConfig0);
    /* Compute the number of ticks from microseconds */
    STM_DRV_ComputeTicksByUs(INST_STM0,1000000U, &ticks);//以us为单位,计算定时的时间
    /* Initialize channel 0 */
    stm0_ChnConfig0.compareValue = ticks;//设定比较寄存器的值
    STM_DRV_InitChannel(INST_STM0, &stm0_ChnConfig0);//初始化STM_0的0通道
    /* Enable Interrupt for STM0 channel 0 */
    INT_SYS_EnableIRQ(STM0_Ch0_IRQn);//使能STM0 channel0的中断函数,36为STM_0_CIR0[CIF]。
    /* Start running the common timer counter */
    STM_DRV_StartTimer(INST_STM0);//启动STM计数器,将STM控制寄存器STM_CR[TEN]置1。


  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/
  #ifdef PEX_RTOS_START
    PEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */
  #endif
  /*** End of RTOS startup code.  ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;) {
    if(exit_code != 0) {
      break;
    }
  }
  return exit_code;
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

/* END main */
/*!
** @}
*/
/*
** ###################################################################
**
**     This file was created by Processor Expert 10.1 [05.21]
**     for the NXP C55 series of microcontrollers.
**
** ###################################################################
*/

每一行的功能已经注释进去了,具体讲一下ticks这个变量的含义。

  1. 它首先是一个32位无符号int变量:
uint32_t ticks;	/* The number of ticks */
  1. 在这一行为其赋值:
    /* Compute the number of ticks from microseconds */
    STM_DRV_ComputeTicksByUs(INST_STM0,1000000U, &ticks);//以us为单位,计算定时的时间

其实点开这个函数内部看一看,运算过程已经把1000000这个常数给约掉了。

STM_DRV_ComputeTicksByUs(const uint32_t instance,const uint32_t periodUs,uint32_t * const ticks)

	……省略……
	
    /* The formula to convert the microsecond value to the number of tick */
    /* ticks = ((periodUs * ClockSrcFreq) / clkPrescaler) / 1000000 */
    tempTicks = (((uint64_t)periodUs * s_stmClockSrcFreq[instance]) / clkPrescaler) / 1000000U;
    
    ……省略……
    

所以这一行给ticks赋值为时钟频率:80MHz

ticks = 80,000,000u
  1. 设定比较寄存器STM_CMP0
    stm0_ChnConfig0.compareValue = ticks;//设定比较寄存器的值

这一句把ticks设为STM_CMP0的值,也就是计数寄存器计数到80,000,000时,触发中断,也正好对应了一秒钟。

  1. 更新STM_CMP0比较器的值
void STM0_Ch0_IRQHandler(void)
{
    /* Clear channel interrupt flag */
    STM_DRV_ClearStatusFlags(INST_STM0, stm0_ChnConfig0.channel);
    /* Toggle Led to check period */
    PINS_DRV_TogglePins(PORT, (1 << LED));
    /* Increase the number of ticks in compare register to create a periodic for next event */
    STM_DRV_IncrementTicks(INST_STM0, stm0_ChnConfig0.channel, ticks);

}

可以看到中断函数中,首先清除了中断标志等待下一次中断,然后翻转了LED的值。
最后又用到了ticks更新比较寄存器STM_CMP0的值,也就是在原来的基础上又加上一个ticks,这样的话等到计数器计数到 2 * ticks 时,便会再次触发该中断函数。

6 运行

烧写程序参考上两篇文章,可以看到LED为1秒的周期进行闪烁。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这是一款基于Power Archite技术的32位汽车MCU。 MPC5748G可满足功能安全性,安全性和工业/汽车网关应用需求。 跟S32K系列相比,Calypso系列带有更多的资源和接口,提供多达6到8个CAN总线(均支持CAN FD)。 对以太网应用,请注意S32K148可以提供100MB以太网,Calypso系列提供1或者2个100MB以太网,带Switch功能,客户根据所需资源来选择。 Calypso内置HSM模块,可以实现Evita Medium,新版SHE固件也可实现RSA2048等非对称加密功能和Harsh算法等。 MPC56xx/57xx SW的市场计划 1. 免费的生产级AUTOSAR 3.0 / 4.0软件(MCAL和OS),用于MPC56xx器件的开发和生产 2. 用于开发和生产的MPC57xx器件的生产级AUTOSAR 3.0 / 4.0软件(MCAL和OS)的价格降低 3. 用于MPC56xx和MPC57xx器件的免费生产级核心自测试软件,用于开发和生产 4. 免费的生产级非Autosar SDK for MPC57xx,用于开发和生产 5. 适用于USB,SDHC,TCP / IP的新型第方中间件产品(Calypso) 目标应用: •汽车雷达系统 •混合动力和电动汽车动力逆变器 •电动助力转向系统(EPS) •安全气囊系统 •安全域控制 •安全电机控制器 •主动驾驶辅助系统 •自适应巡航控制 •制动和稳定性控制 •主动悬架 • 以太网网关,主处理器,可以提供Secure Gateway Reference Design,支持FOTA功能 • T-Box,信号桥接处理器,带有LIN / CAN FDx8 / 以太网x2 / USB / SDHC接口 • 车身域控制器, 最大带有324Pin, 6MB Flash, 核,及多个通信接口 • 工业市场:电力监控/安全通信等 方案来源于大大通
MPC5744P是一款高性能的微控制器,具备多个功能丰富的模块,其中之一就是ADC模块。 ADC模块是模拟数字转换器,其作用是将模拟信号转换为数字信号,使得微控制器能够对模拟信号进行处理和分析。MPC5744P的ADC模块具有以下特点和功能: 1. 多通道支持:MPC5744P的ADC模块支持多个输入通道,可以同时采集多个不同的模拟信号。每个通道都有独立的配置寄存器,通过配置可以实现不同模拟信号的采集。 2. 高分辨率:ADC模块具有较高的分辨率,可以将模拟信号转换为高精度的数字信号。MPC5744P的ADC模块支持分辨率高达12位,可以满足对于精确信号采集的需求。 3. 快速采样率:ADC模块具有较高的采样速率,能够以较高的速度进行数据转换。MPC5744P的ADC模块支持最高10 MSPS的采样速率,可以满足对于快速变化信号的采集要求。 4. DMA支持:ADC模块可以与DMA控制器结合使用,实现高效的数据传输。通过DMA,可以实现直接内存访问,减少CPU的参与,提高系统性能。 5. 精确的时钟控制:ADC模块具有独立的时钟控制,可以通过设置时钟源和分频系数来实现对ADC的精确控制。这有助于在不同应用场景下提供更加稳定和准确的数据采集。 综上所述,MPC5744P的ADC模块具有多通道支持、高分辨率、快速采样率、DMA支持和精确的时钟控制等特点和功能。它在工业控制、汽车电子、测量仪器等领域有着广泛的应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aprilaaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值