TM4C123GH6PM 芯片功能模块综合实验 - GPIO 控制、定时器中断和 ADC 采样

实验目的:

本实验旨在通过针对 TM4C123GH6PM 芯片三个以上功能模块的设计与实现,掌握该芯片的基本操作及应用,加深对芯片架构的理解,提高嵌入式系统开发能力。

实验器材:

  • TM4C123GH6PM 芯片
  • J-Link 仿真器
  • LED 灯
  • 电阻
  • 电容
  • 按钮开关
  • 面包板
  • 杜邦线
  • 开发板

实验原理:

TM4C123GH6PM 芯片是一款基于 ARM Cortex-M4 内核的微控制器,其具有强大的计算能力和丰富的外设接口。本实验将针对该芯片的三个以上功能模块进行设计与实现,包括 GPIO 口控制、定时器中断、ADC 采样等功能。

1. GPIO 口控制:

GPIO 口是芯片上的通用输入输出引脚,可以用于控制 LED 灯、蜂鸣器、按键等外设。在本实验中,我们将利用 GPIO 口控制 LED 灯的亮灭。

2. 定时器中断:

定时器是芯片中常用的计时器,可以用于计时、定时中断等功能。在本实验中,我们将利用定时器中断控制 LED 灯的闪烁。

3. ADC 采样:

ADC 模块是芯片中的模拟数字转换器,可以将模拟信号转换为数字信号,常用于温度、湿度、光强等传感器的采集。在本实验中,我们将利用 ADC 模块采集光敏电阻的电压值,并通过串口输出。

实验步骤:

1. GPIO 口控制

(1) 将 LED 灯连接到开发板的 PA5 引脚,通过电阻限流。

(2) 在 Keil MDK 软件中新建工程,并选择 TM4C123GH6PM 芯片。

(3) 编写 GPIO 口控制程序,配置 PA5 引脚为输出模式,并通过库函数控制 LED 灯的亮灭。

代码如下:

#include "TM4C123GH6PM.h"

void delay(int n) //延时函数
{
    int i, j;
    for(i=0;i<n;i++)
        for(j=0;j<10000;j++);
}

int main()
{
    SYSCTL->RCGCGPIO |= 0x01; //使能 GPIOA 时钟
    GPIOA->DIR |= 0x20; //PA5 引脚设置为输出
    GPIOA->DEN |= 0x20; //PA5 引脚使能数字功能

    while(1)
    {
        GPIOA->DATA ^= 0x20; //LED 灯翻转
        delay(500);
    }
}

(4) 编译程序并下载到开发板中,观察 LED 灯的亮灭情况。

2. 定时器中断

(1) 将 LED 灯连接到开发板的 PA5 引脚,通过电阻限流。

(2) 在 Keil MDK 软件中新建工程,并选择 TM4C123GH6PM 芯片。

(3) 编写定时器中断程序,配置定时器为 1 秒定时中断,并通过库函数控制 LED 灯的闪烁。

代码如下:

#include "TM4C123GH6PM.h"

void delay(int n) //延时函数
{
    int i, j;
    for(i=0;i<n;i++)
        for(j=0;j<10000;j++);
}

int main()
{
    SYSCTL->RCGCGPIO |= 0x01; //使能 GPIOA 时钟
    GPIOA->DIR |= 0x20; //PA5 引脚设置为输出
    GPIOA->DEN |= 0x20; //PA5 引脚使能数字功能

    SYSCTL->RCGCTIMER |= 0x01; //使能 TIMER0 时钟
    TIMER0->CTL &= ~0x01; //禁用 TIMER0
    TIMER0->CFG = 0x04; //16 位定时器
    TIMER0->TAMR = 0x02; //周期模式
    TIMER0->TAILR = 16000000-1; //1 秒定时
    TIMER0->ICR = 0x01; //清除中断标志位
    TIMER0->IMR = 0x01; //允许 TIMER0 溢出中断
    NVIC_EnableIRQ(TIMER0A_IRQn); //使能 TIMER0 中断

    TIMER0->CTL |= 0x01; //启用 TIMER0

    while(1);
}

