MSP430F5529单片机入门学习笔记1
创始人
2024-06-01 12:04:54
0

本笔记整理自B站教程MSP430F5529单片机学习视频汇总

基于库函数的开发—GPIO库函数

右边部分写错了,看的时候注意

基于库函数的开发—GPIO实践操作

LED交替闪烁

#include 
/** EXP-GPIO-01.C**  Created on: 2023年3月10日*      Author: ASUS*/#include "driverlib.h"void main(void)
{//关闭看门狗WDT_A_hold(WDT_A_BASE);//设置P1.0为输出(LED1)GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);//设置P4.7为输出(LED2)GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);//设置P1.0输出高电平(LED1点亮)GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);//设置P4.7输出低电平(LED2熄灭)GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN7);while(1){//取反P4.7引脚的输出GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN7);//取反P1.0引脚的输出GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);//软件延迟__delay_cycles(1000000);}
}

注意#include“driverlib.h”头文件时要注意:

  • 添加MSP430F5xx_6xx文件夹到当前工程下

MSP430F5xx_6xx文件夹是在导入的msp430ware_3_80_13_03包中找

  • 把上述MSP430F5xx_6xx文件夹的路径包含进来

按键控制LED

#include 
/** EXP-GPIO-02.C**  Created on: 2023年3月10日*      Author: ASUS*/#include "driverlib.h"void main(void)
{//关闭看门狗WDT_A_hold(WDT_A_BASE);//设置P1.0为输出(LED1)GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);//设置P4.7为输出(LED2)GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN7);//设置P1.0输出低电平(LED1熄灭)GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);//设置P4.7输出低电平(LED2熄灭)GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN7);//设置P2.1为输入,上拉(S1)GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN1);//设置P1.1为输入,上拉(S2)GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN1);while(1){//没有按键按下时,为高电平;按键按下时为低电平if((GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)) ||(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1))){//软件延时,相当于是按键消抖__delay_cycles(5000);if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1)){//等待按键释放while(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN1));//改变LED1的状态,(取反P1.0引脚的输出)GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);}if(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1)){//等待按键释放while(GPIO_INPUT_PIN_LOW == GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN1));//改变LED1的状态,(取反P4.7引脚的输出)GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN7);}}//软件延时__delay_cycles(5000);}}

单个LED闪烁

#include 
/** EXAMPLE007.C**  Created on: 2023年3月10日*      Author: ASUS*//*** main.c*/void main(void)
{unsigned i, j;WDTCTL = WDTPW | WDTHOLD;   //stop watchdog timer关闭看门狗P4DIR |= BIT7;  //p4.7方向设置为输出P4OUT |= BIT7;  //p4.7输出高电平,点亮LEDP4OUT &= ~BIT7; //p4.7输出低电平,熄灭LEDwhile(1){P4OUT |= BIT7;  //p4.7输出高电平,点亮LEDfor(i = 60000; i > 0; i --){for(j = 200; j > 0; j --)   //延时{;}}P4OUT &= ~BIT7; //p4.7输出低电平,熄灭LEDfor(i = 60000; i > 0; i --){for(j = 200; j > 0; j --)   //延时{;}}}}

时钟系统(UCS:Unified Clock System)

有三个系统时钟可以选择ACLK、SMCLK、MCLK

VLOCLK、DCOCLK、DCOCLKDIV、REFOCLK是内部时钟源

VLOCLK受温度变化影响较大;DCOCLK、DCOCLKDIV稳定度稍微高一点;REFOCLK稳定度更高,是经过内部修整之后的

上电之后MCLK、SMCLK时钟信号默认来自DCOCLKDIV时钟源,这是DCOCLK经过2分频得到的,ACLK主要来自XT1CLK

MCLK时钟信号默认来自DCOCLKDIV时钟源,这题的表述可能不是很准确

时钟源如果来自LFXT1低频晶振,当低频晶振发生故障,不工作,系统会自动切换到REFOCLK(32768),场景2也同理,这是系统的防护机制

TimerA定时器基本功能

LED1通过定时器控制不断闪烁

/** TimerA.C**  Created on: 2023年3月11日*      Author: ASUS*/#include int main(void)
{//关闭看门狗WDTCTL = WDTPW + WDTHOLD;//引脚设置为输出P1DIR |= 0x01;//使能CCR0中断TA0CCTL0 = CCIE;//设置计数值TA0CCR0 = 50000;//选择时钟源,选择工作模式TA0CTL = TASSEL_2 + MC_1 + TACLR;//进入LPM0,开启全局中断__bis_SR_register(LPM0_bits + GIE);__no_operation();}//Timer0 A0中断服务函数
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{//引脚P1.0的输出取反P1OUT ^= 0x01;
}

TimerA工作模式和中断

定时器控制红色LED闪烁

具体要求

解题思路

请思考,用软件延时的方式,有利弊?

代码示例

#include 
/** TimerA_LED.C* 代码示例1:采用溢出中断的方式*  Created on: 2023年3月11日*      Author: ASUS*/int main(void)
{//停用看门狗WDTCTL = WDTPW + WDTHOLD;//P1.0设置为输出P1DIR |= BIT0;//设置开始计数值;16384 / 32768 = 0.5s,65535-16384TA0R = 65535 - 16384;//选择ACLK,连续计数模式,不要清除TARTA0CTL = TASSEL__ACLK + MC_2 + TAIE;//开启中断_EINT();while(1){__no_operation();   //调试用}
}//Timer0 A1中断服务函数
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{switch(__even_in_range(TA0IV, 14)){case 0:     //无中断break;case 2:     //CCR1中断break;case 4:     //CCR2中断break;case 6:     //CCR3中断break;case 8:     //CCR4中断break;case 10:    //CCR5中断break;case 12:    //CCR6中断break;//溢出中断case 14:TA0R = 65535 - 16384;P1OUT ^= BIT0;break;default:break;}
}
#include 
/** TimerA_LED2.C**  Created on: 2023年3月11日*      Author: ASUS*/unsigned char u8_count_10ms;int main(void)
{//停用看门狗WDTCTL = WDTPW + WDTHOLD;//P1.0设置为输出P1DIR |= BIT0;//使能CCR0中断TA0CCTL0 = CCIE;//设置目标计数值TA0CCR0 = 10000;        //10ms//选择SMCLK,增计数模式,清除TARTA0CTL = TASSEL__SMCLK + MC_1 + TACLR;u8_count_10ms = 0;//开启中断_EINT();while(1){__no_operation();}
}//Timer0 A0中断服务函数
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{u8_count_10ms ++;if(u8_count_10ms >= 50){P1OUT ^= BIT0;          //P1.0的输出取反u8_count_10ms = 0;}
}
#include 
/** TimerA_LED3.C**  Created on: 2023年3月11日*      Author: ASUS*/int main(void)
{//停用看门狗WDTCTL = WDTPW + WDTHOLD;//P1.0设置为输出P1DIR |= BIT0;//使能CCR0中断TA0CCTL0 = CCIE;//设置目标计数值TA0CCR0 = 50000;                                        //500ms//选择SMCLK,增计数模式,清除TARTA0CTL = TASSEL__SMCLK + ID__2 + MC_1 + TACLR;          //ID__2表示2分频TA0EX0 = TAIDEX_5;                                      //TAIDEX_5表示5分频,加起来10分频//开启中断_EINT();while(1){__no_operation();}
}//Timer0 A0中断服务函数
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)                        //每500ms进一次中断
{//P1.0的输出取反P1OUT ^= BIT0;
}

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...