-
N32G455 RS485中断接收函数进入不了,请问是什么原因呀?
RS485能够发送数据,但是接收数据时一直进不了RS485中断函数,请大佬们指点一下[color=#d4d4d4][backcolor=rgb(30, 30, 30)][font=Consolas, "][size=15.4px][color=#569cd6]void[/color] [color=#dcdcaa]RS485_Init[/color]([color=#569cd6]void[/color]) { [color=#4ec9b0]GPIO_InitType[/color] [color=#9cdcfe]GPIO_InitStruct[/color]; [color=#4ec9b0]USART_InitType[/color] [color=#9cdcfe]USART_InitStruct[/color]; [color=#4ec9b0]NVIC_InitType[/color] [color=#9cdcfe]NVIC_InitStruct[/color]; [color=#6a9955]// 使能时钟(USART2在APB1总线上)[/color] [color=#dcdcaa]RCC_EnableAPB2PeriphClk[/color]([color=#569cd6]RCC_APB2_PERIPH_GPIOA[/color], [color=#4fc1ff]ENABLE[/color]); [color=#dcdcaa]RCC_EnableAPB1PeriphClk[/color]([color=#569cd6]RCC_APB1_PERIPH_USART2[/color], [color=#4fc1ff]ENABLE[/color]); [color=#6a9955]// 配置方向控制引脚PA1[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]RS485_EN_GPIO_PIN[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_Out_PP[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Speed[/color] = [color=#4fc1ff]GPIO_Speed_50MHz[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#dcdcaa]GPIO_ResetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]);[color=#6a9955] // 默认接收模式[/color] [color=#6a9955]// 配置USART2 TX引脚PA2(复用推挽输出)[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]GPIO_PIN_2[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_AF_PP[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]GPIOA[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#6a9955]// 配置USART2 RX引脚PA3(浮空输入)[/color] [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]Pin[/color] = [color=#569cd6]GPIO_PIN_3[/color]; [color=#9cdcfe]GPIO_InitStruct[/color].[color=#9cdcfe]GPIO_Mode[/color] = [color=#4fc1ff]GPIO_Mode_IN_FLOATING[/color]; [color=#dcdcaa]GPIO_InitPeripheral[/color]([color=#569cd6]GPIOA[/color], &[color=#9cdcfe]GPIO_InitStruct[/color]); [color=#6a9955]// USART参数配置[/color] [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]BaudRate[/color] = [color=#b5cea8]9600[/color];[color=#6a9955] // 波特率;[/color] [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]WordLength[/color] = [color=#569cd6]USART_WL_8B[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]StopBits[/color] = [color=#569cd6]USART_STPB_1[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]Parity[/color] = [color=#569cd6]USART_PE_NO[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]HardwareFlowControl[/color] = [color=#569cd6]USART_HFCTRL_NONE[/color]; [color=#9cdcfe]USART_InitStruct[/color].[color=#9cdcfe]Mode[/color] = [color=#569cd6]USART_MODE_RX[/color] | [color=#569cd6]USART_MODE_TX[/color]; [color=#dcdcaa]USART_Init[/color]([color=#569cd6]USART2[/color], &[color=#9cdcfe]USART_InitStruct[/color]); [color=#6a9955]// 使能接收中断[/color] [color=#dcdcaa]USART_ConfigInt[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_RXDNE[/color], [color=#4fc1ff]ENABLE[/color]); [color=#dcdcaa]USART_ConfigInt[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_IDLEF[/color], [color=#4fc1ff]ENABLE[/color]); [color=#6a9955]// 配置NVIC[/color] [color=#dcdcaa]NVIC_PriorityGroupConfig[/color]([color=#569cd6]NVIC_PriorityGroup_2[/color]); [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannel[/color] = [color=#4fc1ff]USART2_IRQn[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelPreemptionPriority[/color] = [color=#b5cea8]1[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelSubPriority[/color] = [color=#b5cea8]1[/color]; [color=#9cdcfe]NVIC_InitStruct[/color].[color=#9cdcfe]NVIC_IRQChannelCmd[/color] = [color=#4fc1ff]ENABLE[/color]; [color=#dcdcaa]NVIC_Init[/color](&[color=#9cdcfe]NVIC_InitStruct[/color]); [color=#6a9955]// 使能USART[/color] [color=#dcdcaa]USART_Enable[/color]([color=#569cd6]USART2[/color], [color=#4fc1ff]ENABLE[/color]); } [color=#6a9955]// 发送函数[/color] [color=#569cd6]void[/color] [color=#dcdcaa]RS485_SendData[/color]([color=#4ec9b0]uint8_t[/color] *[color=#9cdcfe]pData[/color], [color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]len[/color]) { [color=#6a9955]// 设置为发送模式[/color] [color=#dcdcaa]GPIO_SetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]); [color=#6a9955]// 阻塞式发送数据[/color] [color=#c586c0]for[/color] ([color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]i[/color] = [color=#b5cea8]0[/color]; [color=#9cdcfe]i[/color] < [color=#9cdcfe]len[/color]; [color=#9cdcfe]i[/color]++) { [color=#6a9955]//[/color] [color=#c586c0]while[/color] ([color=#dcdcaa]USART_GetFlagStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_TXDE[/color]) == [color=#4fc1ff]RESET[/color]) ;[color=#6a9955] // 等待发送完成[/color] [color=#dcdcaa]USART_SendData[/color]([color=#569cd6]USART2[/color], [color=#9cdcfe]pData[/color][[color=#9cdcfe]i[/color]]); } [color=#6a9955]// 确保最后一位发送完成[/color] [color=#c586c0]while[/color] ([color=#dcdcaa]USART_GetFlagStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_TXC[/color]) == [color=#4fc1ff]RESET[/color]) ; [color=#6a9955]// 恢复接收模式[/color] [color=#dcdcaa]GPIO_ResetBits[/color]([color=#569cd6]RS485_EN_GPIO_PORT[/color], [color=#569cd6]RS485_EN_GPIO_PIN[/color]); } [color=#6a9955]// 接收缓冲区和索引[/color] [color=#c586c0]#define[/color][color=#569cd6] [/color][color=#569cd6]RX_BUF_SIZE[/color][color=#569cd6] [/color][color=#b5cea8]128[/color] [color=#569cd6]volatile[/color] [color=#4ec9b0]uint8_t[/color] [color=#9cdcfe]rxBuffer[/color][[color=#569cd6]RX_BUF_SIZE[/color]]; [color=#569cd6]volatile[/color] [color=#4ec9b0]uint16_t[/color] [color=#9cdcfe]rxIndex[/color] = [color=#b5cea8]0[/color]; [color=#569cd6]void[/color] [color=#dcdcaa]RS485_IRQHandler[/color]([color=#569cd6]void[/color]) { [color=#c586c0]if[/color] ([color=#dcdcaa]USART_GetIntStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_RXDNE[/color]) != [color=#4fc1ff]RESET[/color]) { [color=#9cdcfe]rxBuffer[/color][[color=#9cdcfe]rxIndex[/color]++] = [color=#dcdcaa]USART_ReceiveData[/color]([color=#569cd6]USART2[/color]); } [color=#c586c0]if[/color] ([color=#dcdcaa]USART_GetIntStatus[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_FLAG_IDLEF[/color]) != [color=#4fc1ff]RESET[/color]) { [color=#c586c0]if[/color] ([color=#9cdcfe]rxBuffer[/color][[color=#b5cea8]0[/color]] == [color=#b5cea8]0xAA[/color]) { [color=#dcdcaa]printf[/color]([color=#ce9178]"rxBuffer = [/color][color=#9cdcfe]%x[/color][color=#d7ba7d]\r\n[/color][color=#ce9178]"[/color], [color=#9cdcfe]rxBuffer[/color][[color=#b5cea8]0[/color]]); } } [color=#9cdcfe]rxIndex[/color] = [color=#b5cea8]0[/color]; [color=#dcdcaa]USART_ClrIntPendingBit[/color]([color=#569cd6]USART2[/color], [color=#569cd6]USART_INT_IDLEF[/color]);[color=#6a9955]// 清除空闲中断[/color] [color=#6a9955] /*清除空闲中断*/[/color] [color=#569cd6]USART2[/color]->[color=#9cdcfe]STS[/color]; [color=#569cd6]USART2[/color]->[color=#9cdcfe]DAT[/color]; } [/size][/font][/backcolor][/color]
262浏览量 3回复量 关注量 -
RS485 AB波形分析
[i=s] 本帖最后由 kate2005 于 2024-12-26 17:41 编辑 [/i] 在办公室调试时,485主机主板PCB和从机共用市电电源,主机用UART3,与从机通信良好;主机板(不接大地)安装到空调机组上后 (含UART1 UART2都是485信号,分别与其他控制板通信),与从机(从机机壳接大地)共用高低温实验室的供电电源,会通信不良,在从机端口测A/B信号,发现很奇怪的波形。见附图1,波形来不及细抓,只有这个图。 这时如果主机主板PCB的电源换成其他外接电源,其他都不变,主机的UART3和从机通讯又是正常的。没有波形图。只看到现象。 求助大佬帮忙分析波形的无数据时AB为何没有压差了?波形为何如此差? 更换主板PCB电源后通信又正常了,可从哪些方面分析?
6417浏览量 14回复量 关注量 -
RS485 从机收不到数据
[i=s] 本帖最后由 kate2005 于 2024-12-26 15:02 编辑 [/i] 问题描述: RS485主机和从机用电源LN,测试环境是可以控制高低温的实验室,正常情况下,主从机通讯正常,从机用来控制一个电流为10几安的电机运转。 连接方式见附图,附图1是指示图。 低温零下十几度正常运转2天后,发生了通讯故障,现象是从机表现为收不到主机数据,这时从机会主动定时发送一组数据,这是从机的软件策略。 附图2无法通信时的从机端AB线波形,测试波形时并没有运转电机。 如果断开主机和从机的AB两线,5V和地仍然按原来的连接(主机板供电给从机的485电路),AB线用笔记本和USB转RS485模块,发现从机通信正常。当时无示波器无图。 各位大佬帮忙分析一下,为何从机无法收到主机的数据? [url=Desktop\微信图片_20241226140459.jpg][img]Desktop\微信图片_20241226140459.jpg[/img][/url]
6720浏览量 15回复量 关注量 -
工业长距离485通讯的接地问题
按照zlg的推荐485是单端通过1M电阻和2000V耐压电容并联接地,我比较缺乏相关理论知识,想当然的有如下想法:1、若接地处遭受雷击,瞬间的高压是否会打坏高压电容。 2、485收发器的信号地通过屏蔽层相连,使用的是RSM3485ECHT模块,裸机抗共模浪涌2000V,对于2-3km左右的总线,屏蔽层是否悬空比较好。
7498浏览量 8回复量 关注量 -
GD32F103的BOOTLOADER源码在那里可以看到?
GD32F103的BOOTLOADER源码在那里可以看到?如果使用RS485接口,可以实现BOOTLOADER功能么?
8431浏览量 5回复量 关注量