Tm4c123GX(tiva)入门详细教程

TM4C123GX系列

      

       学了几个月的Tiva,总的来说这个款单片机功能还是比较强大的。下面我将以TM4C123GH6PM为例介绍其基本资源及工程建立,点亮板卡上的LED灯以及对基本的时钟配置、PWM、uart、Timer等方面来做简要说明。

     注:编译器默认开启FPU功能

源码链接

https://download.csdn.net/download/qq_42263796/11256478

1.基本资源

TM4C123GH6PM,具有最高主频80MHz,100指令速度,256k闪存,8个串口,2个PWM模块,4个PWM发生器,可以产生16路PWM波,6个16/32位通用定时器,和6个32/64位通用定时器。

具体可以查看datasheet。

2. 建立一个TIVA工程

在这里默认CCS已经安装好了,我用的是CCS8。

下载Tivaware,网址为:

http://www.ti.com.cn/tool/cn/SW-TM4C?keyMatch=tivaware&tisearch=Search-CN-Everything

如果不是内存特别小,建议下载完全版。

下载后,安装的位置建议和CCS路径一致。我安装的位置如下图所示。

安装完成后打开CCS,这里安装好后还需要link Tivaware。如图,打开Resource Explorer Classic。

然后点击+号位置,添加刚刚安装的Tivaware。然后重启CCS。

 

接下来新建一个工程。File->New->CCS Project

在创建工程页面选择所用板卡的型号,注意选择Connection。结果如下图所示。

这样一个工程就新建完成了。

 

 3.  额外情况

       Tivaware的库没有link成功,编译报错,那么需要自己手动添加。手动添加步骤如下。

       右击工程名字,选择properties。如下

      然后依次选择CCS Build->ARM Compiler->include Options,点击+号,browser添加tivaware文件。

 

 

       然后是添加driverlib。ARM Linker,Flie Search Path。步骤同上。路径如下图所示。

点击OK,然后点击Apply and Close。这样手动配置就完成了。

4. 点亮LED灯

首先配置时钟为80MHz(默认主频16MHz)。源码看附录。

//使用PLL倍频到400MHz经过5分频得到80MHz    SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

获取当前时钟频率,

clk=SysCtlClockGet();

延时,这里的延时是每三个时钟周期计数一次,所以要除以3

SysCtlDelay(SysCtlClockGet()*0.2/3);     //0.2s

我们用的板卡的灯引脚对应为PF1,PF2,PF3,使能外设,设置引脚方向为输出。

//使能TOMER0外设

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);       //使能外设

    //使能GPIOF外设 PF1 PF2 PF3

   GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);

    点灯,代码如下。红绿蓝依次点亮。

    while(1)

    {

        GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 2);

        SysCtlDelay(SysCtlClockGet()*0.2/3);     //0.2s

       GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 4);

       SysCtlDelay(SysCtlClockGet()*0.2/3);     //0.2s

       GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 8);

       SysCtlDelay(SysCtlClockGet()*0.2/3);     //0.2s

}

所用头文件如下:

#include <stdio.h>

#include <stdint.h>

#include <stdbool.h>

#include "inc/tm4c123gh6pm.h"

#include "inc/hw_memmap.h"

#include "driverlib/debug.h"

#include "driverlib/fpu.h"

#include "driverlib/gpio.h"

#include "driverlib/sysctl.h"

4. PWM

如图所示,Tiva的PWM模块,两个PWM模块,4个PWM发生器gen,还有死区发生器,可产生16路PWM波。源码看附录。

     https://img-blog.csdnimg.cn/20190624170408169.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjYzNzk2,size_16,color_FFFFFF,t_70 ​    

 //设置PWM时钟为系统时钟的1分频

      SysCtlPWMClockSet(SYSCTL_PWMDIV_1);

//配置PWM0模块

SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);

//使用B系列的 GPIO口输出PWM

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

//相应的GPIOPWM功能

GPIOPinConfigure(GPIO_PB4_M0PWM2);

GPIOPinConfigure(GPIO_PB5_M0PWM3);

//配置引脚为PWM功能

    GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_4|GPIO_PIN_5);

//  GPIOPinTypePWM(GPIO_PORTB_BASE, GPIO_PIN_6);

    //配置PWM发生器

   PWMGenConfigure(PWM0_BASE, PWM_GEN_0,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);

   //配置PWM周期,发生器0

   PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 4096);

//配置PWM占空比

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_2, 500);

PWMPulseWidthSet(PWM0_BASE,PWM_OUT_3, 1500);

//配置死区时间

PWMDeadBandEnable(PWM0_BASE, PWM_GEN_0,12,12);           //100ns

//使能PWM0输出

PWMOutputState(PWM0_BASE, PWM_OUT_2_BIT| PWM_OUT_3_BIT,true);

//使能PWM发生器模块

PWMGenEnable  (PWM0_BASE,PWM_GEN_0);

     

5.TimerA

二话不说直接贴代码。

SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

        //使能TIMER0

 

        //TimerConfigure(TIMER0_BASE, TIMER_CFG_ONE_SHOT);//单次计数模式

        TimerConfigure(TIMER0_BASE, TIMER_CFG_A_PERIODIC);//周期性计数模式

        TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);//周期性计数模式

        TimerLoadSet(TIMER0_BASE, TIMER_A,SysCtlClockGet() / 10 - 1);//计数频率10HZ

        IntEnable(INT_TIMER0A);//NVIC

        //使能TIMER0A

        TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

        //TIMEOUT标志位触发中断

        IntMasterEnable();

        //为定时器指定中断处理函数

        TimerIntRegister(TIMER0_BASE,TIMER_A,Timer0IntHandler);

    //master interrupt enable API for all interrupts

        TimerEnable(TIMER0_BASE, TIMER_A);

    //TIMER0A开始计数,当计数值等于TimerLoadSet,触发中断

定时器服务函数如下:

void Timer0IntHandler(void)

{

        TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);

       //清除标志位

   //这里写服务函数进行的操作

}

6. Uart

这里将uart设置波特率为115200,用的是A0和A1,

void initialize_uart()

{

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    GPIOPinConfigure(GPIO_PA0_U0RX);

    GPIOPinConfigure(GPIO_PA1_U0TX);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    UARTClockSourceSet(UART0_BASE,UART_CLOCK_PIOSC);

    GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);

    UARTStdioConfig(0,115200,16000000);

}

使用这个库函数就可以在电脑终端收到信息。

UARTprintf("hello wcs");

7. Button

思路就是使用GPIOPinRead(uint32_t ui32Port, uint8_t ui8Pins);

检测上升沿或者下降沿。

源码可以看附录。

7. 总结

以上介绍了TM4C123GH6PM基本功能的使用。比较简单,读者可结合芯片手册进一步学习。

8. 附录

源码链接

https://download.csdn.net/download/qq_42263796/11256478

 

猜你喜欢

转载自blog.csdn.net/qq_42263796/article/details/93494690