求教各位大侠,好几年未作开发了,最近刚刚使用 stm32开发一个产品,碰到一个问题,请各位指教?
具体情况是我现在在做硬件配置软件初始化,在设置串口拾编译老是报错,查了好长时间,也为解决
**********************************************************************************
* rs485通讯接口
********************************************************************************
*按键输入接口占用CPU口线PA8、PA9、PA10 串口1
* PA8->485
* PA9->TXD
* PA10->RXD
*********************************************************************************************************/
//加载库文件
#include "stm32f10x.h"
/*********************************************************************************************************
* 函数名 : Rs485_GPIO_Config
* 描述 :
* 输入参数: 无
* 输出参数: 无
**********************************************************************************************************/
/*配置USART1、GPIOA的外设时钟和管脚复用 */
void Rcc_Config(void)
{
/*开启USART1、GPIOA的外设时钟和管脚复用功能*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}
//********************************************************************
/*配置RS485硬件管脚*/
//********************************************************************
void rs485_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*配置要控制的485片选 GPIO PA8管脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
/*设置引脚模式为复用推挽输出模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化要控制选中的管脚GPIOA */
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*配置要控制的USART1 GPIO PA9管脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
/*设置引脚模式为复用推挽输出模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化要控制选中的管脚GPIOA */
GPIO_Init(GPIOA, &GPIO_InitStructure);
/***********************************************/
/*配置要控制的USART1 GPIO PA10管脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
/*设置引脚模式为浮空输入模式 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
/*调用库函数,初始化要控制选中的管脚GPIOA */
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*****************************************************************
* USART1模式配置
******************************************************************/
void Usart_Config(void)
{
/*定义一个USART_InitTypeDef的结构体*/
USART_InitTypeDef USART_InitStructure;
/*开启外设及串口时钟*/
Rcc_Config();
/*设置通讯波特率为115200 */
USART_InitStructure.USART_BaudRate = 115200;
/*传输字长为八个数据位*/
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_Tx | USART_Mode_Rx;
/*调用库函数,初始化USART1配置 */
USART_Init(USART1, &USART_InitStructure);
/*使能USART1通讯中断 */
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
/*使能USART1*/
USART_Cmd(USART1, ENABLE);
/*配置RS485硬件管脚*/
rs485_GPIO_Config();
}
在STM32F10x_CONF_H里已经把加载了"include "stm32f10x_usart.h"
可编译时提示:ERROR :L6218E: Undefined symbol USART_Cmd(referred from rs485.o)
ERROR :L6218E: Undefined symbol USART_Init(referred from rs485.o)
ERROR :L6218E: Undefined symbol USART_ITConfig(referred from rs485.o)
如果在STM32F10x_CONF_H里把#include "stm32f10x_usart.h"注释掉,提示
USART_WordLength_8b;
USART_StopBits_1;
USART_Parity_No;
USART_HardwareFlowControl_None;
USART_Mode_Tx | USART_Mode_Rx;
这些值未定义。
我想问一下各位,为什么用结构体里的对象可以编译通过,而stm32f10x_usart.h里定义的函数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
调用会编译出错?
我其它的硬件接口处理模式和rs485接口一样,为什么就能通过?
求各位大侠指教,万分感谢,因几年为做开发了好多东西都忘了,再次表示感谢!
} |