/******************************************************************************* *******************************************************************************/ #include "stm32f10x_lib.h" void RCC_Configuration(void); void GPIO_Configuration(void); void USART1_Configuration(void); void USART2_Configuration(void); void NVIC_Configuration(void); void USART1_3G(); u16 i;//短延时用 /******************************************************************************* * 函数名 : main * 函数描述 : 主函数 *******************************************************************************/ int main(void) { RCC_Configuration();//配置RCC时钟 GPIO_Configuration(); //配置GPIO端口 NVIC_Configuration();//配置nvic中断向量管理 USART1_Configuration(); //配置USART1 USART2_Configuration(); //配置USART2 USART1_3G();//使用串口1首先完成3g模块初始化 while(1) { } } void delay(int t) { int i,j; for(i=0;i<3000;++i) for(j=0;j<30000;++j) ; } /*********************************************** @入参:串口号,单个字节 @函数说明:发送单个字节数据 ***********************************************/ void USART_SEND(USART_TypeDef* USARTx,u8 Data) { USART1->SR; USART_SendData(USARTx,Data); while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET){} } /*********************************************** @函数入参:串口号,字符串数组 @函数说明:发送数组 ***********************************************/ void USART_SENDS(USART_TypeDef* USARTx,u8 send_data[]) { while(*send_data!='\0') { USART_SEND(USARTx,*send_data); send_data++; } } /* @参数:无参 @函数说明:串口1对3g模块发送at指令进行初始化 */ void USART1_3G() { delay(150); USART_SENDS(USART1,"at^ipinit=\"3gnet\"\r\n"); delay(200); USART_SENDS(USART1,"at^ipopen=1,\"TCP\",\"103.44.145.245\",17922,45678\r\n"); delay(150); USART_SENDS(USART1,"AT^IPENTRANS=1\r\n"); delay(50); } /******************************************************************************* * 函数名 : RCC_Configuration * 函数描述 : 设置系统各部分时钟 *******************************************************************************/ void RCC_Configuration(void) { ErrorStatus HSEStartUpStatus;//定义枚举类型变量 HSEStartUpStatus RCC_DeInit(); //复位系统时钟设置 RCC_HSEConfig(RCC_HSE_ON); //开启HSE HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振并稳定 if(HSEStartUpStatus == SUCCESS)//判断HSE起是否振成功 { RCC_HCLKConfig(RCC_SYSCLK_Div1);// 选择HCLK(AHB)时钟源为SYSCLK 1分频 RCC_PCLK2Config(RCC_HCLK_Div1);//选择PCLK2时钟源为 HCLK(AHB) 1分频 RCC_PCLK1Config(RCC_HCLK_Div2);//选择PCLK1时钟源为 HCLK(AHB) 2分频 FLASH_SetLatency(FLASH_Latency_2);//设置FLASH延时周期数为2 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能FLASH预取缓存 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9 ,PLL输出频率为 8MHz * 9 = 72MHz RCC_PLLCmd(ENABLE); //使能PLL while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//等待PLL输出稳定 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择SYSCLK时钟源为PLL while(RCC_GetSYSCLKSource() != 0x08);//等待PLL成为SYSCLK时钟源 } RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE); //开启USART1和GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //开启USART2 } /******************************************************************************* * 函数名 : NVIC_Configuration * 函数描述 : 设置NVIC *******************************************************************************/ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);/* Set the Vector Table base location at 0x20000000 */ #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel ; //通道设置为串口2中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //中断占先等级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应优先级0,赋予高的优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开中断 NVIC_Init(&NVIC_InitStructure); } /******************************************************************************* * 函数名 : GPIO_Configuration * 函数描述 : 设置各GPIO端口功能 *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO 初始化结构体 GPIO_InitStructure GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//设置USART1的Tx脚(PA.9)为第二功能推挽输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//设置USART1的Rx脚(PA.10)为上拉输入脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//设置USART2的Tx脚(PA.2)为第二功能推挽输出模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA , &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//设置USART2的Rx脚(PA.3)为浮空输入脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA , &GPIO_InitStructure); } /******************************************************************************* * 函数名 : USART1_Configuration * 函数描述 : 设置USART1 *******************************************************************************/ void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体 USART_InitStructure USART_InitStructure.USART_BaudRate = 115200;//波特率为9600bps USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1;//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(USART1 , &USART_InitStructure); USART_Cmd(USART1 , ENABLE); //使能USART1 USART_ClearFlag(USART1,USART_FLAG_TC);//发送完成标志位 } /******************************************************************************* * 函数名 : USART2_Configuration * 函数描述 : 设置USART2 *******************************************************************************/ void USART2_Configuration(void) { USART_InitTypeDef USART_InitStructure; //定义USART初始化结构体 USART_InitStructure USART_InitStructure.USART_BaudRate = 115200;//波特率为9600bps USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1;//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(USART2 , &USART_InitStructure);//用初始化后的结构体来初始化串口2,调用函数 USART_Cmd(USART2 , ENABLE); //使能USART2 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //一定要开启串口接收中断 USART_ClearFlag(USART2,USART_FLAG_TC);//发送完成标志位 } /******************************************************************************* * 函数名 : USART2_IRQHandler * 函数描述 : 串口2的中断函数入口 * 函数说明 :该中断函数在stm32f10x_it.c,为方便理解而剪切到main.c *******************************************************************************/ void USART2_IRQHandler(void) { if(USART_GetFlagStatus(USART2 , USART_IT_RXNE) == SET) { USART_ClearITPendingBit(USART2,USART_IT_RXNE); USART_SendData(USART1 , USART_ReceiveData(USART2)); for(i = 0; i < 500; i ++); } } |
串å£2æ¶ ä¸²å£1ttlè¿çµè
还是要自己做的好,万事都要靠自己,不懂的大家一起讨论。
2:检查UART的波特率、校验方式、停止位。