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! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...
随机推荐
- django基础知识之Ajax:
使用Ajax 使用视图通过上下文向模板中传递数据,需要先加载完成模板的静态页面,再执行模型代码,生成最张的html,返回给浏览器,这个过程将页面与数据集成到了一起,扩展性差 改进方案:通过ajax的方 ...
- ORM的查询
基于对象的跨表查询(sql里的子查询)(重点) 一对多查询: Book(有外键)--------------->Publish 属于正向查询 按book表里的字段book.publis ...
- scrapy基础知识之下载中间件使用案例:
1. 创建middlewares.py文件. Scrapy代理IP.Uesr-Agent的切换都是通过DOWNLOADER_MIDDLEWARES进行控制,我们在settings.py同级目录下创建m ...
- Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Composer”
按照Laravel文档的安装方式在windows上安装Laravel时,执行composer global require "laravel/installer". 然后命令行就显 ...
- 【RabbitMQ】一文带你搞定RabbitMQ死信队列
本文口味:爆炒鱿鱼 预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...
- Event StoryLine Corpus 论文阅读
Event StoryLine Corpus 论文阅读 本文是对 Caselli T, Vossen P. The event storyline corpus: A new benchmark fo ...
- 嗨,你真的懂this吗?
this关键字是JavaScript中最复杂的机制之一,是一个特别的关键字,被自动定义在所有函数的作用域中,但是相信很多JvaScript开发者并不是非常清楚它究竟指向的是什么.听说你很懂this,是 ...
- 【算法•日更•第十九期】动态规划:RMQ问题
▎前言 首先先来说一下RMB是什么,当然是人民币啦. 今天我们要学的这个东西不一般,叫做RMQ问题,那么它和RMB有什么关系呢?待小编细细说来. ▎前置技能:动态规划 不会的同志请戳这里迅速了解动态规 ...
- fjnuoj 1003 学长的QQ号
题目: //QQ是一个9位数,由1,2,3,4,5,9组成,且第1.6位数字相同,第2.4位数字相同,第5.7位数字相同. //我的QQ就在符合上诉条件中的所有9位数从小到大排第 ...
- [leetcode] 106. Construct Binary Tree from Inorder and Postorder Traversal(medium)
原题地址 思路: 和leetcode105题差不多,这道题是给中序和后序,求出二叉树. 解法一: 思路和105题差不多,只是pos是从后往前遍历,生成树顺序也是先右后左. class Solution ...