标题:
MSP430F5529单片机程序整理(串口、AD、定时器等)
[打印本页]
作者:
ccchhh
时间:
2019-11-25 19:07
标题:
MSP430F5529单片机程序整理(串口、AD、定时器等)
#include <msp430.h>
#include <stdint.h>
#include "uart.h"
#include "Flash.h"
#include "ad.h"
#include "stdio.h"
#include "string.h"
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define ledon P8OUT &= ~BIT0
#define ledoff P8OUT |= BIT0
uint8_t led_flag=0;
uint8_t sendstr[]={"hello\r\n"};
uint8_t cstr[]={"\r\n"};
uint8_t FlashSetBuf[FLASH_LEN]={"123456"};
uint8_t RxBuf1[FLASH_LEN];
uint16_t Cap_num;
uint16_t num_start=0,num_end=0;
void p1_isr_init(void);
void timerA0_init(void);
void initClock(void);
void Init_Rtc(void);
void TA0_PWM(uint16_t per,uint16_t duty);
void TA1_CAP(void);
void main(void)
{
uint16_t len;
uint16_t value;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗定时器
uint8_t sec,min,hour;
uint8_t sstr[30];
uint8_t adstr[30];
uint8_t capstr[30];
float v;
// initClock();
P8DIR |= BIT0; //设置P8.0口为输出模式
ledoff;
p1_isr_init();
// timerA0_init();
UART_Init();
Init_Rtc();
AD_Init();
FlashErase(FLASH_ADR,WORD,FLASH_LEN); //擦除写入Flash中的数据
FlashWriteWord(FLASH_ADR,FlashSetBuf,FLASH_LEN); //双字节写入函数
FlashRead(FLASH_ADR,RxBuf1,WORD,FLASH_LEN); //Flash读取函数
bcUartSend(RxBuf1,FLASH_LEN);
bcUartSend(cstr,2);
TA0_PWM(1049-1,500-1);
TA1_CAP();
while (1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
bcUartSend(USART_RX_BUF,len);
bcUartSend(cstr,2);
USART_RX_STA=0;
}
ADC12CTL0 |= ADC12SC; //开始采样转换
value = ADC12MEM0; //把结果赋给变量
v=value*3.0/4096;
sec = RTCSEC;
min = RTCMIN;
hour= RTCHOUR;
sprintf(sstr,"Time: %02x:%02x:%02x \r\n",hour,min,sec);
sprintf(adstr,"AD: %d V:%.2fV \r\n",value,v);
if(Cap_num)
{
sprintf(capstr,"Cap: %d \r\n",Cap_num);
bcUartSend(capstr,strlen(capstr));
TA1CCTL1 |=CCIE;
Cap_num=0;
}
bcUartSend(adstr,strlen(adstr));
bcUartSend(sstr,strlen(sstr));
delay_ms(1000);
}
}
void timerA0_init(void)
{
TA0CTL |= MC_1 + TASSEL_2 + TACLR; //时钟为SMCLK,比较模式,开始时清零计数器 smclk 12MHZ aclk
TA0CCTL0 = CCIE; //比较器中断使能
TA0CCR0 = 1000; //比较值设为1000,相当于1ms的时间间隔
__enable_interrupt();
}
void p1_isr_init(void)
{
P1REN |= BIT2; // 使能P1.2上拉电阻
P1OUT |= BIT2; // P1.2口置高电平
P1IES &= ~BIT2; // 中断沿设置(下降沿触发)
P1IFG &= ~BIT2; // 清P1.2中断标志
P1IE |= BIT2; // 使能P1.2口中断
__bis_SR_register(GIE); // 进入低功耗模式4 开中断
}
// P1中断函数
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
delay_ms(10);
if((P1IN & BIT2)==0)
{
if(!led_flag)ledon; //改变LED1灯状态
else ledoff;
led_flag=~led_flag;
}
P1IFG &= ~BIT2; //清P1.2中断标志位
}
uint16_t t=0;
/************************定时器中断函数********************************/
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
t++;
if(t>1000)
{
t=0;
P8OUT ^= BIT0; //形成闪灯效果
}
//P8OUT ^= BIT0; //形成闪灯效果
}
void initClock(void)
{
UCSCTL6 &= ~XT1OFF; //启动XT1
P5SEL |= BIT2 + BIT3; //XT2引脚功能选择
UCSCTL6 &= ~XT2OFF; //打开XT2
PMMCTL0_H = 0xA5; //开PMM电源管理
SVSMLCTL |= SVSMLRRL_1 + SVMLE; //配置SVML电压
PMMCTL0 = PMMPW + PMMCOREV_2; //配置内核电压
while((PMMIFG & SVSMLDLYIFG ) == 0); //等待设置完成
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG + SVSMLDLYIFG);
if((PMMIFG & SVMLIFG) == 1) //判断内核电压是否上升到VSVML
while((PMMIFG & SVMLVLRIFG) == 0); //如果没有等待
SVSMLCTL &= ~SVMLE; //关掉SVML模块
PMMCTL0_H = 0X00; //锁存配置
__bis_SR_register(SCG0);
UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
UCSCTL1 = DCORSEL_4; //DCO频率范围在28.2MHZ以下
UCSCTL2 = FLLD_4 + 1; //D=16,N=1
UCSCTL3 = SELREF_5 + FLLREFDIV_3; //n=8,FLLREFCLK时钟源为XT2CLK;DCOCLK=D*(N+1)*(FLLREFCLK/n);DCOCLKDIV=(N+1)*(FLLREFCLK/n);
UCSCTL4 = SELA_4 + SELS_3 +SELM_3; //ACLK的时钟源为DCOCLKDIV,MCLK\SMCLK的时钟源为DCOCLK
UCSCTL5 = DIVA_5 +DIVS_4; //ACLK由DCOCLKDIV的32分频得到,SMCLK由DCOCLK的2分频得到
//最终MCLK:16MHZ,SMCLK:1MHZ,ACLK:32KHZ
__bic_SR_register(SCG0); //Enable the FLL control loop
}
void Init_Rtc(void)
{
// BCD码日历格式输出
RTCCTL01 = RTCBCD + RTCHOLD + RTCMODE + RTCTEV_0;
RTCSEC = 0x54; //初始化秒
RTCMIN = 0x59 ; //初始化分钟
RTCHOUR =0x21; //初始化小时
RTCDOW = 0x02 ;
RTCDAY = 0x24; //日期初始化
RTCMON = 0x11 ; //初始化月份
RTCYEAR = 0x2005; //初始化年份
RTCCTL01 &= ~RTCHOLD; //打开RTC模块
}
void TA0_PWM(uint16_t per,uint16_t duty)
{
//Initialize
P1SEL |= BIT2+BIT3+BIT4+BIT5; //从P1.2输出
P1DIR |= BIT2+BIT3+BIT4+BIT5;
//初始化定时器
TA0CTL |= TASSEL_2 + MC_1 ;
TA0CCTL0 = OUTMOD_7 + CCIE;
TA0CCTL1 = OUTMOD_7;
TA0CCTL2 = OUTMOD_7;
TA0CCTL3 = OUTMOD_7;
TA0CCTL4 = OUTMOD_7;
TA0CCR0 = per/*Period*/; //Change me
TA0CCR1 = duty/*Duty*/; //Change me
TA0CCR2 = duty/*Duty*/; //Change me
TA0CCR3 = duty/*Duty*/; //Change me
TA0CCR4 = duty/*Duty*/; //Change me
__enable_interrupt();
}
void TA1_CAP(void)
{
P2DIR&=~BIT0; //捕捉P2.0口 cc1
P2SEL |= BIT0;
P2REN |= BIT0; //启用P2.0内部下拉电阻
TA1CCTL1 |= CAP + CM_1 + CCIS_0 + SCS + CCIE;//捕获模式,上升都捕获,选择CCI2A,同步,捕获中断开
TA1CTL |= TASSEL_2 + MC_2 + ID_0 + TACLR; //SMCLK=1M,连续计数模式
}
/************************定时器中断函数********************************/
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer_A1 (void)
{
if(TA1CCTL1&CM_1) //捕获到下降沿
{
TA1CTL|=TACLR;
TA1CCTL1=(TA1CCTL1&(~CM_1))|CM_2; //改为上升沿捕获:CM1置零,CM0置一
}
else if(TA1CCTL1&CM_2) //捕获到上升沿
{
Cap_num=TA1CCR1; //记录下结束时间
TA1CCTL1 &=~CCIE; //改为下降沿捕获:CM0置零,CM1置一
TA1CTL|=TACLR;
}
}
复制代码
全部资料51hei下载地址:
myproj0.zip
(235.38 KB, 下载次数: 71)
2019-11-25 19:06 上传
点击文件名下载附件
程序
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1