TM4C123GH6PM 芯片功能模块综合实验 - GPIO 控制、定时器中断和 ADC 采样
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 采样程序采集光敏电阻的电压值,并通过串口输出,成功地实现了该芯片的基本功能,加深了对芯片架构的理解。
原文地址: https://www.cveoy.top/t/topic/oBWx 著作权归作者所有。请勿转载和采集!