485通信 重映射 问题
时间:10-02
整理:3721RD
点击:
用的107的芯片 pD5 Pd6 重映射USART2 的tx 和 rx A9是MAX3485的使能端 但是485一直调不通 贴下程序请各位大神看看指教下,多谢了。
int main(void)
{
//u8 temp=0;
RCC_Configuration();
Usart2_Remap();
GPIO_Configuration();
USART2_Configuration();
//NVIC_Configuration();
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_9);
//接收中断
if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
{
temp=USART_ReceiveData(USART2);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
delay_ms(1);
USART_SendData(USART2,0x55);
//发送寄存器标志为空
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
delay_ms(2);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
}
}
}
/*************************************************
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
**************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
}
void Usart2_Remap()
{
GPIO_InitTypeDef GPIO_InitStructure;
//打开重映射和USART重映射后的IO引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
//IO口重映射开启
GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
//配置重映射引脚,这里只需要配置重映射后的IO,原来的不需要去配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
//打开重映射和USART重映射后的IO引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**********************************************
函数: NVIC_Configuration()
功能: 中断控制 配置
参数: 无
返回: 无
**************************************************/
/*void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} */
/*************************************************
函数: USART1_Configuration(void)
功能: 串口 配置
参数: 无
返回: 无
**************************************************/
void USART2_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
//Usart2_Remap();
/* 第1步:打开GPIO和USART部件的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* 第4步:配置USART1参数
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
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(USART2, &USART_InitStructure);
/* 若接收数据寄存器满,则产生中断 */
// USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
/* 第5步:使能 USART1, 配置完毕 */
USART_Cmd(USART2, ENABLE);
/* 如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART2, USART_FLAG_TC); // 清标志
}
/*************************************************
函数: delay_ms(uint16_t delay_value)
功能: 延时
参数: 无
返回: 无
**************************************************/
void delay_ms(uint16_t delay_value)//系统时钟72M情况下
{
uint16_t i=0;
while(delay_value--)
{
i=12000; //有人用18000
while(i--) ;
}
}
int main(void)
{
//u8 temp=0;
RCC_Configuration();
Usart2_Remap();
GPIO_Configuration();
USART2_Configuration();
//NVIC_Configuration();
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
while(1)
{
GPIO_SetBits(GPIOA,GPIO_Pin_9);
//接收中断
if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
{
temp=USART_ReceiveData(USART2);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
delay_ms(1);
USART_SendData(USART2,0x55);
//发送寄存器标志为空
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
delay_ms(2);
GPIO_ResetBits(GPIOA,GPIO_Pin_9);
}
}
}
/*************************************************
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
**************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) //等待PLL时钟就绪
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟 = PLL时钟
while(RCC_GetSYSCLKSource() != 0x08) //检查PLL时钟是否作为系统时钟
{
}
}
}
void Usart2_Remap()
{
GPIO_InitTypeDef GPIO_InitStructure;
//打开重映射和USART重映射后的IO引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO,ENABLE);
//IO口重映射开启
GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
//配置重映射引脚,这里只需要配置重映射后的IO,原来的不需要去配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
//打开重映射和USART重映射后的IO引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/**********************************************
函数: NVIC_Configuration()
功能: 中断控制 配置
参数: 无
返回: 无
**************************************************/
/*void NVIC_Configuration()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} */
/*************************************************
函数: USART1_Configuration(void)
功能: 串口 配置
参数: 无
返回: 无
**************************************************/
void USART2_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
//Usart2_Remap();
/* 第1步:打开GPIO和USART部件的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* 第4步:配置USART1参数
- BaudRate = 9600 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
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(USART2, &USART_InitStructure);
/* 若接收数据寄存器满,则产生中断 */
// USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
/* 第5步:使能 USART1, 配置完毕 */
USART_Cmd(USART2, ENABLE);
/* 如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART2, USART_FLAG_TC); // 清标志
}
/*************************************************
函数: delay_ms(uint16_t delay_value)
功能: 延时
参数: 无
返回: 无
**************************************************/
void delay_ms(uint16_t delay_value)//系统时钟72M情况下
{
uint16_t i=0;
while(delay_value--)
{
i=12000; //有人用18000
while(i--) ;
}
}
