单片机论坛

 找回密码
 立即注册

QQ登录

只需一步快速开始

搜索
查看: 545|回复: 0
收起左侧

从STM32到德州TM4C123的快速入门

[复制链接]
007.7 发表于 2019-7-20 12:49 | 显示全部楼层 |阅读模式
从51单片机到STM32再到TM4C123

目录

系统时钟
GPIO相关
通用定时器相关
PWM相关
UART通信相关

写在前面
进入TI的学习说明STM32 已经掌握的差不多了没有掌握的很好也没关系正好两块单片机对比着学习更能加深映像这篇只是简单的介绍TI篇幅比较短比主要还切述了32和TI的不同的地方相似的就没有再写出来不能完全的拿来当作学习资料

一点学习TI的建议
TI主要学习还是通过北航出版的嵌入式系统坛̡基于TivaC系列 ARM CortexM4微控制器为主资料因为这个资料比较通俗易懂如果不不看电子版的可以去图书馆借这本书还有一本配套的书忘记叫啥名字了但是想借的话直接图书馆检索TM4C123GH6PM就可以找到这本书主要还是纯文字教你怎么配置相应功能和相应项目的思路其次除了北航的那本书配套的资料还应该有TM4C1233H6PM数据手册中文版中英文版本的TM4CDriver_Library数据手册的话主要就是了解相关外设功能以及对应映射引脚查找TM4CDriver_Library分要是API文档因为TI不同于常TI的函数的入口问无法通过像常一样的方法查找选择合适的问所以该文档就很有作用对于一个函数可以通过该文到行查找找到函数所在的位置有详细的关于该函数的步⣬可以了解该功能同时还有入口问的例子若要选择其他入口问则复制该问在程序文件里面查找定义的位置就可以看到附近还有同类的问选择需要的问即可
对于单片机的定时那是一部分很重要的东西这其中就有以分资料单独讲怎么配置各种定时器实现不同功能有例程TM4C123G定时器就是一份资料学习定时器的时候对照着来会比较容易很多
当然了网上还有很多人的学习记录博客这些也是很有用的资料因为学习TI就是要知道怎从ã怎么配置相关程序博客就解决了这类问题CSDN上面这一类型的TI坛不多懒得找的话可以来找我拷贝

系统时钟
对于51单片机来说在书写程序时候是不需要进行系统的时钟函数的配置的直接由晶振电路来提供

如图所示直接是32和TI的系统时钟框图
常系统时钟
TI系统时钟

对于32 的时钟来说常用的时钟主要分为AHB和APB两大部分且系统时钟不需要自己来配置
/*
void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);
void RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState);
void RCC_AHB3PeriphClockCmd(uint32_t RCC_AHB3Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
*/
每个部分对应多大的德ʣ对应的定时器编号串口编号也已经设定好所以在使用相对应的功能时候直接在这两类里面进行查找然后使能外设就可以用了例如使用GPIO定时器等功能时候直接用函数里面的问来查找
/*
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能串口
*/
欢对于TI来说系统的时钟也是分为AHB和APB两种但是在配置时候可进行自由选择由于初入TI对这里没有仔细学习行趣的可以了解但是配置时钟时候可以只需要运用SysCtlClockSet()函数来自己来设定不像32一样直接规定了不同外设用不同的德ʡ函数的入口问就是系统的分频使用OSC还是PLLOSC时钟源选择外接晶体德ʣ这四种来完成设备的时钟例如
/*
SysCtlClockSetSYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_XTAL_16MHZ SYSCTL_OSC_MAIN
*/
最后使能相应的功能即可关于其时钟配置的问详细步见
在配置好系统的时钟之后根据需要的外设功能进行相应的使能
/*
SysCtlPeripheralEnable(uint32_t ui32Peripheral)
*/
其中的入口问为SYSCTL_PERIPH_GPIOASYSCTL_PERIPH_PWM1SYSCTL_PERIPH_TIMER1等等
注意32的系统德的配置是固定的定在了不同的总线的使能函数所以不同的外设可以说是不共用系统时钟的而TI是先于外设使能前进行自己时钟配置然后才使能所需外设且公用系统时钟
GPIO相关
说完时钟和系统配置下面简绍基本的GPIO口的配置

