TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)
配置
第一步:右击工程,选择Options

第二步:在General Options的Target选项卡里选择对应的器件Device,这里是MSP430G2231

第三步:在Debugger里选择FET Debugger:

第四步: 检查FET Debugger里的设置是否正确,这里是Texas Instrument USB-IF采用Automatic方式
这里选择Automatic与Automatic selection,当用串口会自动连接上串口。

第五步:编译程序,下载验证
电赛A题源码
小车代码
/*!
* COPYRIGHT NOTICE
* Copyright (c) 2016,CTGU-GB
* All rights reserved.
*
*
* @file main.c
* @brief MSP430F5529 平台主程序 * @author CTGU-GB
* @version v2.7
* @date 2016-11-26
*/
#include "include.h"
#include "KEY.h" int key1,key2,stop_flag=; int key_flag = ; //定时器中断处理函数
uint16_t Motor1,Motor2;
__interrupt void TIMER_TB0_A0_IRQ_Handler()
{ GPIO_TurnBit (P4, ); } //ADC 中断处理函数
float ad;
uint16_t ADC_MCH1,ADC_MCH2,Motor1,Motor2;
__interrupt void ADC_IRQ_Handler()
{
if(ADC_GetITStatus(ADC_CH2) == TRUE)
{
ad = ADC_ReadChanelValue (ADC_CH2)*3.3/; //读取后会自动清除标志位
ADC_ClearITPendingBit(ADC_CH2);
}
if(ADC_GetITStatus(ADC_CH1) == TRUE)
{
ad = ADC_ReadChanelValue (ADC_CH1)*3.3/; //读取后会自动清除标志位
ADC_ClearITPendingBit(ADC_CH1);
} } uint8_t key_data()
{
static _Bool glag=;
uint8_t key_value=;
if((KEY_isPressed(KEY1)==||KEY_isPressed(KEY2)==)&&glag==)
{
DELAY_MS();
if((KEY_isPressed(KEY1)==||KEY_isPressed(KEY2)==)&&glag==)
{
glag=;
if(KEY_isPressed(KEY1)==) key_value=;
if(KEY_isPressed(KEY2)==) key_value=;
}
}
else if(KEY_isPressed(KEY1)==||KEY_isPressed(KEY2)==) glag=; return key_value;
} void main()
{
uint8_t key_val = ;
uint8_t Data[];
int a,b,c = ;
DisableInterrupts(); //禁止总中断 LED_Init(LED_ALL); //LED灯初始化
KEY_Init(KEY1,NULL);
KEY_Init(KEY2,NULL);
//LED_On (LED1);
OLED_Init(); //Oled初始化
GPIO_Init(P3,,GPI|PULL_UP);
GPIO_Init(P3,,GPI|PULL_UP);
GPIO_Init(P2,,GPI|PULL_UP);
GPIO_Init(P1,,GPI|PULL_UP);
GPIO_Init(P7,,GPI|PULL_UP);
//GPIO_ReadBit(P2,1) == 0 读取按键按下为0 //ADC配置///
ADC_Init(ADC_CH1,ADC_VREF_3_3V,ADC_10bit); //初始化通道,P6.1 // 定时器配置
Set_Vector_Handler(VECTOR_TIMER0_B0,TIMER_TB0_A0_IRQ_Handler); //设置定时器TA1的中断服务程序为:TIMER1_A0_IRQ_Handler TIMER_Interval_Ms(TIMER_B0, ); //设置TA1为定时中断,中断时间为500Ms
TIMER_ITConfig (TIMER_B0, TIMER_CCR0_IRQn, ENABLE); //使能TIMER的某一个中断
///////////////////////////////////////////////////////////////////////////////////////////// // pwm配置
// 定时器PWM输出初始化
TIMER_PWM_MultiChannel_Init(TIMER_A2, , , TIMER_CH1, TIMER_CH2);
//GPIO_ResetBits(PORT2, GPIO_Pin_4|GPIO_Pin_5);
//TIMER_CH1\TIMER_CH2:{P2,4},{P2,5}
//PWM输出占空比设置
//999为满占空比与设置频率无关
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,);
//////////////////////////////////////////////////////////////////////////////////////////////// /*
///usrt配置////
//配置串口1:TX={P4,4},.RX={P4,5}
UART_Init (UART1,9600); //初始化UART1模块,波特率115200,波特率高时最好把主时钟 设高些
Set_Vector_Handler(VECTOR_UART1,UART_RX_IRQ_Handler); //设置接收中断向量
UART_ITConfig (UART1,UART_RX_IRQn,TRUE); //开串口接收中断
////////////////////////////
*/ EnableInterrupts();
OLED_PrintfAt(FONT_ASCII_6X8,,,"function:");
OLED_PrintfAt(FONT_ASCII_6X8,,,"ADC1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,,,"key_count1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,,,"key_count2:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,,,"recvie1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,,,"recvie2:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,,,"Stop_flag:");//显示一个字符
while()
{ /////////////////////要求2//////////////// Data[] = Flash_Read(MAX_SEGMENT,,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",Data[]);
if(Data[] == )
{
while(){
float ad = ADC_ReadChanelOnce (ADC_CH1)*3.3/;
OLED_PrintfAt(FONT_ASCII_6X8,,,"%0.2f",ad);
if(ad<0.5)
{ TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //左 while()
{ if(KEY_isPressed(KEY2))
{ key_flag =;
break; }
//运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,) == )
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",);
stop_flag =;
break;
}
else
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); a=GPIO_ReadBit(P3,); b=GPIO_ReadBit(P3,); ////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //左
} ////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右 }
if(a == &b == )
{ TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //右 } }
if(stop_flag == )
{
stop_flag = ;
break; } if(key_flag == )
{
key_flag = ;
break; } }
}
} /////////////////////要求3//////////////////////////////// Data[] = Flash_Read(MAX_SEGMENT,,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",Data[]);
if(Data[] == )
{
while(){
float ad = ADC_ReadChanelOnce (ADC_CH1)*3.3/;
OLED_PrintfAt(FONT_ASCII_6X8,,,"%0.2f",ad);
if(ad<0.5)
{ TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //左 while()
{ if(KEY_isPressed(KEY2))
{ key_flag =;
break; } //运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,) == )
{ OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); }
else
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); a=GPIO_ReadBit(P3,); b=GPIO_ReadBit(P3,); ////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //左
} ////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右 }
if(a == &b == )
{ TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //右 } } if(key_flag == )
{
key_flag = ;
break; } }
}
} /////////////////////要求4///////////////////////// Data[] = Flash_Read(MAX_SEGMENT,,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",Data[]);
if(Data[] == )
{
DELAY_MS();
while(){
//float ad = ADC_ReadChanelOnce (ADC_CH1)*3.3/1023;
//OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad); TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //左 while()
{ if(KEY_isPressed(KEY2))
{ key_flag =;
break; } //运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,) == )
{ OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); }
else
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); a=GPIO_ReadBit(P3,); b=GPIO_ReadBit(P3,); ////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //左
} ////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",); //右 }
if(a == &b == )
{ TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,); //右 } } if(key_flag == )
{
key_flag = ;
break; } }
} ///////////////////////////设置////////////////////
//key1-p2.1
//key2-p1.1 //p2.1设置,p1.1确定
while()
{
for(int i=;i<;i++)
{
Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",Data[i]);
}
key_val = key_data();
if(key_val)
{
if(key_val == )
{
key2 ++;
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",key2);
}
else
{
//赋值
Data[]=key2; //先清除flash,再存
Flash_Erase_Segment(MAX_SEGMENT);
Flash_Write_buf (MAX_SEGMENT,,,Data); //数据清零
Data[]=; key1 ++;
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",key1);
//再读取
for(int i=;i<;i++)
{
Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,,,"%d",Data[i]); }
if(Data[] !=) break; }
}
else
{ //sOLED_PrintfAt(FONT_ASCII_6X8,3,70,"%d",0);
} }
///////////////////////////////////////////////////////////// }
}
底板控制
/*!
* COPYRIGHT NOTICE
* Copyright (c) 2016,CTGU-GB
* All rights reserved.
*
*
* @file main.c
* @brief MSP430F5529 平台主程序 * @author CTGU-GB
* @version v2.7
* @date 2016-11-26
*/
#include "include.h" //定时器中断处理函数
uint16_t Motor1,Motor2;
__interrupt void TIMER_TB0_A0_IRQ_Handler()
{ //GPIO_TurnBit (P4, 7); } void main()
{ int Kal = ;
DisableInterrupts(); //禁止总中断 LED_Init(LED_ALL); //LED灯初始化
OLED_Init(); //Oled初始化
LED_Off(LED1);
LED_Off(LED2);
GPIO_Init(P6,,GPI|PULL_UP);
GPIO_Init(P6,,GPI|PULL_UP);
GPIO_Init(P6,,GPI|PULL_UP);
GPIO_Init(P6,,GPI|PULL_UP); GPIO_Init(P1,,GPI|PULL_UP);
GPIO_Init(P1,,GPI|PULL_UP);
GPIO_Init(P1,,GPI|PULL_UP);
GPIO_Init(P1,,GPI|PULL_UP); // 定时器配置
Set_Vector_Handler(VECTOR_TIMER0_B0,TIMER_TB0_A0_IRQ_Handler); //设置定时器TA1的中断服务程序为:TIMER1_A0_IRQ_Handler
TIMER_Interval_Ms(TIMER_B0, ); //设置TA1为定时中断,中断时间为500Ms
TIMER_ITConfig (TIMER_B0, TIMER_CCR0_IRQn, ENABLE); //使能TIMER的某一个中断
/////////////////////////////////////////////////////////////////////////////////////////////
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2|GPIO_Pin_3); EnableInterrupts(); while()
{ /*
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_0);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2|GPIO_Pin_3);
while(1)
{ while(GPIO_ReadBit(P1,2) ==1)
{ }
LED_Off(LED1);
while(GPIO_ReadBit(P1,2) ==0) { }
LED_On(LED1);
while(GPIO_ReadBit(P1,2) ==1) { }
LED_Off(LED1);
GPIO_SetBits(PORT6, GPIO_Pin_0);
break; }
*/ while()
{ if(GPIO_ReadBit(P1,) == )
{ LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_1);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_2 |GPIO_Pin_3); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED1);
while(GPIO_ReadBit(P1,) ==) { }
LED_On(LED2); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED2);
GPIO_ResetBits(PORT6, GPIO_Pin_1);
} else if(GPIO_ReadBit(P1,) == )
{
LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_2);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_3); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED1);
while(GPIO_ReadBit(P1,) ==) { }
LED_On(LED2); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED2);
GPIO_ResetBits(PORT6, GPIO_Pin_2);
} else if(GPIO_ReadBit(P1,) == )
{
LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_3);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED1);
while(GPIO_ReadBit(P1,) ==) { }
LED_On(LED2); while(GPIO_ReadBit(P1,) ==)
{ }
LED_Off(LED2);
GPIO_ResetBits(PORT6, GPIO_Pin_3);
} //GPIO_SetBits (PORT1, GPIO_Pin_0|GPIO_Pin_1); //P1.0,P1.1输出高电平
//GPIO_SetBits() ; //////////////////延时////////////////////
//DELAY_MS(500); }
}
}
8.15号后会对代码思路及硬件做个记录。这几天会稍微休息一会。
TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)的更多相关文章
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- 模拟电磁曲射炮_H题 方案分析【2019年电赛】【刘新宇qq522414928】
请查看我的有道云笔记: 文档:电磁曲射炮分析.note链接:http://note.youdao.com/noteshare?id=26f6b6febc04a8983d5efce925e92e21
- [2019南京网络赛D题]Robots
题目链接 2019.9.2更新 第二天睡醒想了想发现好像搜一遍就可以过,赛时写的花里胡哨的还错了,太菜了QAQ #include<bits/stdc++.h> using namespac ...
- 2019建模美赛B题(派送无人机)M奖论文
昨天上午出了建模美赛的结果,我们小组获得的是M奖,感觉挺开心的.我一直觉得拿O奖那种是个概率事件,需要天时地利人和的各种因素都合适才行,所以看到自己是M奖,感觉自己的能力已经得到了认可就很满意了.今天 ...
- Comet OJ - 2019国庆欢乐赛 C题 两排房子
###题目链接### 题目大意:这里有横着的两排房子,给你每个房子的左端点和右端点.若两排房子中分别有两个房子 x y ,他们在横坐标上有重叠部分(端点重叠也算),则被称为 “对门” 关系. 问你总共 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 2019上海网络赛B题(差分 + 离散化 or 差分 + 思维)
这题.....队里都没怎么训练差分,导致败北...写了一堆线段树嘤嘤嘤,到最后也是超时,比赛结束后看到了差分的思想于是就去学了一手. 其实了解差分思想的一眼就能看出来是差分了.但是如果对n差分的话很明 ...
- [2019上海网络赛F题]Rhyme scheme
题目链接 题意,求出合法的长度为n的字典序第k小字符串,合法的定义为除了最后一位,每一位的取值范围为'A'到'A'+pos-1,而最后一位的取值范围'A'到当前字符串最大值+1. 队友tql,Orz ...
- [2019上海网络赛J题]Stone game
题目链接 CSLnb! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...
随机推荐
- 并发编程-concurrent指南-ReadWriteLock
ReadWriteLock也是一个接口,在它里面只定义了两个方法: public interface ReadWriteLock { /** * Returns the lock used for r ...
- 快速搭建 Windows Kubernetes
背景 接上一篇 Windows 应用容器 后,想要快速且便利的部署与管理它们,可以借助容器编排工具.对于 Windows 容器,在今天 Service Fabric 会是个更为成熟的选择,在业界有更多 ...
- kuangbin专题 专题一 简单搜索 迷宫问题 POJ - 3984
题目链接:https://vjudge.net/problem/POJ-3984 这个题目,emm,上代码,看的估计应该是刚开始接触搜索的,我带点注释,你能慢慢理解. #include <ios ...
- Spring MVC中使用FastJson自定义注解
最近在做.net转译成Java.其中遇到一个很蛋疼的问题.以前.net属性名都是首字母大写.造成返回给客户端的JSON字符串属性名称都是首字母大写.为了和前端对接我们以前都是如下图所示做法 publi ...
- mybatis-generator生成数据表中注释
0.git clone https://github.com/backkoms/mybatis-generator-comments.git,编译打包,install到本地或delopy私服库中均可. ...
- 【POJ - 1995】Raising Modulo Numbers(快速幂)
-->Raising Modulo Numbers Descriptions: 题目一大堆,真没什么用,大致题意 Z M H A1 B1 A2 B2 A3 B3 ......... AH ...
- 内核下载、nfs挂载:个性问题及解决方法~~共勉
开发板下载内核遇到starting waiting问题时: 首先想到是下载地址的问题! 将原本下载地址减去0X40,例如:smart210下载地址0X20008000,修改为0X20007FC0,即可 ...
- 随机点名可视化界面,记录迟到人员,转exe文件
随机点名可视化界面,记录迟到人员,转exe文件 一.介绍 对于人员采取随机点名 二.代码 import datetime import random from tkinter import * fro ...
- C4.5和ID3的差别
C4.5和ID3的差别 决策树分为两大类:分类树和回归树,前者用于分类标签值,后者用于预测连续值,常用算法有ID3.C4.5.CART等. 信息熵 信息量: 信息熵: 信息增益 当计算出各个特征属 ...
- HashMap源码__tableSizeFor方法解析
tableSizeFor(int cap)方法返回不小于指定参数cap的最小2的整数次幂,具体是怎么实现的呢?看源码! /** * Returns a power of two size for th ...