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! 题意是求出给定集合中有多少个合法子集,合法子集的定义为,子集和>=总和-子集和$\& \&$子集和-(子集的子集和)<=总和-子集和. 其实就是很简 ...
随机推荐
- java-NIO-FileChannel(文件IO)
Java NIO中的FileChannel是一个连接到文件的通道.可以通过文件通道读写文件. FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 对于文件的复制,平时我们都是使用输入 ...
- re正则
#转义字符和原生字符 import re # # # 转义 # text = 'apple price is $299' # ret = re.search('\$\d+',text) # print ...
- c++快速排序算法
c++快速排序算法 题目描述 利用快速排序算法将读入的NN个数从小到大排序后输出. 快速排序是信息学竞赛的必备算法之一.对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成.(C++选 ...
- springboot不加载mapper文件问题解析
1. 场景描述 启动的时候报"springboot available: expected at least 1 bean which qualifies as autowire candi ...
- Mac上Ultra Edit的激活
2016-11-20 增加16.10.0.22破解 去官网下载原载,先运行一次,再在终端里执行下面代码就可以破解完成!printf '\x31\xC0\xFF\xC0\xC3\x90' | dd se ...
- 学习 Python 心得
脚本式编程: 通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕.当脚本执行完成后,解释器不再有效. 让我们写一个简单的 Python 脚本程序.所有 Python 文件将以 .py 为扩展名.将以 ...
- springcloud-高可用部署
1.场景描述 前端时间只简单介绍了下springcloud的高可用方案(springcloud高可用方案),今天详细介绍下如何实施springcloud的高可用部署. 2.解决方案 2.1 架构方案 ...
- 【Android UI】自定义带按钮的标题栏
自定义标题栏在很多的android app中很常见,可以说是一种很有用的UI设计方法.自 己也本着学习的态度,经过一番各种坑,终于实现了,现总结如下: 一:大致流程 1. 对指定的andro ...
- 个人永久性免费-Excel催化剂功能第40波-工资、年终奖个人所得税计算函数
学Excel的表哥表姐们必定有接触过个人所得税的案例学习,在计算个人所得税这个需求上,大家的层次也是很多种多样,当然Excel催化剂推荐的方式仍然是经过封装后的简单明了的自定义函数的方式,此篇已为财务 ...
- Flask项目常见面试问题
一.你的项目中缓存粒度是如何选择的? 缓存粒度一共分为4种. 1.缓存某个数值:一个键只保存一个值,性价比较低,使用率低,如果存储的话我们使用redis的String 2.缓存数据对象:数据库记录对应 ...