新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2018-11-8
- 在线时间
- 1 小时
|
1金钱
串口.C
#include "delay.h"
#include "usart2.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
u16 point2 = 0;
//???????
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //????,??USART2_MAX_SEND_LEN??
#ifdef USART3_RX_EN //???????
//???????
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //????,??USART2_MAX_RECV_LEN???.
//????????2????????????10ms?????????????.
//??2?????????10ms,?????1?????.?????10ms?????
//????,?????????.
//????????
//[15]:0,???????;1,????????.
//[14:0]:????????
u16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//?????
{
res =USART_ReceiveData(USART3);
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //???????
{
TIM_SetCounter(TIM2,0);//?????
if(USART3_RX_STA==0)TIM2_Set(1); //?????4???
USART3_RX_BUF[USART3_RX_STA++]=res; //???????
}else
{
USART3_RX_STA|=1<<15; //????????
}
}
}
void USART3_CLR_Buf(void) // ′®¿ú»o′æÇåàí
{
memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN); //Çå¿Õ
point2 = 0;
}
//???IO ??3
//pclk1 CLK1????(Mhz)
//bound:???
void USART3_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB??
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
USART_DeInit(USART3); //????3
//USART3_TX PB.10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.2
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //??????
GPIO_Init(GPIOB, &GPIO_InitStructure); //???PA2
//USART3_RX PB.11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????
GPIO_Init(GPIOB, &GPIO_InitStructure); //???PA3
USART_InitStructure.USART_BaudRate = bound;//?????9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//???8?????
USART_InitStructure.USART_StopBits = USART_StopBits_1;//?????
USART_InitStructure.USART_Parity = USART_Parity_No;//??????
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//????????
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //????
USART_Init(USART3, &USART_InitStructure); //????? 2
//?????
// USART2->BRR=(pclk1*1000000)/(bound);// ?????
//USART2->CR1|=0X200C; //1???,????.
USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE); //????2?DMA??
UART_DMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)USART3_TX_BUF);//DMA2??3,?????3,????USART3_TX_BUF
USART_Cmd(USART3, ENABLE); //????
#ifdef USART3_RX_EN //???????
//??????
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//????
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//?????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
NVIC_Init(&NVIC_InitStructure); //??????????VIC???
TIM2_Init(49,7199); //10ms??
USART3_RX_STA=0; //??
TIM2_Set(0); //?????4
#endif
}
//??3,printf ??
//???????????USART2_MAX_SEND_LEN??
void printf3(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
while(DMA_GetCurrDataCounter(DMA1_Channel2)!=0); //????7????
UART_DMA_Enable(DMA1_Channel2,strlen((const char*)USART3_TX_BUF)); //??dma????
}
//???4??????
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//?????
{
USART3_RX_STA|=1<<15; //??????
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //??TIMx??????
TIM2_Set(0); //??TIM4
}
}
//??TIM4???
//sta:0,??;1,??;
void TIM2_Set(u8 sta)
{
if(sta)
{
TIM_SetCounter(TIM2,0);//?????
TIM_Cmd(TIM2, ENABLE); //??TIMx
}else TIM_Cmd(TIM2, DISABLE);//?????4
}
//??????????
//???????APB1?2?,?APB1?36M
//arr:??????
//psc:??????
void TIM2_Init(u16 arr,u16 psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //????//TIM4????
//???TIM3???
TIM_TimeBaseStructure.TIM_Period = arr; //???????????????????????????
TIM_TimeBaseStructure.TIM_Prescaler =psc; //??????TIMx???????????
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //??????:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM??????
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //??????????TIMx???????
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //?????TIM4??,??????
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//?????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
NVIC_Init(&NVIC_InitStructure); //??????????VIC???
}
#endif
///////////////////////////////////////USART2 DMA·¢ËíÅäÖÃ2¿·Ö//////////////////////////////////
//DMA1μĸ÷í¨μàÅäÖÃ
//ÕaàïμÄ′«êäDÎê½êÇ1춨μÄ,Õaμãòa¸ù¾Y2»í¬μÄÇé¿öà′DT¸Ä
//′ó′æ′¢Æ÷->íaéèÄ£ê½/8λêy¾Y¿í¶è/′æ′¢Æ÷Ôöá¿Ä£ê½
//DMA_CHx MAí¨μàCHx
//cpar:íaéèμØÖ·
//cmar:′æ′¢Æ÷μØÖ·
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //ê1ÄüDMA′«êä
DMA_DeInit(DMA_CHx); //½«DMAμÄí¨μà1¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar; //DMAíaéèADC»ùμØÖ·
DMA_InitStructure.DMA_MemoryBaseAddr = cmar; //DMAÄú′æ»ùμØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //êy¾Y′«êä·½Ïò£¬′óÄú′æ¶áè¡·¢Ëíμ½íaéè
DMA_InitStructure.DMA_BufferSize = 0; //DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //íaéèμØÖ·¼Ä′æÆ÷2»±ä
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //êy¾Y¿í¶èÎa8λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //1¤×÷ÔúÕy3£»o′æÄ£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMAí¨μà xóμóDÖDóÅÏè¼¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMAí¨μàxûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä
DMA_Init(DMA_CHx, &DMA_InitStructure); //¸ù¾YDMA_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉDMAμÄí¨μàUSART1_Tx_DMA_ChannelËù±êê¶μļÄ′æÆ÷
}
//¿aÆôò»′ÎDMA′«êä
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
DMA_Cmd(DMA_CHx, DISABLE ); //1Ø±Õ Ö¸ê¾μÄí¨μà
DMA_SetCurrDataCounter(DMA_CHx,len);//DMAí¨μàμÄDMA»o′æμÄ′óD¡
DMA_Cmd(DMA_CHx, ENABLE); //¿aÆôDMA′«êä
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
串口.H
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
#define USART3_MAX_RECV_LEN 200 //×î′ó½óêÕ»o′æ×Ö½úêy
#define USART3_MAX_SEND_LEN 200 //×î′ó·¢Ëí»o′æ×Ö½úêy
#define USART3_RX_EN 1 //0,2»½óêÕ;1,½óêÕ.
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½óêÕ»o3å,×î′óUSART2_MAX_RECV_LEN×Ö½ú
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢Ëí»o3å,×î′óUSART2_MAX_SEND_LEN×Ö½ú
extern u16 USART3_RX_STA; //½óêÕêy¾Y×′ì¬
void USART3_Init(u32 bound); //′®¿ú23õê¼»ˉ
void TIM2_Set(u8 sta);
void TIM2_Init(u16 arr,u16 psc);
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar);
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len);
void printf3(char* fmt,...);
// u8 USART2_Hand(char *a) ;
void USART3_CLR_Buf(void);
extern u16 point2;
#endif
主程序
#define Success 1U
#define Failure 0U
//¶¨òå±äá¿
unsigned long Time_Cont = 0; //¶¨ê±Æ÷¼ÆêyÆ÷
char phoneNumber[] = "18377457356"; //ìæ»»3éDèòa±»2|′òμç»°μÄoÅÂë
char msg[] = "yourenkaojin"; //¶ìDÅÄúèY
void errorLog(int num);
void phone(char *number);
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
void Sys_Soft_Reset(void);
void sendMessage(char *number,char *msg);
int main(void)
{
delay_init();
NVIC_Configuration(); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
uart_init(9600); //′®¿ú3õê¼»ˉÎa9600
USART3_Init(9600); //′®¿ú22¨ìØÂê9600
printf3("AT\r\n");
Init_LEDpin();
printf("Welcome to use!\r\n");
printf("ILoveMcu.taobao.com!\r\n");
if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
else errorLog(1);
delay_ms(10);
if (sendCommand("AT+CPIN?\r\n", "READY", 3000, 10) == Success);
else errorLog(3);
delay_ms(10);
if (sendCommand("AT+CREG?\r\n", ",1", 3000, 10) == Success); //±¾μØSIM¿¨
else if(sendCommand("AT+CREG?\r\n", ",5", 3000, 10) == Success );//ÂtóÎSIM¿¨
else errorLog(3);
delay_ms(10);
if (sendCommand("AT+CMGF=1\r\n", "OK\r\n", 1000, 10) == Success);
else errorLog(3);
delay_ms(10);
if (sendCommand("AT+CSCS=\"GSM\"\r\n", "OK\r\n", 1000, 10) == Success);
else errorLog(5);
delay_ms(10);
sendMessage(phoneNumber,msg); //·¢Ëí¶ìDÅ
while(1)
{
}
}
void sendMessage(char *number,char *msg)
{
char send_buf[20] = {0};
memset(send_buf, 0, 20); //Çå¿Õ
strcpy(send_buf, "AT+CMGS=\"");
strcat(send_buf, number);
strcat(send_buf, "\"\r\n");
if (sendCommand(send_buf, ">", 3000, 10) == Success);
else errorLog(6);
if (sendCommand(msg, msg, 3000, 10) == Success);
else errorLog(7);
memset(send_buf, 0,20); //Çå¿Õ
send_buf[0] = 0x1a;
send_buf[1] = '\0';
if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
else errorLog(8);
}
void errorLog(int num)
{
printf("ERROR%d\r\n",num);
while (1)
{
if (sendCommand("AT\r\n", "OK\r\n", 100, 10) == Success)
{
Sys_Soft_Reset();
}
delay_ms(200);
}
}
void Sys_Soft_Reset(void)
{
SCB->AIRCR =0X05FA0000|(u32)0x04;
}
void phone(char *number)
{
char send_buf[20] = {0};
memset(send_buf, 0, 20); //Çå¿Õ
strcpy(send_buf, "ATD");
strcat(send_buf, number);
strcat(send_buf, ";\r\n");
if (sendCommand(send_buf, "OK\r\n", 10000, 10) == Success);
else errorLog(4);
}
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
unsigned char n;
USART3_CLR_Buf();
for (n = 0; n < Retry; n++)
{
printf3(Command); //·¢ËíGPRSÖ¸áî
printf("\r\n***************send****************\r\n");
printf(Command);
Time_Cont = 0;
while (Time_Cont < Timeout)
{
delay_ms(100);
Time_Cont += 100;
if (strstr(USART3_RX_BUF, Response) != NULL)
{
printf("\r\n***************receive****************\r\n");
printf(USART3_RX_BUF);
USART3_CLR_Buf();
return Success;
}
}
Time_Cont = 0;
}
printf("\r\n***************receive****************\r\n");
printf(USART3_RX_BUF);
USART3_CLR_Buf();
return Failure;
}
|
|