[应用相关] stm32 modbus RTU程序

[复制链接]
12974|51
阿民123 发表于 2020-8-21 16:04 | 显示全部楼层
思路清晰,层次分明,佩服!
sun230722 发表于 2021-1-20 14:34 | 显示全部楼层
学习一下
Joy1Pp 发表于 2021-1-21 09:05 | 显示全部楼层
qinxiaolin027 发表于 2021-1-21 14:16 | 显示全部楼层
很长,很强大。
zhengshuai888 发表于 2021-1-21 19:36 来自手机 | 显示全部楼层
看看,谢谢楼主分享。
robincui 发表于 2021-11-10 09:32 | 显示全部楼层
比较正规,思路清晰,感谢
nos001 发表于 2022-10-20 13:31 | 显示全部楼层
楼主写的清晰,地址限制有些小,HMI的寄存器地址很大的。
nos001 发表于 2022-10-20 14:13 | 显示全部楼层

uart dma发送比较好,不占核心,全部发送完才产生一次uart发送中断
nos001 发表于 2022-10-20 14:27 | 显示全部楼层
  1. /**************************************************************************************************
  2. * brief  rs485 dma 发送
  3. * param  len发送字节数
  4. * note   DMA发送数据,要先关闭dma通道,才能设置当前发送的数据单元长度,再开启dma通道。
  5. *************************************************************************************************/
  6. void rs485_dma_tx( uint8_t len )
  7. {
  8.     /* RS485 DE使能,RE禁止 */
  9.     rs485_tx_enable();
  10.     rs485_rx_disable();

  11.     /* Disable USART2 DMA TX Channel,只有通道关闭才能对TCNT赋值 */
  12.     dma_channel_enable( UART_TX_DMA_CHANNEL, DISABLE );
  13.    
  14.     /* 设置当前发送的数据单元长度 */
  15.     DMA_SetCurrDataCounter( UART_TX_DMA_CHANNEL, len );

  16.     /* Enable USART2 DMA TX Channel */
  17.     dma_channel_enable( UART_TX_DMA_CHANNEL, ENABLE );
  18. }
nos001 发表于 2022-10-20 14:29 | 显示全部楼层
本帖最后由 nos001 于 2022-10-20 14:31 编辑

雅特力的421

  1. /**********************************************************************************************************
  2. * brief  USART1中断服务程序
  3. * note   串口字符接收中断、空闲中断只允许一个
  4. * note   空闲中断需同时判断中断状态位、DMA通道允许位
  5. **********************************************************************************************************/
  6. void USART1_IRQHandler( void )
  7. {
  8.     uint8_t clr, receive;

  9.     /* 串口空闲中断,可以做串口dma不定长接收 */
  10.     if( ( USART_GetITStatus( USART1, USART_INT_IDLEF ) != RESET ) && dma_ien_get( DMA1_Channel3, DMA_CHCTRL1_CHEN ) )
  11.     {
  12.         /* 空闲中断清除标志 */
  13.         clr = USART1->STS;                                                         
  14.         clr = USART1->DT;         

  15.         /* 通道关闭,才能对通道寄存器赋值 */
  16.         dma_channel_enable( UART_RX_DMA_CHANNEL, DISABLE );  
  17.         /* 接收的数据长度 */
  18.         Uart_dma_rxbyte = DATA_SIZE_DMA - DMA_GetCurrDataCounter( UART_RX_DMA_CHANNEL );
  19.         /* 重新赋值计数值 */
  20.         DMA_SetCurrDataCounter( UART_RX_DMA_CHANNEL, DATA_SIZE_DMA );  
  21.         dma_channel_enable( UART_RX_DMA_CHANNEL, ENABLE );
  22.         
  23.         rs485_rx_disable();
  24.         uart_dma_rxFull = 1;
  25.         
  26.         TMR_SetCounter( TMR6, 0 );
  27.     }
  28.    
  29.     /* 串口接收字符中断 */
  30.     if( USART_GetITStatus( USART1, USART_INT_RDNE ) != RESET )
  31.     {
  32.         USART_ClearFlag( USART1, USART_FLAG_RDNE );       

  33.         receive = USART_ReceiveData(USART1);
  34.         Queue_In( &sQueUart, &receive );

  35.         /* 接收字符间隔超时计数器清零,超过3.5字符认为是空闲 */
  36.         TMR_SetCounter( TMR6, 0 );
  37.         TMR_SetAutoreload( TMR6, OVER_TIME_35CHAR - 1 );
  38.         TMR_Cmd( TMR6, ENABLE );
  39.                 uart_rx_en_tmr = 1;
  40.     }   


  41.     /* 串口发送完成中断,如果是dma发送,全部数据发送完产生中断,发送期间并不会发生中断 */
  42.     if( USART_GetITStatus( USART1, USART_INT_TRAC ) != RESET )
  43.     {
  44.         USART_ClearFlag( USART1, USART_FLAG_TRAC );

  45.         rs485_tx_disable();
  46.         rs485_rx_enable();       

  47.         TMR_SetCounter( TMR6, 0 );       
  48.     }
  49. }
liliang9554 发表于 2022-10-20 22:17 | 显示全部楼层
MODBUS大部分功能写
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部