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;
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...