TM4C123GH6PM 微控制器
0 TM4C123GH6PM简介
微控制器是由处理器(CPU) 和存储器、以及一些外设(peripheral) 集成到一片芯片里组成的。 外设和 CPU 相对独立, 且以寄存器的形式呈现给 CPU, CPU 通过总线对寄存器进行读写, 实现对外设的配置和数据通信。 常用的外设包括通用输入输出 GPIO、 定时器 TIMER、模拟输入输出(ADC、 DAC)、 串行通信(UART、 SSI、 I2C、 CAN) 等等。
本文是基于TM4C123x系列微控制器的简单入门教程。TM4C123x 系列是 TI 公司推出的一款基于 ARM Cortex-M4F 的微控制器;其率先采用65 纳米闪存工艺技术构建、工作速率达 80 MHz,TM4C123x 也包含了高达 256KB Flash 及32KB SRAM。本文主要介绍TM4C123GH6PM微控制器。
其结构图如下:
从图中可看出, DMA 和 GPIO 可通过 AHB 和 APB 总线访问, EEPROM 和 USB OTG只能通过 AHB 总线访问,其它外设则只能通过 APB 总线访问。
其引脚图如下:
1 硬件最小电路
MCU 硬件最小电路是指保障 MCU 能正常运行的最小电路,它包括了电源、晶振、复位以及写入调试接口等电路。
1.1 电源
TM4C123GH6PM 微控制器提供一个集成的 LDO 稳压器,用于给大多数微控制器的内部逻辑提供电源。图描述了电源架构。外部 LDO 不得使用。
VDDA 是可用于设备上的所有的模拟电路,包括时钟电路,典型值 3.3V。
VDD:I/O 和某些逻辑的电源,典型值 3.3V。
VDDC:为主要的逻辑部分(包括处理器内核以及大部分片上外设)的电源。该管脚上的电压为 1.2V,由片上 LDO 提供。
VBAT:休眠模块的电源供应源,它通常连接到电池的正极端并用作备用电池,典型值3.3V。
1.2 复位
复位就是使处理器恢复到起始状态。TM4C123GH6PM 有 6 种复位方式:
1)上电复位 PRO (Power-onReset) : 当器件上电以及从休眠模式唤醒时产生复位。
2)外部复位引脚/RST 引脚 /RST 低电平时会产生复位。
3)内部掉电复位 BOR(Brown-on Detector):当电源 VDD 低于门限电压 VBTH 时,系统将产生一个复位或中断。
4)软件复位:软件即可以使整个器件复位,也可以单独使内核或某个外设复位。
5)看门狗定时器复位:看门狗定时器第二次产生中断时复位。
6)MOSC 失效复位:当主振荡器运行太快或太慢时将产生错误,称为 MOSC 失效,此时将产生复位。
复位后,会根据 BOOTCFG 寄存器中的配置及相应的 GPIO 信号,决定执行 ROM 中的 Boot Loader 或是 FLASH 上的应用程序。如果从 FLASH 启动,则会从 0X000 0004 地址的复位向量开始执行。
外部复位引脚/RST 电路如下图所示:复位引脚/RST 通过一个上拉电阻接到电源正极,平时为高电平,按下按键为低电平;为了抗干扰,通常在/RST 引脚连接 RC 电路进行滤波。
1.3 时钟(System Clock)
1.3.1 基本时钟源
微控制器中使用了多个时钟源:
内部高精度振荡器(PIOSC):该振荡器是片上时钟源,它无需使用任何外部组件。提供震荡频率是 16MHz,在室温下精度为 1%,在全温下精度为 3%。
外部主振荡器(MOSC):可以使用外部接入的晶振,也可以使用外部输入的单端时钟源。
内置低频振荡器(LFIOSC):频率为 30kHz,精度比较低,为 50%。当系统进入一个深度睡眠的低功耗模式时可以使用该振荡器。
休眠模式时钟源:频率为 32.768Hz,由外部接入。该时钟源用于实时时钟,或者为深度睡眠或休眠节能模式提供准确的时钟。
系统时钟不仅有以上四种选择,还可以选择一下两种时钟选择:
内部 PLL:震荡源频率应控制在 5MHz——25MHz 之间。
内部高精度振荡器 4 分频(4MHz):精度为 1%。
1.3.2 初始化和配置
对 PLL 的配置可通过直接对 RCC/RCC2 寄存器执行写操作来实现。如果要使用 RCC2 寄存器,那么必须置位 USERCC2 位。成功改变基于 PLL 的系统时钟所需的步骤如下:
1)通过置位 RCC 寄存器的 BYPASS 位并清零 USESYS 位来旁路 PLL 和系统时钟分频器,从而配置微控制器在“原始”时钟源运行,在切换系统时钟到 PLL 前允许新的 PLL 配置有效。
2)选择晶振值(XTAL)和振荡器源 (OSCSRC),清零 RCC/RCC2 的 PWRDN 位。设置XTAL 域可以自动为相应晶振提供有效的 PLL 配置数据,清零 PWRDN 位可以给 PLL 及其输出供电并启用它们。
3)在 RCC/RCC2 中选择需要的系统分频器(SYSDIV)并在 RCC 中置位 USESYS 位。SYSDIV 域决定了微控制器的系统频率。
4)通过查询原始中断状态(RIS)寄存器的 PLLLRIS 位来等待 PLL 被锁定。
5)通过清零 RCC/RCC2 的 BYPASS 位来启用 PLL。
1.3.3 时钟库函数
TivaWare 提供了一个非常简单的 API,就可以方便的实现时钟系统的配置。
tivaware 目录下\inc\hw_sysctl.h 给出了 sysctl 下各寄存器的地址、及寄存器各位域的定义和各位域可能的取指定义。
1.3.3.1 函数 SysCtlClockSet
功能:设置设备的时钟
原型:void SysCtlClockSet(uint32_t ui32Config); 参数:ui32Config 为设备时钟所需要的配置。
描述:该函数功能配置了设备的时钟,如:输入晶振频率、振荡器、PLL、系统时钟分频等。参数 ui32Config 是几个不同值的逻辑或,它们分别都被分成多个组,其中在每个组中只能选择一个值。
振荡器的选择为如下之一:SYSCTL_OSC_MAIN,SYSCTL_OSC_INT, SYSCTL_OSC_INT4,SYSCTL_OSC_INT30,SYSCTL_OSC_EXT32。SYSCTL_OSC_EXT32 仅应用于拥有休眠模式的设备,而且只有当休眠模式使能时才有效。
PLL 选择:SYSCTL_USE_PLL(使用 PLL)或者 SYSCTL_USE_OSC(不使用 PLL)。当 PLL 工作时,且 PLL 的时钟源为外部主振荡器时,需告知 PLL 外部主振荡器的频率,如:
SYSCTL_XTAL_4MHZ,… SYSCTL_XTAL_25MHz。参数值低于 SYSCTL_XTAL_5MHZ 是无效的。系统时钟分频器选择为以下值之一:SYSCTL_SYSDIV_1,… SYSCTL_SYSDIV_64。设置外部时钟源(主时钟)作为系统的时钟时使用SYSCTL_USE_OSC|SYSCTL_OSC_MAIN。设置 PLL 作为系统的时钟源时使用 SYSCTL_USE_PLL|SYSCTL_OSC_MAIN,并需要设置正确的晶振频率 SYSCTL_XTAL_xxx 的值。例如:
SysCtlClockSet(SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN)使用 PLL 输出固定 200M,再 4 分频,系统时钟 50M。
1.3.3.2 函数 SysCtlPeripheralEnable
功能:使能外设。
原型:void SysCtlPeripheralEnable(uint32_t ui32Peripheral);
参数:ui32Peripheral 是要使能的外设
描述:函数的功能是使能一个外设。上电时,所有外设为失能状态;它们必须在使能后才能操作或响应寄存器的读/写。
外设参数必须为一下参数之一: SYSCTL_PERIPH_ADC0,SYSCTL_PERIPH_ADC1,SYSCTL_PERIPH_GPIOA,SYSCTL_PERIPH_GPIOB,SYSCTL_PERIPH_GPIOC,SYSCTL_PERIPH_GPIOD,SYSCTL_PERIPH_GPIOE,SYSCTL_PERIPH_GPIOF, SYSCTL_PERIPH_HIBERNATE…其余参数请查看外设驱动库文档。
注:写使能外设后,要经过 5 个时钟周期外设才真正被使能。在这期间,试图访问外设将导致总线错误。要注意确保在这段时间内,外设不能够被访问。
1.3.3.3 函数 SysCtlClockGet
功能:获取处理器时钟频率。
原型:uint32_t SysCtlClockGet(void);参数:无
描述:该函数获得处理器时钟频率和外设模块的时钟频率(除了 PWM,它有自己的时钟分配,其他外设有不同的时钟)。
2 存储器及映射
TM4C123GH6PM 微控制器带有 32KB 的 SRAM、内部 ROM、256KB 的 flash 和 2KB 的 EEPROM。Cortex-M4F 系列处理器对内存和外设进行了统一编址,存储器映射列出指令和数据在存储器中的位置,FLASH、ROM、SRAM 和外设对应的地址如下:
2.1 位带(Bit-band)
位带操作,可以对单一的位(bit)进行读写。在CM4中,有两个区中实现了位带。其中一个是SRAM区的最低1MB范围,第二个则是片内外设区的最低1MB范围。这两个区中的地址除了可以像普通的RAM一样使用外,它们还都有自己的“位带别名区”,位带别名区把每个位(bit)膨胀成一个32位的字。当你通过位带别名区访问这些字时,就可以达到访问原始位(bit)的目的。
SRAM 和外设的位带基址分别为 0x2200.0000 和 0x42000000。位带别名地址的计算公式为:位带别名地址=基地址+(偏移量32)+ (位编号4) 例如:如果要修改 SRAM 地址 0x20001000 的第 3 位,则位带别名地址计算如下:
位带别名地址=0x22001000 +(0x1000 32)+ (34) =0x2202000C 因此,当需要读/写位带地址 0x20001000 的第 3 位时,只需要对相应的位带别名地址 0x2202000C 执行读/写操作指令即可。
Tivaware目录下的inc/hw_types.h定义了位带的变换,例如:
#define HWREGBITW(x,b)
HWREG(((uint32_t)(x)&0xF0000000)|0x02000000|(((uint32_t)(x)&0x000FFFFF) <<5)|((b)<<2))
2.2 SRAM
SRAM 是易失性存储器,掉电后数据会丢失,适合存储需要经常修改的数据。随机存取存储器,可对存储器的任一个存储单元按需要随时进行信息读出或写入,且读/写速度快。
2.3 ROM
ROM 是非易失性存储器,只能读出,不能用一般的方法写入。TM4C123GH6PM 的 ROM 已预编程,包含以下组件:
TivaWare 引导加载程序 Boot Load 和向量表; TivaWare 外围设备的驱动程序库(DriverLib);高级加密标准(AES)加密表;循环冗余检查(CRC) 错误检测功能。
2.4 Flash
FLASH 是非易失性存储器,掉电后数据不会丢失,适合存储程序和不经常修改的数据。当系统时钟速度为 40 MHz 或更慢时,闪存在一个周期中即被读取。当处理器系统时钟大于 40MHz 时,FLASH 控制器将启用预取缓存器。在这种模式下,Flash 存储器以一半的系统时钟工作,预取缓存器每个时钟周期读取两个 32 位的字,使得在代码执行的同时,指令提取无须等待状态。
Flash 存储器由一系列 1KB 的块组织在一起,这些块可以被单独擦除。flash 器件的写入操作只能在空或已擦除的单元内进行,所以很多时候,在进行写入操作之前必须先执行擦除。擦除块会使块中所有内容块被重置为 1。
1KB 的块可成对配成 2K 的块形成保护块。保护允许块将被标记为只读或只执行,系统可提供不同级别的代码保护。只读块不能被删除或编程,系统可保护这些块的内容不被修改。同时,只执行块不能被删除或编程,不能被控制器或调试器读取,只能通过控制器取值机制来读取它的内容。
2.5 EEPROM
EPPROM 是非易失性存储器,掉电后数据不会丢失,适合存储不经常修改的数据。Tiva 的 EEPROM 模块接口为用户提供了随机访问以及顺序访问的读写样式。同时,EEPROM 模块提供了对块的锁定机制,可防止在特殊情况下对块的读写操作保护。密码存取模式使用户程序可锁定 16 字对齐的一个或多个 EEPROM 块控制访问。
每个 EEPROM 由 32 块组成,每块由 16 个字组成。对 EEPROM 的读取可以是按字节或半字长,并且,这些读取操作也不需要依照字边界对齐。每次读取,会读取整个字长,任何不需要的数据将被简单地忽略。每次写入必须要按字对齐。要向 EEPROM 写入一个字节,应先读出值,修改相应的字节,再进行回写。
EEPROM 的每个块都是根据偏移量寻址的,可通过块选择寄存器对操作的块进行选择。当前操作的块由当前块寄存器EEBLOCK决定,当前偏移量由当前寄存器EEOFFSET决定。 EEPROM 的块是受单独保护的。若尝试对未受权的块读写将返回 0xFFFF.FFFF 的错误值,并且 EEDONE 寄存器也将被置位。
3 低功耗模式
为了进行功耗控制,TM4C123GH6PM 有 4 种工作模式:
正常模式:在该模式下,处理器正常运行代码,外设正常运行。
睡眠模式:睡眠模式下,停止处理器时钟和存储器时钟,不执行代码,外设时钟频率不变,仍然可以运行。中断事件能使系统回归到运行模式。
深度睡眠模式:停止系统时钟并关闭 PLL 和 Flash 存储器,不执行代码。外设运行在内置低频振荡器的 30KHz 频率下。在该模式下,中断事件能使系统回归到运行模式。
休眠模式:处理器和外设的电源都关断,只维持休眠模块的供电。电源供电可以利用外部信号 WAKE 触发恢复,也可以利用内置实时时钟(RTC),在经过一段特定的时间之后恢复。休眠模块可以由外部电池或者辅助电源单独供电。