配置
第一步:右击工程,选择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=0;
int key_flag = 0;
//定时器中断处理函数
uint16_t Motor1,Motor2;
__interrupt void TIMER_TB0_A0_IRQ_Handler()
{
GPIO_TurnBit (P4, 7);
}
//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/1023; //读取后会自动清除标志位
ADC_ClearITPendingBit(ADC_CH2);
}
if(ADC_GetITStatus(ADC_CH1) == TRUE)
{
ad = ADC_ReadChanelValue (ADC_CH1)*3.3/1023; //读取后会自动清除标志位
ADC_ClearITPendingBit(ADC_CH1);
}
}
uint8_t key_data()
{
static _Bool glag=0;
uint8_t key_value=0;
if((KEY_isPressed(KEY1)==1||KEY_isPressed(KEY2)==1)&&glag==0)
{
DELAY_MS(100);
if((KEY_isPressed(KEY1)==1||KEY_isPressed(KEY2)==1)&&glag==0)
{
glag=1;
if(KEY_isPressed(KEY1)==1) key_value=1;
if(KEY_isPressed(KEY2)==1) key_value=2;
}
}
else if(KEY_isPressed(KEY1)==0||KEY_isPressed(KEY2)==0) glag=0;
return key_value;
}
void main()
{
uint8_t key_val = 0;
uint8_t Data[1];
int a,b,c = 0;
DisableInterrupts(); //禁止总中断
LED_Init(LED_ALL); //LED灯初始化
KEY_Init(KEY1,NULL);
KEY_Init(KEY2,NULL);
//LED_On (LED1);
OLED_Init(); //Oled初始化
GPIO_Init(P3,0,GPI|PULL_UP);
GPIO_Init(P3,1,GPI|PULL_UP);
GPIO_Init(P2,1,GPI|PULL_UP);
GPIO_Init(P1,1,GPI|PULL_UP);
GPIO_Init(P7,0,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, 500); //设置TA1为定时中断,中断时间为500Ms
TIMER_ITConfig (TIMER_B0, TIMER_CCR0_IRQn, ENABLE); //使能TIMER的某一个中断
/////////////////////////////////////////////////////////////////////////////////////////////
// pwm配置
// 定时器PWM输出初始化
TIMER_PWM_MultiChannel_Init(TIMER_A2, 1000, 2, 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,50);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,50);
////////////////////////////////////////////////////////////////////////////////////////////////
/*
///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,1,0,"function:");
OLED_PrintfAt(FONT_ASCII_6X8,2,0,"ADC1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,3,0,"key_count1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,4,0,"key_count2:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,5,0,"recvie1:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,6,0,"recvie2:");//显示一个字符
OLED_PrintfAt(FONT_ASCII_6X8,7,0,"Stop_flag:");//显示一个字符
while(1)
{
/////////////////////要求2////////////////
Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]);
if(Data[0] == 2)
{
while(1){
float ad = ADC_ReadChanelOnce (ADC_CH1)*3.3/1023;
OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad);
if(ad<0.5)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,500); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500); //左
while(1)
{
if(KEY_isPressed(KEY2))
{
key_flag =1;
break;
}
//运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,0) == 0 )
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,0);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,0);
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
stop_flag =1;
break;
}
else
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);
a=GPIO_ReadBit(P3,0);
b=GPIO_ReadBit(P3,1);
////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //左
}
////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //右
}
if(a == 0&b == 0)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); //右
}
}
if(stop_flag == 1)
{
stop_flag = 0;
break;
}
if(key_flag == 1)
{
key_flag = 0;
break;
}
}
}
}
/////////////////////要求3////////////////////////////////
Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]);
if(Data[0] == 3)
{
while(1){
float ad = ADC_ReadChanelOnce (ADC_CH1)*3.3/1023;
OLED_PrintfAt(FONT_ASCII_6X8,2,30,"%0.2f",ad);
if(ad<0.5)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,500); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500); //左
while(1)
{
if(KEY_isPressed(KEY2))
{
key_flag =1;
break;
}
//运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,0) == 0 )
{
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
}
else
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);
a=GPIO_ReadBit(P3,0);
b=GPIO_ReadBit(P3,1);
////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //左
}
////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //右
}
if(a == 0&b == 0)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); //右
}
}
if(key_flag == 1)
{
key_flag = 0;
break;
}
}
}
}
/////////////////////要求4/////////////////////////
Data[0] = Flash_Read(MAX_SEGMENT,0,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[0]);
if(Data[0] == 4)
{
DELAY_MS(59000);
while(1){
//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,500); //右
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,500); //左
while(1)
{
if(KEY_isPressed(KEY2))
{
key_flag =1;
break;
}
//运行中检测是否在充电标志,中心
if(GPIO_ReadBit(P7,0) == 0 )
{
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",0);
}
else
OLED_PrintfAt(FONT_ASCII_6X8,7,70,"%d",1);
a=GPIO_ReadBit(P3,0);
b=GPIO_ReadBit(P3,1);
////////// //检测左边是否到达
if(a)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,1000);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,300);
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",1);
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,5,50,"%d",0); //左
}
////////// //检测右边是否到达
if(b)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,300);
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000);
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",1); //右
}
else{
OLED_PrintfAt(FONT_ASCII_6X8,6,50,"%d",0); //右
}
if(a == 0&b == 0)
{
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH1,550); //左
TIMER_PWM_SetChannelDuty(TIMER_A2,TIMER_CH2,1000); //右
}
}
if(key_flag == 1)
{
key_flag = 0;
break;
}
}
}
///////////////////////////设置////////////////////
//key1-p2.1
//key2-p1.1
//p2.1设置,p1.1确定
while(1)
{
for(int i=0;i<1;i++)
{
Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[i]);
}
key_val = key_data();
if(key_val)
{
if(key_val == 1)
{
key2 ++;
OLED_PrintfAt(FONT_ASCII_6X8,4,70,"%d",key2);
}
else
{
//赋值
Data[0]=key2;
//先清除flash,再存
Flash_Erase_Segment(MAX_SEGMENT);
Flash_Write_buf (MAX_SEGMENT,0,1,Data);
//数据清零
Data[0]=0;
key1 ++;
OLED_PrintfAt(FONT_ASCII_6X8,3,70,"%d",key1);
//再读取
for(int i=0;i<1;i++)
{
Data[i] = Flash_Read(MAX_SEGMENT,i,uint8_t);
OLED_PrintfAt(FONT_ASCII_6X8,1,70,"%d",Data[i]);
}
if(Data[0] !=0) 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 = 0;
DisableInterrupts(); //禁止总中断
LED_Init(LED_ALL); //LED灯初始化
OLED_Init(); //Oled初始化
LED_Off(LED1);
LED_Off(LED2);
GPIO_Init(P6,0,GPI|PULL_UP);
GPIO_Init(P6,1,GPI|PULL_UP);
GPIO_Init(P6,2,GPI|PULL_UP);
GPIO_Init(P6,3,GPI|PULL_UP);
GPIO_Init(P1,2,GPI|PULL_UP);
GPIO_Init(P1,3,GPI|PULL_UP);
GPIO_Init(P1,4,GPI|PULL_UP);
GPIO_Init(P1,5,GPI|PULL_UP);
// 定时器配置
Set_Vector_Handler(VECTOR_TIMER0_B0,TIMER_TB0_A0_IRQ_Handler); //设置定时器TA1的中断服务程序为:TIMER1_A0_IRQ_Handler
TIMER_Interval_Ms(TIMER_B0, 500); //设置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)
{
/*
//开发射圈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(1)
{
if(GPIO_ReadBit(P1,3) == 0)
{
LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_1);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_2 |GPIO_Pin_3);
while(GPIO_ReadBit(P1,3) ==0)
{
}
LED_Off(LED1);
while(GPIO_ReadBit(P1,3) ==1)
{
}
LED_On(LED2);
while(GPIO_ReadBit(P1,3) ==0)
{
}
LED_Off(LED2);
GPIO_ResetBits(PORT6, GPIO_Pin_1);
}
else if(GPIO_ReadBit(P1,4) == 0)
{
LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_2);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_3);
while(GPIO_ReadBit(P1,4) ==0)
{
}
LED_Off(LED1);
while(GPIO_ReadBit(P1,4) ==1)
{
}
LED_On(LED2);
while(GPIO_ReadBit(P1,4) ==0)
{
}
LED_Off(LED2);
GPIO_ResetBits(PORT6, GPIO_Pin_2);
}
else if(GPIO_ReadBit(P1,5) == 0)
{
LED_On(LED1);
//开发射圈1
GPIO_SetBits(PORT6, GPIO_Pin_3);
//关其他发射圈
GPIO_ResetBits(PORT6, GPIO_Pin_1 |GPIO_Pin_2);
while(GPIO_ReadBit(P1,5) ==0)
{
}
LED_Off(LED1);
while(GPIO_ReadBit(P1,5) ==1)
{
}
LED_On(LED2);
while(GPIO_ReadBit(P1,5) ==0)
{
}
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号后会对代码思路及硬件做个记录。这几天会稍微休息一会。