GPIO的功能大致上还是和32的类似可输出高低电平UART通信还可阅拟一些简单的通信接口如SPIIIC等一般工作模式有以录种
浮空输入
上拉输入
下拉输入
模拟输入
开漏输出
推挽输出
从推挽输出
从开漏输出

一般GPIO在复位之后都有一个默认的较为了安全起见都是默认为输入模式废话不多说直接进入配置
首先是常的配置
void LED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;              
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);            

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                                      
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                           
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                           
GPIO_Init(GPIOB, &GPIO_InitStructure);                                                                     
GPIO_SetBits(GPIOB,GPIO_Pin_5);            

GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                                                                                             
}
其问TI的配置
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //使能GPIOF外设         GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

不难看出配置常和TI的方式就是不一样的常的GPIO是用结构体进信置TI则使用函数来进信置TI的普通配置只需要进行GPIO外设使能和较控制即可也不是登面说到的功能模式就不能配置了如果有需要可以进行其他类型的配置
如果要进行端口高低电平的输出控制常和TI也是一样的调用函数来进信置分别是GPIO_SetBits(GPIOE,GPIO_Pin_5);和GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0);

注意TI的输出高低电平使用的是同一个函数GPIOPinWrite对于常则使用的是两个函数GPIO_SetBits和GPIO_ResetBit即可输出高低电平TI呢则不是这样的就连入口问也不是和常一样那么简单GPIOPinWrite入口问就有三个分别是GPIO_PORT_BASEGPIOPINߣ和低电平时候为但是高电平时候不是而是GPIOPINߣ例如PF输出高电平
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_PIN_1);

如果想进行其他端口详细的配置情况可以见相关手册资料其中端口从放在后面各功能实现时候讲
通用定时器相关
TI定时器简介
TI定时器呢主要分为个大的定时器模块GPTM每个定时器模块又分为定时器A和定时器B所以总共有个定时器这个大的定时器的属性分为常参的GPTM块和常次块其中各块每个常参的定时器块提供路位的定时器计数器即定时器A和定时器B所以通俗来说就嵌时器A或B单独配置时候就是个位的定时器读起来配置就是个常参的定时器同样的常次的块就是个常参的定时器读时候就变成个次的定时器
功能说明
每个 GPTM 模块的主要元件包括两个自由运行的递增/递减计数器称作 Timer A 和 Timer B两个预分频器寄存器两个匹配寄存器两个预分频器匹配寄存器两个影子寄存器两个加载/初始化寄存器以及与它们相关的控制功能
接着来该单片机的定时器和常的有点不同特别是计数控制计数的寄存器配置了常的定时器之后定时器开始计数当计数达到重装载值时候产生中断之后会重新自动装载计数值但是Ti却并非如此是否自动装载计数值切要在配置时候进行设置的官方一点的来说就是单次触发/周期定时器模式
相关定时器的功能如下
接着进入配置对比
首先还是先32的配置
/*
              TIM_TimeBaseStructure.TIM_Period = arr;
              TIM_TimeBaseStructure.TIM_Prescaler =psc;
              TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
              TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
              TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
*/
TI的配置
/*
//TimerConfigure(TIMER0_BASE, TIMER_CFG_ONE_SHOT);//单次计数模式
TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期性计数模式
TimerLoadSet(TIMER0_BASE, 2222222- 1);//设定预装栽值
IntEnable(INT_TIMER0A);  //使能TIMER0A
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); //TIMEOUT标志位触发中断
  //TIMER0A开始计数当计数值等于TimerLoadSet触发中断
*/
同GPIO口的配置一样的常的配没是结构体类型的配置TI还是调用函数进信置
PWM模式
通用定时器支持简单的PWM生成模式在 PWM 模式中定时器被配置为 24 换 48 位递减计数器也就是说在定时器里面就有这个功能配置好以后就直接输出PWM而不像常一样配置好定时器之后还要一个TIM_SetCompare1函数来进行PWM的输出
注意除了前面介绍的不同点之后与32还有一个很大的区别就切要进行中断的执行相关功能时候需要自己调用TimerIntRegister函数来注册中断函数的名字这样中喜有入口如果不需要忽略即可同时在使能中断时候和32一样需要开启一些中断
PWM相关
PWM简介
TI有2个PWM模块每个模块由4个PWM发生器模块和一个控制器模块组成一部以产生16个PWM输出每个发生器模块都能够产生2个PWM信号这两个信号是基于同一个定时器和德ʣ部以配置成单独产生信号PWM模块发生器产生的两个信号为PWMA和PWMB
以下为结构图
功能描述
  • 时钟选择系统时钟和预分系统时钟
  • PWM定时器
