MSP430-GRACE 实战(二):按键中断

举报
JeckXu666 发表于 2022/01/14 23:14:14 2022/01/14
【摘要】 文章目录 MSP430-GRACE 实战(二):按键中断一、开发平台1.1 硬件平台1.2 软件平台 二、原理分析三、GRACE 配置3.1 新建工程(通用步骤)3.2 配置时钟(通用步骤)...

MSP430-GRACE 实战(二):按键中断

Grace 是 Graphical Code Engine 的缩写,是 TI 为了方便用户开发 MSP430 提供的图形化代码配置工具,但是目前只有部分 MSP430 的型号支持 Grace,如 G2 系列

本系列文章使用 Grace 配置 MSP430 外设,快速实现功能,帮助大家进一步了解 MSP430

文章侧重点是功能的使用,寄存器原理只有部分的阐述,适合有一定基础同学(不论是 STM32还是MSP430基础),深入的原理需要自行探索

工程中有所有实践 Demo 都有通用步骤,熟悉的同学可以直接跳过

一、开发平台

1.1 硬件平台

MSP430G2553 口袋实验平台:

20211222120039

1.2 软件平台

是 TI 公司推出的集成开发环境:CCS V5.5(Code Composer Studio)

仅 5 和 6 版本支持

20211222174735

二、原理分析

首先看一下按键的接口:

20211222175340

按键对应的接口是 P1.3 接口,读取按键可以使用扫描读取和中断读取,此处我们使用中断读取方式,按键按下时触发中断,编写中断处理函数,在中断中设置对应的标志位,主函数根据标志位进行点灯操作,对 MSP430 来说按键输入中断步骤如下:

  1. 配置系统时钟,使单片机能稳定运行
  2. 通过 PxDIR 将 IO 方向设为输入
  3. 通过写 PxIES,决定中断的边沿是上升沿、下降沿 或两种情况均中断
  4. 如果是机械按键输入,可以通过 PxREN 启用内部上下拉电阻,根据按键的接法,设定 PxOUT(决定最终是上拉电阻还是下拉电阻)
  5. 通过配置 PxIE 寄存器开启 IO 中断,通过“_enable_interrupts();”开启总中断
  6. 在中断子函数中,通过 if 语句查询具体中断的 IO 口
  7. 根据具体 IO 的输入,编写事件处理函数
  8. 退出中断前,使用 PxIFG = 0 来清除 IO 中断标志位

其中前5个配置我们都可以使用 Grace 进行配置,后面的则需要我们在代码逻辑中编写

三、GRACE 配置

3.1 新建工程(通用步骤)

点击新建 CCS 工程:

20211222180014

配置工程信息:

20211222180211

工程建立完成:

20211222180306

3.2 配置时钟(通用步骤)

点击 main.cfg 下面的 Device Overview,进去后 Device Overview 颜色会变淡:

20211222180408

我们看到设备界面有个 DVCC 的设置,默认显示 1.8V,这个根据实际单片机供电设置,我这里设置 3.3V,因为 Grace 要知道单片机的实际供电电压,因为在低电压情况下,某些外设不能使用,Grace 会自动屏蔽配置该外设的功能,之后点击 BCS+(Basic Clock System+) 模块配置时钟,点击后弹出 Overview 界面如下:

20211222194329

其中 introduction 是关于该模块的介绍,下面两个则是两个代码使用例子用作参考

在 Overview 旁边有 BasicUser、Power User、Regisiter三个配置项,区别如下:

Grace 的 Basic User 模式配置时钟,可以配置最基础的功能,界面简单,可以瞬间即可完成高速时钟和低速时钟配置:

20211222194730

Power User 是基于 MSP430 的时钟树,列出了关键的分频倍频等寄存器配置接口,方便我们详细开发:

20211222194930

这里配置我们可以根据 MSP430 的时钟树进行配置:

20211222195054

至于 Regisiter 模式则是以图像化的方式配置 BCS+ 的各个寄存器,适合对寄存器非常了解的人进行开发:

20211222195316

这里我们直接选择第一项进行时钟配置,高速时钟选 12M,低速的的话因为没有 32.768K 晶振,配置 12K 就行,配置后如下:

20211222195843

然后我们 Crtl + S 保存一下配置再编译一下,Grace 会自动根据配置,生成代码:

20211222200434

到这时钟配置完成

3.3 关闭看门狗(通用步骤)

看门狗实际就是一个定时器,只不过在定时到达时,如果 CPU 没有去操作看门狗寄存器,看门狗就会复位单片机,这里我们没有使用到,但系统自动把它使能了,所以要把它关闭,否则会影响程序正常执行,点击看门狗配置项,取消选 Enable 就行,这里我们开启和关闭其他模块都是一样的操作,勾选 Enable 开启,不勾选则关闭:

20211222202728

3.4 输入中断配置

进入到 GPIO 配置,我们将两个 LED 灯的 GPIO 设置为 输出模式,用来控制 LED 灯:

20211223201017

配置 P1.3 设置为输入模式,设置默认上拉,同时开启下降沿中断

20211223201745

之后点击中断代码生成

20211223201859

点击生成后,我们保存一下,然后编译,Grace 会在 InterruptVectors_init.c 中生成中断回调函数

20211223202123

用户的代码逻辑直接在回调函数内编写就行

四、代码编写

4.1 代码编写位置

Grace 在生成的代码中给用户预留了代码编写位置,用户可以在 Grace 生成的初始化代码中自行添加代码,具体位置在如下的注释之间,这样二次生成代码不会覆盖用户代码:

    /* USER CODE START (section: GPIO_graceInit_prologue) */
    /* User initialization code */
    /* USER CODE END (section: GPIO_graceInit_prologue) */

  
 
  • 1
  • 2
  • 3

4.2 按键中断代码

main.c 文件代码

unsigned char state=0;
int main(void)
{
    Grace_init();                   // Activate Grace-generated configuration
    
    // >>>>> Fill-in user code here <<<<<
    while(1)
    {
		if(state == 0)
		{
			P1OUT &= ~BIT0;
			P1OUT &= ~BIT6;
		}else if(state == 1)
		{
			P1OUT |= BIT0;
			P1OUT &= ~BIT6;
		}else if(state == 2)
		{
			P1OUT &= ~BIT0;
			P1OUT |= BIT6;
		}else if(state == 3)
		{
			P1OUT |= BIT0;
			P1OUT |= BIT6;
		}
    	__delay_cycles(10000);
    }
    return (0);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

中断文件代码

/* USER CODE START (section: InterruptVectors_init_c_prologue) */
/* User defined includes, defines, global variables and functions */
extern unsigned char state;
/* USER CODE END (section: InterruptVectors_init_c_prologue) */

//............省略中间代码............//

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR_HOOK(void)
{
    /* USER CODE START (section: PORT1_ISR_HOOK) */
    /* replace this comment with your code */
	if( (P1IFG&(~P1DIR) ) == BIT3)
	{
		state++;
		state %= 4;
	}
	P1IFG=0;

    /* USER CODE END (section: PORT1_ISR_HOOK) */
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

这里代码逻辑就是中断服务函数中对一个标志位(state)累加,主函数循环根据标志位判断执行点灯,这里我没有加上按键防抖,实际使用需要注意

4.3 程序下载(通用步骤)

代码编写完成后,构建代码,然后连接开发板调试仿真程序:

20211222204450

五、实验现象

实验现象就是按键按下后 LED 根据按下次数有不同的显示情况:

key

文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45396672/article/details/122116540

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。