论坛大神
- 积分
- 1876
- 金钱
- 1876
- 注册时间
- 2014-9-10
- 在线时间
- 208 小时
|
发表于 2017-8-10 11:06:17
|
显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-10 16:00 编辑
八度大神,你好。我用的stm32f103ZE
之前用USART1已经完成了Modbus从机的移植,接口为232和pc通信,产品已使用两年。
现在我拿到的原理图加了485和pc通信。同样的协议,保证之前232通信的基础上,通过这几个实现485通信:
PC10-RS485-TX:UART4_TX
PC11-RS485-RX:UART4_RX
PC12-RS485-EN:转换收发态
我在Modbus里面添加UART4初始化等,有USART1的地方都添加了UART4,但是usart1已经无法正常使用。
而我至少先得保证USART1仍可以正常工作。注释掉UART4的NVIC初始化部分USART1是能正常使用的。
同时我也不清楚这种方案可行否,Modbus能否同时支持两个串口呢?
我的中断函数如下,定义了一个全局变量来区分是收到1还是4发来的命令,以便回复时通过1还是4发送:
void USART1_IRQHandler(void)
{
OSIntEnter(); /* 进入系统临界区 */
//接收中断
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) /* 接收中断 */
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); /* 清除读数据寄存器非空中断标志位 */
g_usartRev = 1;
prvvUARTRxISR();//调用 xMBRTUReceiveFSM
}
//发送中断
if (USART_GetITStatus(USART1, USART_IT_TXE) == SET) /* 发送中断 */
{
USART_ClearITPendingBit(USART1, USART_IT_TXE); /* 清除写数据寄存器完成中断标志位 */
prvvUARTTxReadyISR(); /* 调用 prvvUARTTxReadyISR() */
}
OSIntExit(); /* 退出系统临界区 */
}
void UART4_IRQHandler(void)
{
OSIntEnter(); /* 进入系统临界区 */
//接收中断
if (USART_GetITStatus(UART4, USART_IT_RXNE) == SET) /* 接收中断 */
{
USART_ClearITPendingBit(UART4, USART_IT_RXNE); /* 清除读数据寄存器非空中断标志位 */
g_usartRev = 4;
prvvUARTRxISR();//调用 xMBRTUReceiveFSM
}
//发送中断
if (USART_GetITStatus(UART4, USART_IT_TXE) == SET) /* 发送中断 */
{
USART_ClearITPendingBit(UART4, USART_IT_TXE); /* 清除写数据寄存器完成中断标志位 */
prvvUARTTxReadyISR(); /* 调用 prvvUARTTxReadyISR() */
}
OSIntExit(); /* 退出系统临界区 */
}
|
|