首页 > 其他分享 >DSP28335学习笔记(2)

DSP28335学习笔记(2)

时间:2024-05-04 16:44:35浏览次数:22  
标签:GpioCtrlRegs 笔记 学习 KEY 按键 PRESS bit DSP28335 define

实验

点亮LED灯

  • 电路设计

    共阳极连接

image-20240502144941538

  • 软件设计

    1. 让 F28335 的 GPIO68 管 脚输出一个低电平。
    2. 使能对应 IO 外设时钟、配置 IO功能和输出模式,上拉设置。

    主要程序:

    //LED初始化函数
    void LED_Init(void)
    {
        EALLOW;//关闭写保护
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // 开启GPIO时钟
    
        //LED1端口配置
        GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
        GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
        GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
    
        GpioDataRegs.GPCSET.bit.GPIO68=1;//设置GPIO输出高电平
    
        EDIS;//开启写保护
    }
    //延时函数
    void delay(void)
    {
        Uint16      i;
        Uint32      j;
        for(i=0;i<32;i++)
            for (j = 0; j < 100000; j++);
    }
    
    //主函数
    void main()
    {
        InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟
    
        LED_Init();
    //  GpioDataRegs.GPCCLEAR.bit.GPIO68  = 1;
    
        while(1)
        {
            GpioDataRegs.GPCTOGGLE.bit.GPIO68=1;//设置GPIO输出翻转信号
            delay();
        }
    }
    

蜂鸣器实验

蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。

压电式蜂鸣器(无源蜂鸣器)主要由多谐振荡器、 压电蜂鸣片、 阻抗匹配器及共鸣箱、外壳等组成。需要接通电源(1.5~15V 直 流工作电压),多谐振荡器起振,并输出 1.5~5kHZ 的音频信号,阻抗匹配器推 动压电蜂鸣片发声。

电磁式蜂鸣器(有源蜂鸣器)由振荡器、 电磁线圈、 磁铁、 振动膜片及外壳等组成。接 通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。

  • 硬件电路

    image-20240503140025667

无源蜂鸣器的控制需要给其一定频率的脉冲才能发声, 仅给一个高电平或者低电平是不能发声的,因此蜂鸣器模块电路直接将 F28335 引 脚接在 ULN2003 驱动芯片的输入口上,对应通道的输出连接蜂鸣器。

  • 软件设计

    F28335 的 GPIO6 管脚输出一定频率的脉冲信号。即间隔一定时间翻转 GPIO6 输出电平状态。

    //蜂鸣器初始化
    void Beep_init()
    {
        EALLOW;//关闭写保护
        SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // 开启GPIO时钟
        //LED1端口配置
        GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;//设置为通用GPIO功能
        GpioCtrlRegs.GPADIR.bit.GPIO6=1;//设置GPIO方向为输出
        GpioCtrlRegs.GPAPUD.bit.GPIO6=0;//使能GPIO上拉电阻
    
        GpioDataRegs.GPASET.bit.GPIO6=1;//设置GPIO输出高电平
    
        EDIS;//开启写保护
    }
    //主程序
    void main()
    {
       int i = 0;
        InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟
        LED_Init();
        Beep_init();
    
        while(1)
        {
            i++;
            if(i%1000==0)
            {
                i = 0;
                LED1_TOGGLE;
            }
    
           BEEP_TOGGLE;//设置GPIO06输出翻转信号
            DELAY_US(100);
        }
    }
    

继电器实验

电器是一种电子控制器件,它具有控制系统(又称输入回路)和被控制系统(又称输出回路),通常应用于自动控制电路中,它实际上是用较小的电流去控制较大电流的一种“自动开关”。

  • 硬件设计

image-20240504133332536

  • 软件设计

    1. 让 F28335 的 GPIO15 管脚输出高电平。

    2. 初始化继电器控制 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和输出模式、上拉设置等)。

      //宏定义
      #define RELAY_ON			(GpioDataRegs.GPASET.bit.GPIO15=1)
      #define RELAY_OFF			(GpioDataRegs.GPACLEAR.bit.GPIO15=1)
      //初始化程序
      void Relay_Init(void)
      {
      	EALLOW;
      	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
      
      	//继电器端口配置
      	GpioCtrlRegs.GPAMUX1.bit.GPIO15=0;
      	GpioCtrlRegs.GPADIR.bit.GPIO15=1;
      	GpioCtrlRegs.GPAPUD.bit.GPIO15=0;
      
      	EDIS;
      
      	GpioDataRegs.GPACLEAR.bit.GPIO15=1;
      }
      //主程序
      void main()
      {
      	int i=0;
      
      	InitSysCtrl();
      
      	LED_Init();
      	Relay_Init();
      	RELAY_ON;
      	while(1)
      	{
      		i++;
      		if(i%200==0)
      		{
      			LED1_TOGGLE;
      		}
      		DELAY_US(1000);
      	}
      }
      

矩阵按键控制实验

