前言

TC397 的 EB Mcal 配置与测试, 有DIO STM UART CAN FlsLoader CRC, 本篇是 MCAL STM, 照本文描述可复现工程, 故不再提供源码,
嵌入式_机器人_自动驾驶交流QQ群: 1040239879

MCAL STM

本篇目的在于配置和单独测试 Mcal 的 Stm. 最终效果是配置了stm0定时器的两个中断, 一个1ms中断, 一个1s中断, 并且给出了一个简单的task调度实现.

硬件连接

  • MCU: TC397XP, 外部晶振20MHz
  • LED0: P21_0, 低电平点亮

软件环境

  • Mcal: 对应 Autosar CP 4.2.2
  • 配置软件: EB tresos 23.0.0
  • IDE: AURIX™ Development Studio V1.9.4(仅用于学习交流, 以下简称ads)

如何新建工程可参考上篇 MCAL DIO, 本篇主要贴出Stm的EB配置和用户代码.

EB配置

ResourceM

配置多核支持

在这里插入图片描述

Mcu

McuClockSettingConfig_0 里面默认的 McuSTMFrequency 时钟100MHz无需修改, 接下来把两个比较器给STM

在这里插入图片描述

Stm

在这里插入图片描述

Irq

配置stm0的两个中断的中断优先级(0~255, 数字越大, 优先级越高, 0表示禁止中断)

在这里插入图片描述

验证生成代码即可

Mcal Stm 拷贝

在这里插入图片描述

App代码

Irq

#include "Stm.h"
#include "Irq.h"
#include "Mcu_17_TimerIp.h"

IFX_INTERRUPT(STM0SR0_ISR, 0, IRQ_STM0_SR0_PRIO)
{
  ENABLE();
  Mcu_17_Stm_CompareMatchIsr(STM_0, 0);
  *(volatile uint32 *)0xF0001040 = 0x01;/* clear interrupt iscr */
}

IFX_INTERRUPT(STM0SR1_ISR, 0, IRQ_STM0_SR1_PRIO)
{
  ENABLE();
  Mcu_17_Stm_CompareMatchIsr(STM_0, 1);
}

Stm

#include "IfxSrc_reg.h"

void stm_callback0(void) {

}

void stm_callback1(void) {
  Dio_FlipChannel(DioConf_DioChannel_LED0);
}

void app_stm_init(float period0, float period1) {
  Stm_EnableModule(STM_0);
  IrqStm_Init();
  SRC_STM0SR0.B.SRE = 1U;
  SRC_STM0SR1.B.SRE = 1U;
  uint32 tick = (uint32)(Ifx_Ssw_getStmFrequency() * period0);
  Stm_EnableAlarm(STM_0, 0, 1, tick, stm_callback0);
  tick = (uint32)(Ifx_Ssw_getStmFrequency() * period1);
  Stm_EnableAlarm(STM_0, 1, 1, tick, stm_callback1);
}

core0_main

void core0_main (void)
{
  volatile unsigned short LoopFlag = 1U;
  unsigned short cpuWdtPassword;
  unsigned short safetyWdtPassword;

  ENABLE();
  cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
  safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
  Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[0], cpuWdtPassword);
  Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);

  app_mcu_init();
  app_port_init();
  app_stm_init(0.001, 1);

  while (LoopFlag == 1U)
  {
  }

}

编译下载运行, LED0每秒翻转一次. 说明 1s 一次的 stm_callback1 被调用了.

Task代码

可以用1ms中断的 stm_callback0 实现一个简单的task

volatile unsigned int stm_count0 = 0;
void stm_callback0(void) {
  stm_count0++;
}
void stm_callback1(void) {
}

struct nanotask {
  void (*func)(void);
  unsigned int period;  // ms
  unsigned int next;    // ms
};

void nanotask0(void) {
  Dio_FlipChannel(DioConf_DioChannel_LED0);
}

void nanotask1(void) {
}

struct nanotask nanotasks[] = {
  {nanotask0, 1000, 0},
  {nanotask1, 2000, 0},
};

void nanotask_init(void) {
  for (int i = 0; i < sizeof(nanotasks) / sizeof(nanotasks[0]); i++) {
    nanotasks[i].next = nanotasks[i].period;
  }
}

void nanotask_runone(void) {
  for (int i = 0; i < sizeof(nanotasks) / sizeof(nanotasks[0]); i++) {
    if (nanotasks[i].next == 0) {
      nanotasks[i].func();
      nanotasks[i].next = nanotasks[i].period;
    } else {
      nanotasks[i].next--;
    }
  }
}

void core0_main (void)
{
  ...
  
  app_mcu_init();
  app_port_init();
  app_stm_init(0.001, 1);
  nanotask_init();

  while (LoopFlag == 1U)
  {
    if (stm_count0 > 0) {
      stm_count0 = 0;
      nanotask_runone();
    }
  }
}
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