DSPF28335学习笔记1——点亮LED

1、F28335的GPIO介绍

        GPIO( general purpose intput output) 是通用输入输出端口的简称,可以通过软件来控制其输入和输出。在本次点灯实验中只需要GPIO输出高低电平就可以控制LED的亮灭。

        F28335的GPIO占用了芯片大部分引脚,共88个,分为三组,A 组:GPIO0-GPIO31,B 组:GPIO32-GPIO63,C 组:GPIO64-GPIO8,并且每一个GPIO都具备复用功能,只要通过相应的寄存器设置即可配置对应的复用功能,同一时刻,每个引脚只能使用该引脚的一个功能。

2、GPIO 结构框图

       现在我们详细地了解GPIO内部的结构。下面就以A 组GPIO 为例来分析GPIO 的工作原理,
至于B 和C 组是一样的。GPIO 结构如下图所示:

从上图可以看出GPIO 内部结构还是比较复杂的。

①GPIO上拉控制寄存器

从图中最左侧圈内GPIO - GPIO27 为GPIO 引脚,在其上方位置有个PU,表示PULL UP 是上拉的意思,也就是这些GPIO 引脚是通过软件可编程控制其电平是否上拉。

②GPIO方向控制寄存器

GPADIR寄存器控制着控制GPIO 作为输入还是输出,可以通过方向寄存器GPxDIR 配置数字量IO 的方向。

③数据寄存器:GPIO的输入或者输出值都存放在该寄存器中。

④GPIO复用功能:通过GPAMUX选择GPIO是否复用,00为为通用I /O 引脚,01 、10 、11 分别为外设l 、2 、3 引脚。

⑤滤波电路:

GPIO 输入可以通过量化寄存器GPxQUAL 对输入信号进行量化限制,从而可以消除数字量IO 引脚的噪声干扰,得到较准确的GPIO输入数据。。

滤波原理:

       在限制选择器(GPAQSEL1、GPAQSEL2)中信号采样次数被指定为3 个采样或6 个采样,当输入信号在经过3 个或6 个采样周期都保持一致时,输入信号才被认为是个有效信号,否则保持原来的状态不变。我们以下图为例:

      从图中可以看到GPIO 输入信号中有1 个较窄脉冲,因为其持续时间没到采样数3 个采样周期或6 个采样周期,所以认为该脉冲是干扰信号,采样信号保持原先状态不变,这样起到了滤波作用,但同时,采样信号在初始时会延迟设置的采样数周期,因为需要经过3个或6个采样周期后才确认有效信号,采样信号才做有效变化。凡是滤波,用硬件或软件都会或多或少引入信号延迟。

3.实验代码及解释

本次所使用的是妍旭的板子,其LED连接关系:D1-GPIO6,D2-GPIO7.

/*
 * led.h
 *
 *  Created on: 2023年10月15日
 *      Author: Mr.Z
 */

#ifndef LED_H_
#define LED_H_
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#define LED1_OFF (GpioDataRegs.GPASET.bit.GPIO6=1)//LED1-GPIO6
#define LED1_ON (GpioDataRegs.GPACLEAR.bit.GPIO6=1) //
#define LED1_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO6=1) //

#define LED2_OFF (GpioDataRegs.GPASET.bit.GPIO7=1)//LED1-GPIO7
#define LED2_ON (GpioDataRegs.GPACLEAR.bit.GPIO7=1)
#define LED2_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO7=1) //

void LED_Init(void);

#endif /* LED_H_ */
/*
 * led.c
 *
 *  Created on: 2023年10月15日
 *      Author: Mr.Z
 */

#include "led.h"

void LED_Init(void)
{
	EALLOW;

	//led1-gpio6
	GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;//不开启io复用功能
	GpioCtrlRegs.GPADIR.bit.GPIO6=1;//io输出
	GpioCtrlRegs.GPAPUD.bit.GPIO6=0;//上拉io口 0-上拉;1-禁止上拉

	//led2-gpio7
	GpioCtrlRegs.GPAMUX1.bit.GPIO7=0;//不开启io复用功能
	GpioCtrlRegs.GPADIR.bit.GPIO7=1;//io输出
	GpioCtrlRegs.GPAPUD.bit.GPIO7=0;//上拉io口 0-上拉;1-禁止上拉

	EDIS;
}
/*
 * main.c
 */
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "led.h"

int main(void)
{
	InitSysCtrl();//各外设时钟初始化函数
	LED_Init();
	while(1)
	{
		LED1_TOGGLE;
		LED2_TOGGLE;
		DELAY_US(1000000);
	}
	return 0;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DSPF28335芯片中,有三个可编程定时器(Timer0、Timer1和Timer2),每个定时器都可以用来产生定时中断。以下是使用Timer1产生1秒定时的步骤: 1. 配置时钟源:使用CPU时钟作为定时器时钟源。可以通过以下代码实现: ``` EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 停止定时器时钟 EDIS; CpuTimer1Regs.TCR.bit.TSS = 1; // 停止定时器1 CpuTimer1Regs.TCR.bit.TRB = 1; // 复位定时器1 CpuTimer1Regs.TCR.bit.TIE = 0; // 禁用定时器1中断 CpuTimer1Regs.TCR.bit.TIF = 0; // 清除定时器中断标志位 CpuTimer1Regs.PRD.all = 150000000; // 1秒钟产生一个中断 CpuTimer1Regs.TCR.bit.TSS = 0; // 启动定时器1 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 启动定时器时钟 EDIS; ``` 2. 配置中断:将Timer1的中断向量映射到ISR函数并使能中断。可以通过以下代码实现: ``` EALLOW; PieVectTable.TIMER1_INT = &Timer1_ISR; EDIS; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // 使能Timer1中断 IER |= M_INT1; // 使能CPU中断1 ``` 3. 实现中断服务程序:编写一个名为Timer1_ISR的函数,用于在定时器中断时执行任务。例如: ``` __interrupt void Timer1_ISR(void) { // 执行任务 // ... CpuTimer1Regs.TCR.bit.TIF = 1; // 清除定时器中断标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 确认中断已经完成 } ``` 以上步骤完成后,每当Timer1达到计数值150000000时,就会触发一个中断,执行Timer1_ISR函数中的任务。因此,Timer1被配置为每秒触发一次中断。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值