/*******************************************************************************
*******************************************************************************/
#include "
STM32f10x_lib.h"
void RCC_Configura
tion(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!=' ')
{
USART_SEND(USARTx,*send_data);
send_data++;
}
}
/*
@参数:无参
@函数说明:串口1对3g模块发送at指令进行初始化
*/
void USART1_3G()
{
delay(150);
USART_SENDS(USART1,"at^ipinit="3gnet"
");
delay(200);
USART_SENDS(USART1,"at^ipopen=1,"TCP","103.44.145.245",17922,45678
");
delay(150);
USART_SENDS(USART1,"AT^IPENTRANS=1
");
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:检查UART的波特率、校验方式、停止位。
一周热门 更多>