MSPM0G3507——LED、时钟及按键的使用

电赛小白,随便写一写作为电赛的笔记——

开发板长这样:

一、控制LED灯

1.1 配置引脚

        在开发板上自带一个LED小灯,其对应的端口为PORTA-14,先在System config 里去设置对应的引脚:

在Tools里找到Sysconfig,点开,跳转到TI的设置界面(注意:这里必须在.syscfg的文件下打开才可以,否则会报错):

① 点击GPIO按钮

② 点击ADD添加端口

③ 设置GPIO名称,并设置为PORTA(如果想要的引脚为Bx,则设为PORTB)

④ 设置引脚名称,并将方向设置为OUTPUT,设置初始值为Cleared(初始为关闭状态)

        注:当然如果想设初始状态为开启的话就设为Set

⑤ 设为下拉沿(与板子内部的结构有关)

⑥ 设定引脚为14

设置完毕以后保存,回到Keil的界面,会有一个弹窗,提示有修改,此时点击Yes to All。

1.2 编写程序

控制GPIO的语句有三个,分别是:

DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);        //设置GPIO为高电平
DL_GPIO_clearPins(LED_PORT,LED_PIN_0_PIN);      //设置GPIO为低电平
DL_GPIO_togglePins(LED_PORT ,LED_PIN_0_PIN);    //翻转电平

由于前边的设置,setPin时小灯就会亮,clearPin时小灯就会熄灭。

二、系统时钟

        系统时钟是一个非常重要的手段,它有板子自动处理,等达到设定的时间后便会发起一次中断,基于中断,我们可以执行其它的操作。

2.1 配置时钟

        还是在Syscfg中,这一次找到SYSTICK,在里边设置Period的值,这里系统会根据设定的值去计算出每一次中断间隔的时间,不过输入的值有一个范围。

2.2 编写程序

保存之后,在Keil里边编写程序:

void SysTick_Handler(void){  }

        这个程序是系统自带的时钟中断的程序,比如在我设定的情况下,每隔1.00ms就会发起一次中断,结合前边LED的程序,就可以实现通过时钟控制小灯亮灭的效果。

#include "ti_msp_dl_config.h"

volatile unsigned int delay_times = 0;
void delay_ms(unsigned int ms);

int main(void)
{

    SYSCFG_DL_init();                            
	DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);                 //设定初始状态为高电平
    while (1)
    {
			DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);
			delay_ms(1000);
			DL_GPIO_clearPins(LED_PORT,LED_PIN_0_PIN);
			delay_ms(1000);
    }
}


void delay_ms(unsigned int ms)                               //计时函数
{
    delay_times = ms;
    while( delay_times != 0 );
}

void SysTick_Handler(void)                                   //时钟中断函数
{
   	 if( delay_times != 0 )
    {
        delay_times--;
    }
}

        通过这样的函数,可以让LED小灯每隔1s切换一次状态,但我认为这样的写法有点呆,在delay的一秒钟内,我们无法干任何事,显然这样降低了程序的灵活性,因此还需要修改一下:


void toggle();

int main(void)
{
    SYSCFG_DL_init();
    DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);
    while (1)
    {
			
    }
}

void toggle(){
    DL_GPIO_togglePins(LED_PORT,LED_PIN_0_PIN); // ???? LED ??
}

void SysTick_Handler(void)
{
    toggle();
}

        将时钟中断设为500ms一次(好像设不到1s),这样在主程序里不需要写任何的代码,只通过时钟中断就可以实现小灯亮灭的交替。效果如下:

        本来还想尝试另一种做法,但是好像不太成功……

#include "ti_msp_dl_config.h"                      //不太成功的方法

int mask=1;
void toggle();

int main(void)
{

    SYSCFG_DL_init();
	DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);
    while (1)
    {
		toggle();
    }
}

void toggle(){
	if(mask == 0){
		DL_GPIO_togglePins(LED_PORT,LED_PIN_0_PIN);
		mask=1;
	}
}


void SysTick_Handler(void)
{
   	mask=0;
}

        理论上初始mask为1,每次中断(0.5s)会让mask变为0,而每次只要检测到mask为0就翻转一次状态,但是输出结果却是LED灯常亮。如果有大佬的话能不能帮我解决一下QAQ。

三、 按钮设置

3.1 配置引脚

        在板子中自带了一个BSL的按钮,对应的引脚是PORTA-18,这一次是作为Input端使用的,所以将Direction设置为Input即可,其它的不变:

3.2 工作原理

        简述一下工作原理,当按键按下时,该引脚变为高电平状态,松开时引脚为低电平状态。通过检测电平的高低来判断按键是否被按下,从而可以对其他设备进行控制。

        但按键过程中存在抖动,因此要进行消抖处理。目前掌握的方法是通过软件的形式引入一个延时,将按下后的一段时间抹掉,从而使其达到稳定的状态。

3.3 编写程序

#include "ti_msp_dl_config.h"

volatile unsigned int delay_times = 0;                                
void delay_ms(unsigned int ms);                                        //延时程序用于消抖
void toggle(){                                                         //翻转程序
	if( DL_GPIO_readPins(BUTTON_PORT, BUTTON_PIN_1_PIN) > 0 ){
						
           DL_GPIO_togglePins(LED_PORT ,LED_PIN_0_PIN); 
						delay_ms(250);
         }
};


int main(void)
{

    SYSCFG_DL_init();
	DL_GPIO_setPins(LED_PORT,LED_PIN_0_PIN);
    while (1)
    {
	    toggle();
    }
}


void delay_ms(unsigned int ms)
{
    delay_times = ms;
    while( delay_times != 0 );
}

void SysTick_Handler(void)
{
   	 if( delay_times != 0 )
    {
        delay_times--;
    }
}

        在toggle程序中,如果检测到了高电平,那么就翻转一次,翻转后设定一定的时延用于消抖,这样就实现了每按下一次就翻转一次LED状态的操作。效果如下:

以上就是今天的学习成果,如果有不正确的地方,望批评指正。

参考资料:立创开发板开源资料——立创开发板技术文档中心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值