TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)
Posted -wenli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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号后会对代码思路及硬件做个记录。这几天会稍微休息一会。
以上是关于TI MSP430工程配置及2019年电赛A题编程示例(使用430 F5529)的主要内容,如果未能解决你的问题,请参考以下文章
2019年电赛国赛D题《简易电路特性测试仪》训练总结----题目引入与概述
2019年电赛国赛D题《简易电路特性测试仪》训练总结----待测三极管共射放大电路部分