弄了一天了,实在弄不出来,代码是各种合起来的。早上弄出来可以发送所接收到内容的UART程序,可是后来不管怎么发,都没有回应。当然这个是在试探,最终目的是通过uart发送指令给小车,让其转弯。请大家帮帮忙看看,不胜感激!代码如下
【这是main.c】
#include <msp430f5529.h>
#include "clk.h"
#include "pwm.h"
#include "pwm_servo.h"
#include "uart.h"
void main(void) {
WDTCTL = WDTPW+WDTHOLD; //关看门狗
P2SEL |= BIT2;
P2DIR |= BIT2;//测量SMCLK用
XT2_Init(); //时钟初始化
PWM_Init(); //PWM初始化
PWM_servo_Init();//舵机电机PMW初始化
TA0_PWM_setpermill(800);//稳定输出轮子电机的PWM
USCI_A0_Init();
__enable_interrupt(); //使能单片机中断
while(1);
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(UCA0RXBUF)
{
case '1':
TA2_PWM_servo_setpermill(300);break;//左转
case '2':
TA2_PWM_servo_setpermill(750);break;//回正
case '3':
TA2_PWM_servo_setpermill(1200);break;//右转
}
}
[这是CLK.h]
#ifndef CLK_XT2_H_
#define CLK_XT2_H_
void XT2_Init();
#endif /* CLK_XT2_H_ */
void XT2_Init()
{
P5SEL |= BIT2|BIT3; //将IO配置为XT2功能
UCSCTL6 &= ~XT2OFF; //使能XT2
UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK
UCSCTL3 |= SELREF_2; //将REFCLK配置为REFCLK
while (SFRIFG1 & OFIFG){
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // 清除三类时钟标志位
// 这里需要清除三种标志位,因为任何一种
// 标志位都会将OFIFG置位
SFRIFG1 &= ~OFIFG; // 清除时钟错误标志位
}
UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5; //将SMCLK和MCLK时钟源配置为XT2
}
[uart.c]
#include <msp430f5529.h>
#include "uart.h"
/***********************************
* USCI串口初始化
* 输入:P3.4-Rx
* 输出:P3.3-Tx
**********************************/
void USCI_A0_Init()
{
P3SEL |= BIT3+BIT4; // P3.3和P3.4选择UART通信功能
UCA0CTL1 |= UCSWRST; // 复位寄存器设置
UCA0CTL0 = 0x00;
UCA0CTL1 |= UCSSEL_2; // SMCLK,为系统时钟4MHz
UCA0BR0 = 34; // 4MHz 115200
UCA0BR1 = 0; // 4MHz 115200
UCA0MCTL |= UCBRS_6 + UCBRF_0; // 调制器设置
UCA0CTL1 &= ~UCSWRST; // 完成USCI_A0初始化设置
//UCA0IE |= UCTXIE;
UCA0IE |= UCRXIE;
_bis_SR_register(LPM0_bits + GIE);//进低功耗状态
}
/***************************/
void USCI_A0_PutChar(char Chr)
{
UCA0TXBUF = Chr;
while (!(UCA0IFG&UCTXIFG)); //等待上一个字节发送完毕
}
/****************************
* 字符串发送函数
* 输入:s-字符串
***************************/
void USCI_A0_PutString(unsigned char *s)
{
while(*s !='\0')
{
USCI_A0_PutChar(*s++);
}
}
/***************************
* 向PC发送字符
* 输入:数据
**************************/
void USCI_A0_To_PC(unsigned int Chr)
{
USCI_A0_PutChar(Chr/1000+'0');
USCI_A0_PutChar(Chr%1000/100+'0');
USCI_A0_PutChar(Chr%100/10+'0');
USCI_A0_PutChar(Chr%10+'0');
USCI_A0_PutString("\n");
}
[uart.h]
/*
* uart.h
*
* Created on: 2018年11月26日
* Author: LENOVO
*/
#ifndef UART_H_
#define UART_H_
/***************************/
void USCI_A0_Init(void);
void USCI_A0_PutChar(char Chr);
void USCI_A0_PutString(unsigned char *s);
void USCI_A0_To_PC(unsigned int Chr);
void USCIA0_receivechar(void);
#endif /* UART_H_ */
[pwm_servo.c]
/*
* pwm_servo.c
*
* Created on: 2019年1月24日
* Author: Dadaist
*/
#include "pwm_servo.h"
/***********************************
* PWM_servo初始化
**********************************/
void PWM_servo_Init()
{
P2DIR |= BIT4;
P2SEL |= BIT4; //将P2.4引脚配置为比较输出(TA2.1)
//初始化定时器
TA2CTL |= TASSEL_2 + TACLR+ID_3;
TA2CCTL1 = OUTMOD_7;
TA2CTL |=MC_1;
TA2CCR0 =10000 ;/*Period*///Change me
TA2CCR1 =5000 ;/*Duty*///Change me
}
/***********************************
* 设置PWM_servo占空比
* 输入:(0~10000)
**********************************/
void TA2_PWM_servo_setpermill(unsigned int dty)//设置占空比
{
unsigned long int pcnt=dty;
if(pcnt>10000) pcnt=10000;
TA2CCR1=pcnt*TA2CCR0/10000;
[pwm_servo.h]
/*
* pwm_servo.h
*
* Created on: 2019年1月25日
* Author: Dadaist
*/
#include <msp430f5529.h>
#ifndef PWM_SERVO_H_
#define PWM_SERVO_H_
void PWM_servo_Init();
void TA2_PWM_servo_setperiod(unsigned long period);
void TA2_PWM_servo_setpermill(unsigned int dty);
#endif /* PWM_SERVO_H_ */
[pwm.c]
/*
* pwm.c
*
* Created on: 2018年11月26日
* Author: LENOVO
*/
#include "pwm.h"
/***********************************
* PWM初始化
**********************************/
void PWM_Init()
{
P2DIR |= BIT0;
P2SEL |= BIT0; //将P2.0引脚配置为比较输出(TA1.1)
//初始化定时器
TA1CTL |= TASSEL_2 + TACLR+ID_0;
TA1CCTL1 = OUTMOD_7;
TA1CTL |=MC_1;
TA1CCR0 =1000 ;/*Period*///Change me
TA1CCR1 =500 /*Duty*/; //Change me
}
/***********************************
* 设置PWM占空比
* 输入:(0~1000)
**********************************/
void TA0_PWM_setpermill(unsigned int duty)//设置占空比
{
unsigned long int precent=duty;
if(precent>1000) precent=1000;
TA1CCR1=precent*TA1CCR0/1000;
}
[pwm.h]
/*
* pwm.h
*
* Created on: 2018年11月26日
* Author: LENOVO
*/
#include <msp430f5529.h>
#ifndef PWM_H_
#define PWM_H_
void PWM_Init();
void TA0_PWM_setperiod(unsigned long period);
void TA0_PWM_setpermill(unsigned int duty);
#endif /* PWM_H_ */
灰小子:
建议单独调试UART程序部分。调试没有问题了再和其他代码整合调试。
xyz549040622:
建议你按照模块调试通,分别备份,然后再进行整合。
Susan Yang:
同意楼上两位的看法,建议分别调试不同模块。请问您现在解决问题了吗?