stm32串口通信程序

#include "iostm32f10xxB.h"
#include "stm32f10x_it.h"
#include "stm32f10x_it.c"
#include "stm32f10x_vector.c"
#include "stdio.h"
//#include "lcd.c"
//#include "jianpan.c"
void SetSysClockTo32()
{
RCC_CR_bit.HSEON=1; //外部晶振使能
while(RCC_CR_bit.HSERDY==0);//外部晶振准备好了
RCC_CFGR_bit.HPRE=0; //AHB预分频器 系统时钟0分频
RCC_CFGR_bit.PPRE2=0; //APB2 0分频
RCC_CFGR_bit.PPRE1=4; //APB1 0分频
RCC_CFGR_bit.PLLSRC=1; //HES作为PLL时钟源
RCC_CFGR_bit.PLLMUL=2; //PLL输入时钟*4
RCC_CR_bit.PLLON=1; //PLL使能
while(RCC_CR_bit.PLLRDY==0); //Pll准备好
RCC_CFGR_bit.SW=2; //PLL切换为系统时钟
while(RCC_CFGR_bit.SWS!=2); //PLL作为系统时钟
}
void Init_interrupt() //外部中断初始化
{
AFIO_EXTICR1_bit.EXTI0=1; //选择外部中断
EXTI_IMR_bit.MR0=1;//外部中断请求未屏蔽
EXTI_FTSR_bit.TR0=1;//上升中断
EXTI_PR_bit.PR0=1;//中断标志清零
SETENA0=1<<6; //EXTI0开中断 SETENA0控制所有中断
}
void Init_interrupt_second()
{
//EXTI_IMR_bit.MR17=1;//外部中断请求未屏蔽
//EXTI_FTSR_bit.TR17=1;//上升中断
//EXTI_PR_bit.PR17=1;//中断标志清零
SETENA0_bit.SETENA3=1; //RTC 全局中断
}
void Init_RTC()
{
RCC_APB1ENR_bit.PWREN=1;//电源接口时钟使能
RCC_APB1ENR_bit.BKPEN=1;//备份接口使能
PWR_CR_bit.DBP=1; //允许访问RTC和备份寄存器
RCC_BDCR_bit.LSEON=1; //低速 32768晶振使能
while(RCC_BDCR_bit.LSERDY==0);//低速晶振准备好了
RCC_BDCR_bit.RTCSEL=1;//选择LSE作为RTC时钟
RCC_BDCR_bit.RTCEN=1; //RTC 开中断
while(RTC_CRL_bit.RTOFF==0);//等待RTC最近一次写操作完成
RTC_CRL_https://www.360docs.net/doc/d79818436.html,F=1; //进入配置模式
RTC_CRH_bit.SECIE=1; //秒中断使能
//RTC_CRH_bit.ALRIE=1;//闹钟中断使能
RTC_PRLL=0x7fff;//预分频装载寄存器 获得1S信号
RTC_ALRH=0; //闹钟初值
RTC_ALRL=0x1800;
RTC_CRL_https://www.360docs.net/doc/d79818436.html,F=0; //推出配置模式
}
void Init_TIM1()
{
RCC_APB2ENR_bit.TIM1EN=1;
TIM1_CR1_bit.ARPE=1;
TIM1_ARR=8000;
TIM1_PSC=1000;
TIM1_DIER_bit.UIE=1;
TIM1_DIER_bit.BIE=1;
TIM1_CR1_bit.CEN=1;
SETENA0_bit.SETENA25=1;
}

void Init_AD()
{
RCC_APB2ENR_bit.IOPAEN=1;
RCC_APB2ENR_bit.ADC1EN=1;
GPIOA_CRL=0x00000000;
ADC1_CR1_bit.DUALMOD=0;
ADC1_CR2_bit.CONT=0;
ADC1_CR2_bit.EXTTRIG=1;
ADC1_CR2_bit.EXTSEL=7;
ADC1_CR2_bit.ALIGN=1;
ADC1_SQR1_bit.L=0;
ADC1_SMPR2_bit.SMP0=0;
ADC1_CR2_bit.RSTCAL=1;
while( ADC1_CR2_bit.RSTCAL==1);
ADC1_CR2_bit.ADON=1;
ADC1_CR2_bit.CAL=1;
while( ADC1_CR2_bit.CAL==1);
}
__REG16 get_AD()
{
ADC1_SQR3_bit.SQ1=0;
ADC1_CR2_bit.SWSTART=1;
while(ADC1_SR_bit.EOC==0);
return ADC1_DR_bit.DATA ;
}
void Init_USART1()
{
RCC_APB2ENR_https://www.360docs.net/doc/d79818436.html,ART1EN=1; //USART1时钟使能
USART1_CR1_bit.UE=1; //USART1使能
USART1_CR1_bit.M=0; //1起始位,8位数据,n停止位
USART1_CR2_bit.STOP=0;

USART1_CR2_bit.CLKEN=0;
USART1_CR2_bit.CPOL=1;
USART1_CR2_bit.CPHA=1;
USART1_CR2_bit.LBCL=0;
/*9600HZ=32000000/(16*USARTDIV)-->USARTDIV=208.33
USART1_BRR.DIV_Fraction=16*0.25=4
*/
USART1_BRR_bit.DIV_Fraction=5;
USART1_BRR_bit.DIV_Mantissa=208;
USART1_CR1_bit.TE=1;
USART1_CR1_bit.RE=1;
}
void Uart1Sends(char *s)
{
//ES=0;//关串行口中断
while(*s!='\0') //判断一串数据是否结束
{
USART1_DR=*s; //发送数据
while(USART1_SR_bit.TC==0); //查询发送是否结束
USART1_SR_bit.TC=0; //清除发送一标志位
s++; //准备发送一个数据
}
//ES=1;//开串行口中断
}
int fputc(int ch, FILE *f)
{USART1_DR =ch;
while(USART1_SR_bit.TC==0);//循环发送,直到发送完毕
return ch;
}
void main()
{
unsigned int i,j;
SetSysClockTo32();//设置系统时钟32M
Init_USART1();
RCC_APB2ENR_bit.IOPAEN=1;//IO口时钟使能
RCC_APB2ENR_bit.IOPBEN=1;
RCC_APB2ENR_bit.IOPCEN=1;
GPIOA_CRH=0x000004b0;
while(1)
{
// printf("你好\n");
Uart1Sends("ati\r");
for(i=0;i<10000;i++)
for(j=0;j<3000;j++);
Uart1Sends("ati\r");
for(i=0;i<10000;i++)
for(j=0;j<3000;j++);
Uart1Sends("ati\r");
for(i=0;i<10000;i++)
for(j=0;j<3000;j++);
Uart1Sends("ATD180********;\r");
for(;;);
}
}


相关主题
相关文档
最新文档