键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开。

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时 也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间 的长短由按键的机械特性决定的,一般为 5ms 到 10ms。按键稳定闭合时间的长 短则由操作人员的按键动作决定的,一般为零点几秒至数秒。按键抖动会引起按 键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。

image-20240504145524200

按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖

  • 软件消抖(延时)

    先读取按键的状态,如果得到按键按下之后,延时 10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。

  • 硬件消抖

    在这里插入图片描述

    利用电容的放电延时,采用并联电容法,也可以实现硬件消抖。由于电容两端电压不能突变,使得按键两端的电压平缓变化,直至电容充放电到达一定电压阈值时,单片机才读取到电平变化。

    按键按下(高电平->低电平):按键按下,电容与按键形成回路,电容开始放电,当电容放电结束后,抖动就基本结束了。在放电期间,KeyIn1处一直向外输出高电平。

    按键松开(低电平->高电平):按键松开,电容左极板接电源,右极板接地,开始充电,当电容充电结束后,抖动也就基本结束了。在电容充电期间,KeyIn1处一直向外输出为低电平。

  • 矩阵按键工作原理

无论是独立键盘还是矩阵键盘, 单片机检测其是否被按下的依据都是一样 的, 也就是检测与该键对应的 I/O 口是否为低电平。

  • 检测方法

行列扫描法:先送一列为低电平,其余几列全为高电平(此时我们确 定了列数),然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电 平(这时我们又确定了行数),则我们便可确认当前被按下的键是哪一行哪一列 的,用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键,当有键被按下时便可判断出按下的键是哪一个键。

线翻转法:使所有行线为低电平时,检测所有列线是否有低电平,如果 有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值, 由于有按键按下,行线的值也会有变化,记录行线的值。从而就可以检测到全部 按键。

  • 硬件设计

image-20240504151542288

  • 软件设计

    (1)初始化按键 IO 口(使能对应 IO 外设时钟、配置 IO 为普通 IO 功能和 输出模式、上拉设置等)

    (2)按键检测程序

    (3)按键控制程序

    key.h

#ifndef KEY_H_
#define KEY_H_


#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


#define KEY_L1_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL			(GpioDataRegs.GPBCLEAR.bit.GPIO50=1)

#define KEY_L1_SetH			(GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH			(GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH			(GpioDataRegs.GPBSET.bit.GPIO50=1)

#define KEY_H1			(GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_H2			(GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_H3			(GpioDataRegs.GPADAT.bit.GPIO14)

#define KEY1_PRESS		1
#define KEY2_PRESS		2
#define KEY3_PRESS		3
#define KEY4_PRESS		4
#define KEY5_PRESS		5
#define KEY6_PRESS		6
#define KEY7_PRESS		7
#define KEY8_PRESS		8
#define KEY9_PRESS		9
#define KEY_UNPRESS		0


void KEY_Init(void);
char KEY_Scan(char mode);

#endif /* KEY_H_ */

key.c

#include "key.h"

void KEY_Init(void)
{
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

	//KEY端口配置
	GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
	GpioCtrlRegs.GPADIR.bit.GPIO12=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO12=0;

	GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;
	GpioCtrlRegs.GPADIR.bit.GPIO13=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO13=0;

	GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;
	GpioCtrlRegs.GPADIR.bit.GPIO14=0;
	GpioCtrlRegs.GPAPUD.bit.GPIO14=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO48=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO49=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO49=0;

	GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;
	GpioCtrlRegs.GPBDIR.bit.GPIO50=1;
	GpioCtrlRegs.GPBPUD.bit.GPIO50=0;

	EDIS;

	GpioDataRegs.GPBSET.bit.GPIO48=1;
	GpioDataRegs.GPBSET.bit.GPIO49=1;
	GpioDataRegs.GPBSET.bit.GPIO50=1;

}

char KEY_Scan(char mode)
{

	static char keyl1=1;
	static char keyl2=1;
	static char keyl3=1;

	//第1列扫描
	KEY_L1_SetL;
	KEY_L2_SetH;
	KEY_L3_SetH;
	if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);//延时10us,消抖
		keyl1=0;
		if(KEY_H1==0)
		{
			return KEY1_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY4_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY7_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl1=1;
	}
	if(mode)
		keyl1=1;


	//第2列扫描
	KEY_L2_SetL;
	KEY_L1_SetH;
	KEY_L3_SetH;
	if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);
		keyl2=0;
		if(KEY_H1==0)
		{
			return KEY2_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY5_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY8_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl2=1;
	}
	if(mode)
		keyl2=1;


	//第3列扫描
	KEY_L3_SetL;
	KEY_L1_SetH;
	KEY_L2_SetH;
	if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0))
	{
		DELAY_US(10000);
		keyl3=0;
		if(KEY_H1==0)
		{
			return KEY3_PRESS;
		}
		else if(KEY_H2==0)
		{
			return KEY6_PRESS;
		}
		else if(KEY_H3==0)
		{
			return KEY9_PRESS;
		}
	}
	else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1)
	{
		keyl3=1;
	}
	if(mode)
		keyl3=1;

	return KEY_UNPRESS;
}

