完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
开发环境搭建完成后,就可以开始学习MSP432401R的开发使用了。在开始学习之前最好将芯片手册、开发板手册、SDK手册下载好,想看的时候就可以随时打开来看,快速上手。CCS里的Resource Explorer也是比较方便的工具,把所有相关的文档、例程都整合在了一起,比较方便查看。
输出(OUTPUT) 和学习其他的单片机一样,就从点亮LED开始。MSP432P401R launchpad板子上自带了一个红色LED和一个RGB LED,分别接在P1.0和P2.0、P2.1、P2.2口,如果想单独使用这几个GPIO的话,可以将跳线帽拿掉,使之不与LED相连。 接下来就尝试用代码来点亮这几个LED。之前也在网上看过寄存器版的编程,但是在不是很熟悉而且英语不太好的情况下,还是选择库函数来进行编程,相对而言比较简单而且比较好理解。 库函数的GPIO相关函数也并不是很多,一些看函数名就能够知道相应的功能,点亮LED只需要用到几个函数,下面是相关代码。 #include "msp.h" #include void main(void) { volatile uint32_t i; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // 关闭看门狗定时器 GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); // 将引脚P1.0设置为输出模式 while(1) { // 翻转P1.0引脚电平 GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); // Delay for(i=100000; i>0; i--); } } 以上代码实现的效果是LED每隔一定时间闪烁,通过GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);来实现。下面用电平设定函数来进行实现。 #include "msp.h" #include void main(void) { volatile uint32_t i; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); while(1) { GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0); //引脚P1.0电平拉高 for(i=100000; i>0; i--); GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); //引脚P1.0电平拉低 for(i=100000; i>0; i--); } } 以上代码依旧可以实现让LED闪烁的功能。 接下来尝试点亮RGB三色LED,原理和点亮红色LED相同,但是可以混合出来不同的颜色。 #include "msp.h" #include void main(void) { volatile uint32_t i; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // stop watchdog timer GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0); GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1); GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN2); while(1) { GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0); for(i=100000; i>0; i--); GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0); for(i=100000; i>0; i--); GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1); for(i=100000; i>0; i--); GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1); for(i=100000; i>0; i--); GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2); for(i=100000; i>0; i--); GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2); for(i=100000; i>0; i--); GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0); for(i=100000; i>0; i--); GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1); for(i=100000; i>0; i--); GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2); for(i=100000; i>0; i--); } } 输入(INPUT) 这里使用按键来实现引脚输入功能,通过判断按键的输入来控制LED的亮灭。根据原理图可以得知两个按键一个连接在P1.1上,另一个连接在P1.4上。但是外部的连接电路只有孤零零的一个按键,显然这是不够的,需要一个上拉电阻来保持初始的高电平状态,不然引脚会处于一个不确定的状态,不便判断按键是否按下,这就需要使用芯片的内部上拉电阻。 #include "msp.h" #include void main(void) { volatile uint32_t i; uint8_t keyvalue = 1; WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // stop watchdog timer GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); // 设置引脚P1.0为输出模式 GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); // 设置引脚P1.1为上拉输入模式 while(1) { keyvalue = GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1); if(keyvalue == 0) GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0); else GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0); } } 按下按键LED亮起,松开即熄灭。但是按键或多或少都会存在抖动的问题,按键消抖就不再赘述了。加上延时即可,自行修改代码。 中断(INTERRUPT) 由于一直判断引脚输入电平会使得单片机无法运行其他的程序,因此需要使用中断的方式来进行。以下代码实现的功能是按下按键,红色LED状态变化一次,相比与之前的按键控制LED,单片机可以执行其他的任务,而不是一直在等待按键被按下。 #include "msp.h" #include void PORT1_IRQHandler(void); // 中断函数声明 void main(void) { WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // stop watchdog timer GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0); // 设置引脚P1.0为输出模式 GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1); // 设置引脚P1.1为上拉输入模式 GPIO_interruptEdgeSelect(GPIO_PORT_P1, GPIO_PIN1,GPIO_HIGH_TO_LOW_TRANSITION); //中断跳变沿选择,由于按键没有按下时为高电平,所以是高电平变为低电平 GPIO_clearInterruptFlag(GPIO_PORT_P1,GPIO_PIN1); // 清除中断标志 GPIO_registerInterrupt(GPIO_PORT_P1,PORT1_IRQHandler); // 注册中断函数 GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN1); // 中断使能 while(1) { ; } } void PORT1_IRQHandler(void) // 中断函数 { int i = 0; if(GPIO_getInterruptStatus(GPIO_PORT_P1, GPIO_PIN1) == GPIO_PIN1) // 判断中端口 { GPIO_clearInterruptFlag(GPIO_PORT_P1, GPIO_PIN1); for(i=0;i<100;i++); //消抖 if(GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1) == 0) { GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0); } } } 总结 GPIO的使用是每款单片机最基础而且最重要的功能,这些库函数为我们编写代码提供了很大的便利,不需要再去艰难地查找芯片手册查看寄存器的每个位的功能。初步学下来发现MSP432的编程方式和STM32的非常的相似,如果之前学习过SMT32的话,学习这个学起来会可能轻松一些。 |
|
|
|
只有小组成员才能发言,加入小组>>
3288 浏览 9 评论
2962 浏览 16 评论
3465 浏览 1 评论
9010 浏览 16 评论
4054 浏览 18 评论
1127浏览 3评论
579浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
573浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2306浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1864浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-30 12:31 , Processed in 1.693014 second(s), Total 78, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号