电赛小白,随便写一写作为电赛的笔记——
开发板长这样:
一、控制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状态的操作。效果如下:
以上就是今天的学习成果,如果有不正确的地方,望批评指正。
参考资料:立创开发板开源资料——立创开发板技术文档中心