momoxihuanni1 2017-10-18 07:12 采纳率: 0%
浏览 2463

STM32L011K4 uart串口多机通信 的问题

   本人在使用stm32L0114K做多机通信,一个主机给多个从机通过串口发消息,因此从机的串口需要被配置成不同的地址,并且使用静默模式。然后问题来了。
 手册上说设置为静默模式,需要把RQR寄存器中的MMRQ位置1,但是无论怎么写,这位都没有被写成1,一直是0,所以现在很困惑。
 不知道是自己配置有误,还是寄存器那位禁止这样的写操作(但是我并没有在手册上看到)?
  • 写回答

2条回答 默认 最新

  • momoxihuanni1 2017-10-18 07:39
    关注

    本人在使用stm32L0114K做多机通信,一个主机给多个从机通过串口发消息,因此从机的串口需要被配置成不同的地址,并且使用静默模式。然后问题来了。
    手册上说设置为静默模式,需要把RQR寄存器中的MMRQ位置1,但是无论怎么写,这位都没有被写成1,一直是0,所以现在很困惑。
    不知道是自己配置有误,还是寄存器那位禁止这样的写操作(但是我并没有在手册上看到)?
    后面会贴代码,十分渴望各位朋友们给我进行些点播,谢谢大家!

    这个代码就是测试RQR寄存器中的MMRQ位是否为1,但是它就是不为1:
    int main(void)
    {

    HAL_Init();

    /* Configure the system clock to 2 MHz /
    SystemClock_Config();
    /
    ¾²Ä¬Ä£Ê½ */

    /* Configure LED3 */
    BSP_LED_Init(LED3);

    /*##-1- Configure the UART peripheral ######################################*/
    /* Put the USART peripheral in the Asynchronous mode (UART Mode) /
    /
    UART configured as follows:
    - Word Length = 8 Bits
    - Stop Bit = One Stop bit
    - Parity = None
    - BaudRate = 9600 baud
    - Hardware flow control disabled (RTS and CTS signals) */
    UartHandle.Instance = USARTx;

    UartHandle.Init.BaudRate = 9600;
    UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
    UartHandle.Init.StopBits = UART_STOPBITS_1;
    UartHandle.Init.Parity = UART_PARITY_NONE;
    UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    UartHandle.Init.Mode = UART_MODE_TX_RX;
    UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
    UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if (HAL_MultiProcessor_Init(&UartHandle, 1, UART_WAKEUPMETHOD_ADDRESSMARK) != HAL_OK) //给串口配置地址
    {
    Error_Handler();
    }
    HAL_MultiProcessorEx_AddressLength_Set(&UartHandle, UART_ADDRESS_DETECT_7B); //串口地址长度
    HAL_MultiProcessor_EnableMuteMode(&UartHandle); //串口使能静默模式
    HAL_MultiProcessor_EnterMuteMode(&UartHandle); //串口进入静默模式,就是把MMRQ设为1(这个的具体代码贴在后面)
    if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
    {
    Error_Handler();
    }

    if(HAL_UART_Init(&UartHandle) != HAL_OK)
    {
    Error_Handler();
    }

         if((USART2->RQR &UART_MUTE_MODE_REQUEST) == 0)  //这里仅仅想判断一下寄存器这位数据是不是已经被赋值为1了,但是并没有
     {
          BSP_LED_On(LED3);
          HAL_Delay(1000);
          BSP_LED_Off(LED3);
          HAL_Delay(1000);
          BSP_LED_On(LED3);
          HAL_Delay(1000);
          BSP_LED_Off(LED3);
     }
     else
         BSP_LED_On(LED3);
        }
    

    /*开始静默模式,即给RQR寄存器的MMRQ位写入1*/
    void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
    {
    __HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);
    }

    评论

报告相同问题?

悬赏问题

  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B