微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 485通信 重映射 问题

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--) ;   
   }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top