摘要:當單片機要接收數(shù)據(jù)的時候,控制為低電平,數(shù)據(jù)通過接收回來。檢測通過萬用表測量控制的引腳一直處于高電平,即使函數(shù)就多帶帶寫將該引腳為低電平,測量出來還是高電平。
問題現(xiàn)象:在進行RS485操作時,發(fā)現(xiàn)接收時而進時而不進中斷:
將485的AB輸出腳直接與串口的TX,RX對接發(fā)現(xiàn)串口定時發(fā)數(shù)據(jù)能進入中斷,但是有點不受控制,
接著測量MAX485各個引腳的腳,發(fā)現(xiàn)MAX485的RE/DE引腳一直處于高電平
根據(jù)RS485工作原理:
普通的485電路,除了“用RXD連接485芯片的RO引腳、用TXD連接485芯片的DI引腳”,還會用一個單片機的普通IO引腳連接到RE、DE引腳上,來進行RS485收發(fā)控制。
?檢測:
通過萬用表測量控制RE / DE的引腳一直處于高電平,即使main函數(shù)就多帶帶寫將該IO引腳為低電平,測量出來還是高電平。
?
? ? ? ?根據(jù)手冊查找,了解到?I/O口不能正常輸出一般都是端口被復用了造成的,除了檢查程序中是否有把端口復用的程序外,還應注意:有些端口在單片機上電時默認就是復用的,如與JTAG相關(guān)的PA13,PA14,PA15,PB3,PB4引腳,禁用JTAG或SWD可以釋放其中的一些引腳,見表格:
?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);//重映射需要先使能AFIO時鐘GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只關(guān)閉JTAG而保留SWD
?RS485控制收發(fā)的引腳正是 ——A15
修改初始化函數(shù):?
void RS485_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* config USART clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RS485_USART_CLK, ENABLE); //處理復位問題 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); /* TX GPIO */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOC, &GPIO_InitStructure); /*RX */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); /* 485收發(fā)控制引腳 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);/* USART */ USART_InitStructure.USART_BaudRate = RS485_USART_BAUDRATE; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(RS485_USART, &USART_InitStructure);#ifdef EN_UART4_RX //接收使能/*NVIC*/ NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(RS485_USART, USART_IT_IDLE, ENABLE);#endif USART_Cmd(RS485_USART, ENABLE); _uart4_dma_configuration(); USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE); USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE); USART_GetITStatus(UART4, USART_FLAG_TC); RS485_TX_EN =0; // 設置485 mode控制: 0 :RX,1:TX}
萬用表測量引腳可以引腳變低電平了,測試成功!!
?
參考:STM32 I/O口不能正常輸出高低電平問題的解決方案_奇葩猴的博客-CSDN博客
?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/121076.html
摘要:為了可靠工作,在總線狀態(tài)切換時需要做適當延時,再進行數(shù)據(jù)收發(fā)。 一、實現(xiàn)效果 ????????基于ucosii實時操作系統(tǒng)的RS485通信,采用USART + DMA進行收發(fā), ?二、開發(fā)環(huán)境 開發(fā)工具:KEIL V5開發(fā)板: STM32f107RC采用方式:USART + DMA使用系統(tǒng):...
摘要:異步通信與同步通信異步通信異步通信是指通信的發(fā)送與接收設備使用各自的時鐘控制數(shù)據(jù)的發(fā)送和接收過程。同步通信同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。配置串口設置為異步通信基礎參數(shù)波特率為。 ...
摘要:如圖所示在了解起始條件和停止條件后,我們再來看看在這個過程中數(shù)據(jù)的傳輸是如何進行的。四參考資料通過接口實現(xiàn)溫濕度的采集硬件和軟件區(qū)別 stm32通過I2C接口實現(xiàn)...
摘要:在板卡設計中,共模電感也是起濾波的作用,用于抑制高速信號線產(chǎn)生的電磁波向外輻射發(fā)射。 RS485電路設計 一:簡介二:原理圖設計三:電路EMC設計四: PCB設計...
摘要:壓擺率就是電平跳變所需要的時間,比如從到需要多少時間,時間越小波形就越陡,說明壓擺率越高反之,時間越多波形就越緩,壓擺率就越低。 文章目錄 Linux驅(qū)動開發(fā):匯...
閱讀 3554·2023-04-25 15:52
閱讀 607·2021-11-19 09:40
閱讀 2678·2021-09-26 09:47
閱讀 1054·2021-09-22 15:17
閱讀 3586·2021-08-13 13:25
閱讀 2295·2019-08-30 15:56
閱讀 3517·2019-08-30 13:56
閱讀 2134·2019-08-30 11:27