发新帖我要提问
123
返回列表
打印
[应用相关]

stm32 modbus RTU程序

[复制链接]
楼主: chenqiang10
手机看帖
扫描二维码
随时随地手机跟帖
41
阿民123| | 2020-8-21 16:04 | 只看该作者 回帖奖励 |倒序浏览
思路清晰,层次分明,佩服!

使用特权

评论回复
42
sun230722| | 2021-1-20 14:34 | 只看该作者
学习一下

使用特权

评论回复
43
Joy1Pp| | 2021-1-21 09:05 | 只看该作者

使用特权

评论回复
44
qinxiaolin027| | 2021-1-21 14:16 | 只看该作者
很长,很强大。

使用特权

评论回复
45
zhengshuai888| | 2021-1-21 19:36 | 只看该作者
看看,谢谢楼主分享。

使用特权

评论回复
46
robincui| | 2021-11-10 09:32 | 只看该作者
比较正规,思路清晰,感谢

使用特权

评论回复
47
nos001| | 2022-10-20 13:31 | 只看该作者
楼主写的清晰,地址限制有些小,HMI的寄存器地址很大的。

使用特权

评论回复
48
nos001| | 2022-10-20 14:13 | 只看该作者

uart dma发送比较好,不占核心,全部发送完才产生一次uart发送中断

使用特权

评论回复
49
nos001| | 2022-10-20 14:27 | 只看该作者
/**************************************************************************************************
* brief  rs485 dma 发送
* param  len发送字节数
* note   DMA发送数据,要先关闭dma通道,才能设置当前发送的数据单元长度,再开启dma通道。
*************************************************************************************************/
void rs485_dma_tx( uint8_t len )
{
    /* RS485 DE使能,RE禁止 */
    rs485_tx_enable();
    rs485_rx_disable();

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

    /* Enable USART2 DMA TX Channel */
    dma_channel_enable( UART_TX_DMA_CHANNEL, ENABLE );
}

使用特权

评论回复
50
nos001| | 2022-10-20 14:29 | 只看该作者
本帖最后由 nos001 于 2022-10-20 14:31 编辑

雅特力的421

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

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

        /* 通道关闭,才能对通道寄存器赋值 */
        dma_channel_enable( UART_RX_DMA_CHANNEL, DISABLE );  
        /* 接收的数据长度 */
        Uart_dma_rxbyte = DATA_SIZE_DMA - DMA_GetCurrDataCounter( UART_RX_DMA_CHANNEL );
        /* 重新赋值计数值 */
        DMA_SetCurrDataCounter( UART_RX_DMA_CHANNEL, DATA_SIZE_DMA );  
        dma_channel_enable( UART_RX_DMA_CHANNEL, ENABLE );
        
        rs485_rx_disable();
        uart_dma_rxFull = 1;
        
        TMR_SetCounter( TMR6, 0 );
    }
   
    /* 串口接收字符中断 */
    if( USART_GetITStatus( USART1, USART_INT_RDNE ) != RESET )
    {
        USART_ClearFlag( USART1, USART_FLAG_RDNE );       

        receive = USART_ReceiveData(USART1);
        Queue_In( &sQueUart, &receive );

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


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

        rs485_tx_disable();
        rs485_rx_enable();       

        TMR_SetCounter( TMR6, 0 );       
    }
}

使用特权

评论回复
51
liliang9554| | 2022-10-20 22:17 | 只看该作者
MODBUS大部分功能写

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则