1. 课程导论与开发环境搭建
各位同学,欢迎来到《MCU CMS32 外设驱动开发与 AUTOSAR 适配实战》的第一章。
我是你们这门课的主讲。做了十几年嵌入式,从 8 位机一路干到多核异构,踩过的坑不少。今天咱们先不急着写代码,把地基打牢。
这一章,我会带你认识 CMS32 芯片、了解 AUTOSAR 到底是个啥、熟悉开发板、装好 IDE,最后跑起第一个点灯程序。嗯,点灯是嵌入式的 Hello World,也是我们信心的起点。
1.1 CMS32 芯片概述
CMS32 是啥?它是一款基于 ARM Cortex-M0+ 内核的 32 位微控制器。我最早接触它是在一个车载控制器的项目里,当时客户要求成本低、功耗低,还得过 AEC-Q100 认证。CMS32 正好满足。
它的核心特点,我列了个表,方便你对照:
| 特性 | 参数 | 说明 |
|---|---|---|
| 内核 | ARM Cortex-M0+ | 主频最高 48MHz,单周期乘法 |
| Flash | 64KB ~ 256KB | 支持片上擦写,适合 OTA |
| SRAM | 8KB ~ 32KB | 够跑轻量级 RTOS 或裸机 |
| 工作电压 | 2.0V ~ 5.5V | 宽压设计,兼容 3.3V 和 5V 系统 |
| 温度范围 | -40°C ~ +125°C | 车规级,工业级也够用 |
| 主要外设 | UART、SPI、I2C、ADC、PWM、CAN | 覆盖常见传感器和执行器 |
你可能会问:Cortex-M0+ 性能够吗?说实话,做简单的传感器采集、逻辑控制、甚至 CAN 通信,完全够。我见过有人拿它做 BMS 从控,跑了三年没出过问题。
1.2 AUTOSAR 简介
AUTOSAR,全称 Automotive Open System Architecture。说白了,就是汽车电子软件的一套标准化架构。
为什么需要它?你想想看,以前做汽车软件,每家 OEM 有自己的标准,ECU 供应商换一个平台就得重写底层驱动。重复造轮子不说,还容易出 bug。
AUTOSAR 把软件分层了:
- 应用层(ASW):写业务逻辑,不用管硬件。
- 运行时环境(RTE):负责应用层和底层的通信。
- 基础软件层(BSW):包括操作系统、通信栈、诊断栈、存储栈等。
- 微控制器抽象层(MCAL):直接操作寄存器,是硬件相关的部分。
我们这门课,重点就在 MCAL 这一层。说白了,就是教你怎么把 CMS32 的外设驱动封装成符合 AUTOSAR 标准的接口。
我曾经在一个项目里,因为 MCAL 的 CAN 驱动没有按规范实现时间戳接口,导致整车网络仿真死活对不上。后来花了三天才定位到问题。嗯,从那以后,我对 AUTOSAR 规范就再也不敢马虎了。
1.3 开发板介绍
我们课程用的是 CMS32 评估板,官方型号叫 CMS32-EVB。板子不大,但该有的都有。
板载资源一览:
- 主控:CMS32L051(48MHz,64KB Flash,8KB SRAM)
- LED:2 个用户 LED(PA0, PA1)
- 按键:1 个复位键,1 个用户键(PB0)
- 通信接口:1 路 USB 转串口(CH340),1 路 CAN(TJA1050)
- 扩展接口:Arduino 兼容排针,方便接传感器模块
- 调试接口:SWD(4 线)
我个人建议,刚开始别急着接外设。先把板子上的 LED 点亮,确认 MCU 能跑起来。这是最稳妥的起步方式。
1.4 IDE 安装与配置
我们用的 IDE 是 IAR Embedded Workbench for ARM 8.50 以上版本。为什么选 IAR?因为它的编译优化好,调试器稳定,而且 CMS32 的官方例程就是基于 IAR 的。
安装步骤不复杂,我简单说一下:
- 从官网下载 IAR EWARM 安装包(建议 8.50.1 以上)。
- 运行安装程序,选择安装路径(不要有中文)。
- 安装 License Manager,导入你的 license 文件。
- 安装 CMS32 的器件支持包(Device Support Pack)。
- 安装调试器驱动(J-Link 或 CMSIS-DAP)。
配置工程时,有几点要注意:
- 芯片型号选 CMS32L051。
- 调试接口选 SWD,速度建议 4MHz,别太高,容易不稳定。
- Flash 下载算法要选对,否则下载会报错。
1.5 第一个点灯程序
好了,终于到动手环节了。点灯程序,说白了就是控制 GPIO 输出高低电平。
CMS32 的 GPIO 操作很简单。你要做三件事:
- 使能 GPIO 时钟。
- 配置引脚为推挽输出。
- 写寄存器拉高或拉低电平。
代码长这样:
#include "CMS32L051.h"
void delay(volatile uint32_t count) {
while (count--);
}
int main(void) {
// 1. 使能 GPIOA 时钟
RCC->AHBENR |= (1 << 0); // RCC_AHBENR 的 bit0 对应 GPIOA
// 2. 配置 PA0 为推挽输出
GPIOA->MODER &= ~(3 << 0); // 先清零
GPIOA->MODER |= (1 << 0); // 设置为 01(通用输出模式)
// 3. 配置 PA0 为推挽(默认就是推挽,不用改)
while (1) {
GPIOA->BSRR = (1 << 0); // 置位 PA0,LED 亮
delay(500000);
GPIOA->BSRR = (1 << 16); // 复位 PA0,LED 灭
delay(500000);
}
}
这段代码,你直接复制到 IAR 工程里,编译下载,就能看到板子上的 LED 一闪一闪了。
我第一次调这个程序时,LED 死活不亮。后来发现是时钟没使能。嗯,这种低级错误,我相信你不会犯的。
本章知识结构
下面这张图,帮你理清本章的知识脉络:
这张图把本章四个核心模块串起来了。从芯片认识开始,到 AUTOSAR 概念,再到开发板硬件,最后落到 IDE 和点灯实践。每一步都是下一步的前提。
好了,第一章的内容就到这里。环境搭好了,灯也亮了,后面我们就可以开始真正的外设驱动开发了。