基于Cortex-M3 内核的STM32微控制器研究与电路设计
2013-05-25秦宏伟陈春雨成宝芝
陈 鑫,秦宏伟,陈春雨,成宝芝
(1.大庆师范学院 物理与电气信息工程学院,黑龙江 大庆163712;2.北京中佳荣盛科技有限公司,北京100088)
1 STM32 概述
1.1 STM32 简介
STM32 系列产品是ST 公司推出的一系列的性价比较高的单片机,具备为高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3 内核。按性能分成两个不同的系列:STM32F103“增强型”系列和STM32F101“基本型”系列。增强型和基本型主要区分在时钟频率上,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz。两个系列都内置32K ~128K 的闪存,不同的是SRAM 的最大容量和外设接口的组合,时钟频率72MHz 时,从闪存执行代码。STM32 的结构如图1所示。
1.2 I/O 端口
STM32 芯片允许I/O 引脚被配置为多种模式(需要软件进行配置),比如通用输入或输出,被称为通用GPIO(General-purpose I/O)。而GPIO 引脚被分为GPIOA、GPIOB,…,GPIOG 不同的组,每组端口分为0 ~15 共16 个不同的引脚。每个GPIO 端口有两个32 位配置寄存器,两个32 位数据寄存器,一个32 位置位复位寄存器,一个16 位复位寄存器和一个32 位锁定寄存器。STM32 的GPIO 有多种模式,分为模拟输入、浮空输入、复用开漏输出、复用推挽输出、上拉/下拉输入、开漏输出、推挽输出,共8 种模式。有三种速率配置,分别是2MHZ、10MHZ、50MHZ。这8 种速率是对I/O 端口的驱动电路的响应速度,而不是输出信号,该输出信号的速度与程序有关。通过选择不同速率,输出驱动模块的选择也不同,以达到最佳的噪声控制和降低功耗的目的。这8 种工作模式,要根据具体的操作来选取要配置的模式,当想要点亮LED灯的时候,选择的是输出模式;当要进行串口通信时,TX 和RX 引脚要配置成复用推挽输出模式和浮空输入模式。
1.3 STM32 的操作系统移植
μC/OS-Ⅱ移植主要需要修改三个文件,即在一个微处理器平台上移植μC/OS-Ⅱ只需要修改OS_CPU.H,OS_CPU_A.ASM 和OS_CPU_C.C 这三个文件。
1.3.1 内核头文件(OS_CPU.H)
修改OS_CUP.H 文件首先要定义数据类型,处理器相关代码,声明函数原型,全局变量OS_CPU_GLOBALS 和OS_CPU_EXT 决定是否使用全局变量。对于数据类型来说,大多数Cortex-M3 编译器中,short 是16 位,int 是32 位,尽管包含了浮点数,但μC/OS-Ⅱ中并没用到,M3 是32 位,所以堆栈的数据类型OS_STK 设置32 位,而M3 的状态寄存器xPSR 是32 位。
图1 STM32 结构图
1.3.2 临界代码段
临界段,就是不可被中断的代码段,也就是说,为了某一段代码的顺利执行需要临时关闭一些中断,等待这段代码执行完之后再开启中断服务。例如常见的入栈出栈等操作就不可被中断。μC/OS-Ⅱ是一个实时内核,需要关闭中断进入开启中断退出临阶段。μC/OS-Ⅱ通过定义两个宏来关中断和开中断,即OS_ENTER_CRITICAL()、OS_EXTI_CRITICAL()。
事实上,总共有三种开关中断的方法,根据不同的处理器选用不同的方法。大部分情况下,选用第三种方法。
1.3.3 栈的增长方向
按常理来看一般的栈增长方向是由低到高,而STM32 的栈增长方向是个例外,它由高地址向低地址增长,因此OS_STK_GROWTH 定义为1。
1.3.4 与CPU 相关的C 函数和钩子函数(OS_CPU_C.C)
移植μC/OS-Ⅱ时,我们要写10 个简单的C 函数:9 个钩子函数和1 个任务堆栈结构初始化函数。钩子函数,是指那些插入到某些函数中扩展这些函数功能的函数,钩子函数为第三方软件人员开发并提供扩充软件功能的入口点。为了系统功能,μC/OS-Ⅱ提供大量的钩子函数,用户不需要修改μC/OS-Ⅱ内核代码程序,只需要向钩子函数添加代码就可以扩充μC/OS-Ⅱ的功能。
1.3.5 与处理器相关的汇编代码(OS_CPU_A.ASM)
在OS_CPU_A.ASM 中实现与处理器相关的函数,分别是OS_CPU_SR_Save(),OS_CPU_SR_Restore(),OSStartHighRdy(),OSCtxSw(),OSIntCtxSW(),共计五个。
关中断函数(OS_CPU_SR_Save())和恢复中断函数(OS_CPU_SR_Restore()),它的功能是关全局中断前,保存全局中断标志,进入临界段,退出临界断后恢复中断标记。
启动最高优先级任务运行(OSStartHighRdy()),它主要完成的任务是为任务切换设置PenSV 的优先级,当第一次任务切换设置栈指针为0,设置OSRunning=TRUE,以表明系统在运行,触发一次PendSV,打开中断等待第一次任务的切换。
任务级任务切换函数(OSCtxSw()),当任务因为被阻塞,主动向CPU 请求调度时被执行的,由于此时任务切换都是在非异常模式下进行的。主要功能是将当前任务的CPU 现场保存到任务堆栈中,随后取得高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU 现场,使之继续执行。
2 STM32 电路设计
2.1 STM32 供电模块设计
STM32 是一个低功耗模式的32 位单片机,不像以往我们熟悉的8051 和F020 单片机都是用5V 供电的,它们只需要用一个USB 线接到电脑USB 接口上就可以正常工作。Cortex-M3 是一个2.0 ~3.6V 供电的高速处理器,通过选择3.3V 供电电源,这样既不太高也不太低。同样也需要一个USB 线,且需要输出5V 的电压,把它降压到3.3V 就可以,仅需要一个3.3V 稳压芯片就可以供电。为了使输出电压更好的稳定输出,分别在稳压芯片前后两端加上去耦电容过滤掉噪声和毛刺。如图2所示。
图2 供电模块
2.2 流水灯及独立按键复位电路设计
控制LED 灯的点亮和熄灭就是控制单片机引脚的输出状态,但是想要点亮LED 灯有两种办法,一种是拉电流模式,另一种是灌电流模式。我们采用的是拉电流方式。也就是通过3.3V 的电源经过限流电阻,使其电流流入发光二极管,点亮LED,如图3所示。
既然有了流水灯,就缺不了控制流水灯的花样,实现原则就是通过断开和连接引脚输出的高底电平和对单片机内部产生中断服务请求来完成,由于嵌入式Corter-M3 内部含有多个中断源,也就是I/O 引脚的复用功能多。每当Corter-M3 程序走到死循环和待机状态时,我们需要对其上电重新启动,使其所有的程序都回到初始化状态,为了保持正常工作状态,我们只需要加上一个复位的按键,就可以解决问题,避免了断电和上电的步骤。复位功能是通过电容的充放电来完成的,只需要在按键的地方加上一个电容就可以完成此功能。如图4所示。
图3 LED 灯
图4 电路按键及复位电路
2.3 CAN 总线设计
CAN 是控制器局域网络(Controller Area Network,CAN)的简称,是由德国BOSCH 公司开发的,并最终成为国际标准,是国际上应用最广泛的现场总线之一。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN 为底层协议专为大型货车和重工机械车辆设计的J1939 协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强、振动大的工业环境。CAN 总线主要特点是低成本,传输距离远(长达10Km),传输速率数据最高时速可达1Mbit/s,可根据报文的ID 地址决定接收或屏蔽该报文,发送的信息遭到破坏后,可自动重发,当产生的错误比较严重时,可以退出总线的功能。CAN 总线能够使用多种物理介质传输,例如同轴电缆,双绞线,光纤等,信号使用差分电压传送信号,两条信号线被称为CAN_H 和CAN_L,静态时均是2.5V 左右,CAN_H 状态表示为逻辑1,也叫“隐性”,CAN_L 状态表示逻辑0,也称“显性”。此时电压为:CAN_H=3.5V,CAN_L=1.5V,如图6所示。
图6 CAN 总线设计图
3 结语
本文对STM32 系统微控制器的基本情况和各类电路设计进行了详细分析,特别是对供电模块、流水灯与按键和CAN 总线等电路进行了详细阐述,STM32 微控制器具有性能优良的Cortex-M3 内核,这使得该类微控制器应用范围广泛,如各类实时监控系统、汽车电子等。对STM32 系列微控制器进行广泛研究具有重要意义。
[1]徐端全.嵌入式系统原理与设计[M].北京:北京航空航天大学出版社,2009.
[2]南京万利.STM32 参考手册[M].北京:北京图书出版公司,2008.
[3]黄智伟.全国大学生电子设计竞赛常用电路模块制作[M].北京:北京航空航天大学出版社,2011.
[4]李全利,迟荣强.单片机原理与接口技术[M].北京:高等教育出版社,2004.
[5]任哲.嵌入式实时操作系统μC/OS-Ⅱ原理及应用[M].北京:北京航空航天大学出版社,2009.
[6]毕春跃.基于μC/OS-Ⅱ和Cortex-M3 的嵌入式系统研究[J].浙江万里学院学报,2007.
[7]刘美茹主编.C++程序设计教程[M].哈尔滨:哈尔滨工业大学出版社,2005.
[8]李凤霞.C 语言程序设计教程[M].北京:北京理工大学出版社,2009.