每个PWM发生器中都有区别与通用定时器的定时器在向录数模式或向上/向录数模式
  • PWM比较器
每个PWM发生器都有两个比较器具体功能和32一样就不再累浮
  • PWM信号发生器
初始化及配置

首先还是32的
/*
              TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
              TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
              TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
              TIM_OC2Init(TIM3, &TIM_OCInitStructure);
              TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
*/

其问TI的
/*
//单独配置的系统时钟
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
//配置引脚为PWM功能
syslPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF3_M1PWM7);
GPIOPinTypePWM(GPIOF, Pin3);
//配置 PWM1 Generator3发生器
PMGenConfigure(PWM1_BASE, PWM_GEN_3, PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
//配置 PWM1 Generator3 周期
PWenPeriodSet(PWM1_BASE, PWM_GEN_3, SysCtlClockGet()/freq - 1);
//配置 PWM1 Generator3占空比
PMPulseWidthSet(PWM1_BASE, PWM_OUT_7, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*duty - 1);
//使能PWM1的输出
PWOutputState(PWM1_BASE, PWM_OUT_7_BIT, true);
//使能 PWM1 发生器模块
PMGenEnable(PWM1_BASE, PWM_GEN_3);
*/
还是和前面一样32的PWM配置过程是结构体类型的而TI则还是库函数来进信置的有一点档注意哦TI在配置PWM时候不需要进行IO口的从门置和映射等相关操作只要找到对应的IO口就可以输出信号
UART通信相关
微控制器的UART简介
TI控制器配备了多达路的UART其基本功能和常差不多具体功能可以参考32相关文档


这部分我们先来看32和TI的配置从配置中找不同的地方加以说明

首先是32配置
/*
USART_InitStruct.USART_BaudRate=arr;
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;
USART_InitStruct.USART_Parity=USART_Parity_No;
USART_InitStruct.USART_StopBits= USART_StopBits_1;
USART_InitStruct.USART_WordLength= USART_WordLength_8b;
USART_Init(USART2, &USART_InitStruct);

              USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
              USART_Cmd(USART2, ENABLE);
*/
32的配置过程就不加以叙述

TI的配置
    SCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);              //使能GPIO
              SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART0
              GPIOPinConfigure(GPIO_PA0_U0RX); //从GPIO
              GPIOPinConfigure(GPIO_PA1_U0TX);
              GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);//
              UARTClockSourceSet(UART0_BASE,UART_CLOCK_PIOSC);//选择串口时钟来源
              UARTStdioConfig(0,115200,16000000);//选择模式波特率和时钟大小
*/

从配置上可以看出32和TI的 配置都切要将UART的端口映射到对应的GPIO口上当然了配置过程依旧是常为结构体TI为调用库函数但是在配置时候常不要进行相关NVIC中断配置设置中断优先级设置停止位等等TI的配置就是以上切函数其他的功能都是默认如果需要可以进行自行查找配置

这里还涉及到了端口从áTI的端口从很简单不用像32一样先进行各种IO口的配置直接用函数SCtlPeripheralEnable() 使能相关IO口的时钟GPIOPinConfigure() 函数里选择相应从的功能即可完成配置
总的来说从是在你要使用的外设功能函数里面进行的不需要像32一样拿出来进信置来使用
基于UART通信等相关知识点可以先熟悉常的通信知识点后来使用TI则会变得容易许多

Word格式文档51黑下载地址
Ti-STM32-C51.rar (1.57 MB, 下载问: 5)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机坛网

快速回复 返回顶部 返回列表
ձһhƬձƵ ձƵɫwww ձƵ:ɫ