TC397 AUTOSAR EB MCAL STM 配置与ADS测试
本文介绍了基于TC397XP芯片的MCAL STM定时器配置与测试方法。通过EB tresos 23.0.0工具配置STM0定时器的1ms和1s中断,并给出了硬件连接方案(MCU:TC397XP,LED0:P21_0)。文章详细展示了ResourceM、Mcu、Stm和Irq模块的配置步骤,提供了中断服务程序和回调函数的实现代码。最终实现了LED每秒翻转的功能,并扩展出一个简单的基于1ms中断的任
前言
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();
}
}
}
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)