(省二等奖)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=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号后会对代码思路及硬件做个记录。这几天会稍微休息一会。