main.c

#include "DSP2833x_Device.h"    
#include "DSP2833x_Examples.h"  

#include "leds.h"
#include "key.h"

void main()
{
    int i=0;
    char key=0;

    InitSysCtrl();

    LED_Init();
    KEY_Init();

    while(1)
    {
        key=KEY_Scan(0);
        switch(key)
        {
            case KEY1_PRESS: LED2_TOGGLE;break;
            case KEY2_PRESS: LED3_TOGGLE;break;
            case KEY3_PRESS: LED4_TOGGLE;break;
            case KEY4_PRESS: LED5_TOGGLE;break;
            case KEY5_PRESS: LED6_TOGGLE;break;
            case KEY6_PRESS: LED7_TOGGLE;break;
        }

        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}

标签:GpioCtrlRegs,笔记,学习,KEY,按键,PRESS,bit,DSP28335,define
From: https://www.cnblogs.com/youngwuu/p/18172457

相关文章

  • Python进阶篇笔记
    一、面向对象1、面向过程与面向对象面向过程:把程序流程化面向对象:把程序抽象成类,类与类之间有联系2、类与对象对象就是容器,是用来存放数据和功能的,对象就是数据和功能的集合类的作用是吧对象做区分和归类,以及解决不同对象存相同数据的问题。类也是容器,也是用来存放数据和......
  • Qt学习第一篇(windows下安装和代码规范)
    Qt_1QtCreator是Qt公司生产的IDE。它集成了多个工具,包括代码编辑器、图形UI(GUI)设计器、编译器、调试器、Qt设计器、Qt快速设计器和Qt助手等。QtDesigner帮助设计基于小部件的GUI,而QtQuickDesigner提供了在设计模式下创建和编辑基于QML的GUI的UI。Qt......
  • Flink调优初次笔记
    资源配置优化从1.11开始,增加了一个通用客户端模式,(-tyarn-job)TaskManager内存模型Flink既使用堆内存,又使用堆外内存。指定进程内存JVMmetaspace:JVM元空间,默认256MJVM执行内存:执行开销。有最小值和最大值。计算公式为:进程内存*0.1框架内存:堆内和堆外。不计入Slot的资......
  • 基于深度学习网络的鞋子种类识别matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述      基于GoogLeNet深度学习网络的鞋子种类识别是一种利用深度卷积神经网络进行物体识别的方法,特别适用于大规模图像分类问题。GoogLeNet以其独特的Inception模块和高效的层级结构,在Imag......
  • Raft论文阅读笔记.18171971
    本文是对Raft论文阅读后的一些核心内容总结原论文:InSearchofanUnderstandableConsensusAlgorithm(ExtendedVersion)Raft概览Raft论文中用几个表格给出了Raft的细节概览,这里不用仔细阅读,后面学习的时候会慢慢深刻的理解这些内容server持有的状态RPC原语server规......
  • 博客性能优化笔记 | 99分
    闲着没事,拿lighthouse测了一下博客网站的性能评测,发现诊断出的问题还挺多,就顺手优化了一下。这篇文章将记录这个优化的过程。优化前后对比lighthouse检测结果优化前优化后性能面板检测结果FCPDOMContentLoadedLCP优化前764ms1798ms1864ms......
  • Razavi - RF Microelectronics的笔记 - Current-Driven Passive Mixer
    Onpage367,whilediscussingaboutcurrent-drivenpassivemixer,thereisthissaying:theswitchesinFig.6.39(b)alsomixthebasebandwaveformswiththeLO,deliveringtheupconvertedvoltagestonodeA.Iamquiteconfusedonwheredoesthiswave......
  • 统一场理论公式推导和笔记——part6
    三十九,统一场论能量方程1,能量的定义:能量是质点在空间中【或者质点周围空间本身】相对于我们观察者在某个空间范围内【由于时空同一化,也可以说在某一个时间段内】运动的运动量。能量和动量的定义是类似的,反映质点和空间相对于我们观察者的运动程度,所不同的是,动量是矢量,能量是标......
  • 统一场理论公式推导和笔记——part5
    三十七,运动电荷的磁场产生引力场1,匀速直线运动电荷的磁场产生引力场统一场论核心是变化的引力场可以产生电场,反过来,变化的电磁场也可以产生引力场。==》根据爱因斯坦的广义相对论,变化的电磁场确实可以产生引力场,尽管理论上变化电磁场会产生引力场,但由于电磁场的能量相对较小,......
  • FFmpeg开发笔记(十八)FFmpeg兼容各种音频格式的播放
    ​FFmpeg结合SDL可以播放音频文件,也能播放视频文件中的音频流,《FFmpeg开发实战:从零基础到短视频上线》一书第10章的示例程序playaudio.c支持播放mp3和aac两种格式的音频,却不支持播放其他格式的音频。因为mp3和aac两个格式拥有标准的规范定义,比如mp3规定每帧音频固定包含1152个样......