void TIMER0A_Handler() //定时器中断服务程序
{
    TIMER0->ICR |= 0x01; //清除中断标志位
    GPIOA->DATA ^= 0x20; //LED 灯翻转
}

(4) 编译程序并下载到开发板中,观察 LED 灯的闪烁情况。

3. ADC 采样

(1) 将光敏电阻连接到开发板的 PA2 引脚和地,通过电容滤波。

(2) 在 Keil MDK 软件中新建工程,并选择 TM4C123GH6PM 芯片。

(3) 编写 ADC 采样程序,配置 ADC 模块采样 PA2 引脚的电压值,并通过串口输出。

代码如下:

#include "TM4C123GH6PM.h"
#include <stdio.h>

void delay(int n) //延时函数
{
    int i, j;
    for(i=0;i<n;i++)
        for(j=0;j<10000;j++);
}

int main()
{
    SYSCTL->RCGCGPIO |= 0x01; //使能 GPIOA 时钟
    GPIOA->AFSEL |= 0x04; //PA2 引脚选择 ADC 模式
    GPIOA->DEN &= ~0x04; //PA2 引脚失能数字功能
    GPIOA->AMSEL |= 0x04; //PA2 引脚使能模拟功能

    SYSCTL->RCGCADC |= 0x01; //使能 ADC0 时钟
    ADC0->PC &= ~0xFF; //清除 ADC0 的配置寄存器
    ADC0->PC |= 0x04; //配置 ADC0 为 125K 采样率
    ADC0->SSPRI = 0x0123; //配置 ADC0 转换顺序
    ADC0->ACTSS &= ~0x08; //禁用 ADC0 的第 3 个采样序列
    ADC0->EMUX &= ~0xF000; //配置 ADC0 的转换触发方式为软件触发
    ADC0->SSMUX3 = 0x00; //配置 ADC0 的第 3 个采样序列为采样 PA2 引脚
    ADC0->SSCTL3 |= 0x06; //配置 ADC0 的第 3 个采样序列为单次采样
    ADC0->IM |= 0x08; //允许 ADC0 的第 3 个采样序列中断
    NVIC_EnableIRQ(ADC0SS3_IRQn); //使能 ADC0 的第 3 个采样序列中断

    while(1)
    {
        ADC0->ACTSS |= 0x08; //使能 ADC0 的第 3 个采样序列
        ADC0->PSSI |= 0x08; //启动 ADC0 的第 3 个采样序列
        while(!(ADC0->RIS & 0x08)); //等待 ADC0 的第 3 个采样序列完成
        printf("ADC Value: %d\r\n", ADC0->SSFIFO3*3.3/4096); //输出采样值
        delay(500);
    }
}

void ADC0SS3_Handler() //ADC 采样中断服务程序
{
    ADC0->ISC |= 0x08; //清除中断标志位
}

(4) 编译程序并下载到开发板中,通过串口工具观察光敏电阻的采样值。

实验结果:

通过本次实验,我们成功地完成了对 TM4C123GH6PM 芯片三个以上功能模块的设计与实现,掌握了该芯片的基本操作及应用,提高了嵌入式系统开发能力。实验中,我们通过 GPIO 口控制 LED 灯的亮灭、定时器中断控制 LED 灯的闪烁、ADC 采样程序采集光敏电阻的电压值,并通过串口输出。

实验结论:

本实验通过对 TM4C123GH6PM 芯片三个以上功能模块的设计与实现,掌握了该芯片的基本操作及应用,提高了嵌入式系统开发能力。通过 GPIO 口控制 LED 灯的亮灭、定时器中断控制 LED 灯的闪烁、ADC 采样程序采集光敏电阻的电压值,并通过串口输出,成功地实现了该芯片的基本功能,加深了对芯片架构的理解。

TM4C123GH6PM 芯片功能模块综合实验 - GPIO 控制、定时器中断和 ADC 采样

原文地址: https://www.cveoy.top/t/topic/oBWx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录