[mw_shl_code=c,true][/mw_shl_code]
[mw_shl_code=c,true]#include "stm32f10x_lib.h"
/* 自定义同义关键字 --------------------------------------------------*/
/* 自定义参数宏 -------------------------------------------------------*/
/* 自定义函数宏 --------------------------------------------------*/
/* 自定义变量 --------------------------------------------------*/
/* 自定义函数声明 --------------------------------------------------*/
void RccInitialisation(void);
void GpioInitialisation(void);
void SystickInitialisation(void);
void USART_Printf(USART_TypeDef* USARTx,char *pch) ;
void USART_Configuration(void);
void Delay_Second(void);
/**************************************************************************
* 函数名 : main
* 函数描述 : main 函数
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
**************************************************************************/
int main(void)
{
vu16 i;
/* 设置系统时钟 */
RccInitialisation();
/* 设置GPIO端口 */
GpioInitialisation();
/* 设置Systick定时器 */
SystickInitialisation();
USART_Configuration();
/*PA10置低,给M35一个脉冲,持续2秒*/
GPIO_WriteBit(GPIOA , GPIO_Pin_10,Bit_RESET);
GPIO_WriteBit(GPIOA , GPIO_Pin_0,Bit_SET);
Delay_Second();
Delay_Second();
Delay_Second();
/*PA10置高,需要关机了,再拉低PA10*/
GPIO_WriteBit(GPIOA , GPIO_Pin_10,Bit_SET);
Delay_Second();
Delay_Second();
Delay_Second();
// USART_Printf(USART3,"at+ipr=9600&w \r\n");
USART_Printf(UART5,"2014年8月12日首次调试!预祝成功\n\r");
Delay_Second();
USART_Printf(UART5,"第一秒\n\r");
Delay_Second();
USART_Printf(UART5,"这第二秒\n\r");
Delay_Second();
Delay_Second();
Delay_Second();
USART_Printf(UART5,"这第五秒\r");
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
USART_Printf(UART5,"这第二十秒");
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
USART_Printf(USART3,"AT\r\n");
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
Delay_Second();
USART_Printf(USART3,"ATD18577332035;\r\n");
}
/**************************************************************************
* 函数名 : RccInitialisation
* 函数描述 : 设置系统各部分时钟
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
**************************************************************************/
void RccInitialisation(void)
{
/* 定义枚举类型变量 HSEStartUpStatus */
ErrorStatus HSEStartUpStatus;
/* 复位系统时钟设置*/
RCC_DeInit();
/* 开启HSE*/
RCC_HSEConfig(RCC_HSE_ON);
/* 等待HSE起振并稳定*/
HSEStartUpStatus = RCC_WaitForHSEStartUp();
/* 判断HSE起是否振成功,是则进入if()内部 */
if(HSEStartUpStatus == SUCCESS)
{
/* 选择HCLK(AHB)时钟源为SYSCLK 1分频 */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 选择PCLK2时钟源为 HCLK(AHB) 1分频 */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 选择PCLK1时钟源为 HCLK(AHB) 2分频 */
RCC_PCLK1Config(RCC_HCLK_Div2);
/* 设置FLASH延时周期数为2 */
FLASH_SetLatency(FLASH_Latency_2);
/* 使能FLASH预取缓存 */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 选择锁相环(PLL)时钟源为HSE 1分频,倍频数为9,则PLL输出频率为 8MHz * 9 = 72MHz
*/
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL输出稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 选择SYSCLK时钟源为PLL */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待PLL成为SYSCLK时钟源 */
while(RCC_GetSYSCLKSource() != 0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3|RCC_APB1Periph_UART5,ENABLE);
}
/**************************************************************************
* 函数名 : GpioInitialisation
* 函数描述 : 设置各GPIO端口功能
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
**************************************************************************/
void GpioInitialisation(void)
{
/* 定义GPIO初始化结构体 GPIO_InitStructure*/
GPIO_InitTypeDef GPIO_InitStructure;
/* 设置PA10,最大翻转频率为50MHz*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 设置USART3的Tx脚(PB.10)为第二功能推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB , &GPIO_InitStructure);
/* 设置USART3的Rx脚(PB.11)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB , &GPIO_InitStructure);
/* 设置UART5的Tx脚(PC.12)为第二功能推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC , &GPIO_InitStructure);
/* 设置UART5的Rx脚(PD.2)为浮空输入脚 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD , &GPIO_InitStructure);
/* 设置 GPIOA.4 为推挽输出,最大翻转频率为50MHz*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**************************************************************************
* 函数名 : SystickInitialisation
* 函数描述 : 设置Systick定时器,重装载时间为20ms
* 输入参数 : 无
* 输出结果 : 无
* 返回值 : 无
**************************************************************************/
void SystickInitialisation(void)
{
/* 失能Systick定时器 */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* 选择HCLK为Systick时钟源 */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
/* 清除Systick计数器 */
SysTick_CounterCmd(SysTick_Counter_Clear);
/* 主频为72MHz,配置计数值为72000 * 20可以得到20ms定时间隔*/
SysTick_SetReload(9000*1000);
/* 启动Systick定时器 */
SysTick_CounterCmd(SysTick_Counter_Enable);
}
void Delay_Second(void)
{
/* 启动Systick计数 */
SysTick_CounterCmd(SysTick_Counter_Enable);
/* 等待Systick计数至0 */
while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT) == 0);
/* 失能Systick定时器 */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* 清除Systick计数器 */
SysTick_CounterCmd(SysTick_Counter_Clear);
}
void USART_Configuration(void)
{
/* 定义USART初始化结构体 USART_InitStructure */
USART_InitTypeDef USART_InitStructure;
/*
* 波特率为9600bps
* 8位数据长度
* 1个停止位,无校验
* 禁用硬件流控制
* 禁止USART时钟
* 时钟极性低
* 在第2个边沿捕获数据
* 最后一位数据的时钟脉冲不从 SCLK 输出
*/
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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(UART5 , &USART_InitStructure);
/* 使能USART3 */
USART_Cmd(USART3 , ENABLE);
USART_Cmd(UART5 , ENABLE);
}
void USART_Printf(USART_TypeDef* USARTx,char *pch)
{
/* 这里是判断'\0'是否到了字符串的行尾,这个字符是看不到的,字符串的结束符就是'\0'
* 如果具体还有不懂的请看C语言,这里通过while()循环,逐个字符逐个字符的传输和显示 */
while(*pch != '\0') /* 我们这里用指针表示,*pch就是一个字符,pch就是该字符的地址 */
{
USART_SendData(USARTx,*pch); /* 在这里我们将这个要显示的字符地址传输给另外一个函数 */
/* 当发送完一个字节后,检测一下“TDR(串口的数据传输寄存器)”是否为空了,因为有可能在一些
* 其他某些模式,缓冲寄存器可能会有很多数据,需要一点时间才能清空,其实增加了这句代码之后
* 会让我们的串口驱动更加健壮,在各种情况下都能正常稳定的工作 */
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
/* 以下是我们查看《STM32F103中文手册》获得494页24.6.1节 状态寄存器(USART_SR)章节
这里说的就是我们程序代码里的USART_FLAG_TXE这个标志位,发送完毕后,再进行标志清空,进行下一次传输
TXE:发送数据寄存器空
当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。
0:数据还没有被转移到移位寄存器;
1:数据已经被转移到移位寄存器。
注意:单缓冲器传输中使用该位。*/
USART_ClearFlag(USARTx, USART_FLAG_TXE);
pch++; /* 此时pch地址加1,指向下一个字符 */
}
}
[/mw_shl_code]
这是一个ARM多串口可以使用USART_Printf,我用这个串口发送数据,收到的数据都是正常的,但是发送AT指令的时候,GSM模块能够收到相应的指令,但是就是不执行,同样,我用电脑端发送同样的AT指令数据,GSM模块就会执行。
以前我用单片机,用同样的语句
printf(“at\r\n”); 它就执行对应的AT指令
但是现在,我用ARM发送
USART_Printf(USART1,“at\r\n”); 它能收到,但是就是不执行,数据格式一样!。。收到的也是61 74 0d 0a !
所以有点疑惑了。。。
上面是我的原函数。。。。原子哥分析下,哪里的问题。。 |