stm32eth通信
1. stm32和光敏感測器通信方式
用的是四針腳光敏感測器
不同型號的STM32 ADC通道的選擇也不一樣
我使用的是STM32F103RCT6單片機 選擇了ADC2 通道6 對應的是PA6引腳。
希望對大家有幫助
它具有四個引腳,VCC可以連接STM32板的3.3V或者5.0V電壓介面。GND可以連接STM32單片機的GND。DO口是開關輸出,可以輸出1和0,代表高低電平。AO口是模擬量輸出,可以利用STM32的ADC來讀取他的電壓,從而得出需要的數據。
今天只是簡單的認識和使用光敏電阻模塊,所以只使用DO介面,AO介面可以不用連接,過幾天我會發布AO介面的使用方法。
按照接線VCC連接單片機3.3V,GND連接單片機的GND,DO介面連接單片機的PA6介面。接法如圖(考慮有很多剛入門的兄弟,所以盡量的簡單和詳細):
連線就是這么簡單,光敏電阻自帶LED燈,連接好線時,當光線暗的時候,背面只會亮一個燈,當光線足夠亮時,背面的兩個燈都會亮起來。通過對光線亮暗的控制可以控制DO輸出高低電平。可以通過庫函數GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);來讀取此時DO輸出的狀態。為了更好的展示實驗結果,當光線暗時,LED0不亮燈,光線足夠時LED0亮。
實現通過光線亮暗來控制LED0亮滅的代碼為:
u8 value;
value=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
if(value == 0)
GPIO_ResetBits(GPIOA,GPIO_Pin_8); //¹âÏß°µµÆÃð
else
GPIO_SetBits(GPIOA,GPIO_Pin_8); //¹âÏßÁÁµÆÁÁ
初始化PA6為輸入狀態:
#ifndef __RED_H
#define __RED_H
#include "sys.h"
#define PA6 PAout(6)
void RED_Init(void);
#endif
#include "red.h"
void RED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
還要記得調用正點原子自帶的led.h文件里的led_Init()函數,不然LED0是不會亮的,它裡麵包含了PA8引腳的初始化,單片機內部默認PA8是控制LED0的。
2. STM32怎麼編寫一個串口通信協議
STM32串口通信協議編寫是要與與之相配的通信設備一起考慮如何編寫,外設有協議,按照外設協議規約編寫。如果只是一對一且通信距離很短,不需要特規范的協議。協議是為了保證通信可靠性和多機通信人為設定的一套發送和應答格式。具體怎麼訂這個協議要根據應用環境來判斷。但通信協議和指令規約對通信起事半功倍的作用。
具體的協議:報頭1 報頭2 命令 內容1 內容2 校驗和 0xaa 0x55 0x01 0x00 0x00 類似這樣的協議格式。
3. 如何使用STM32CubeMX配置ETH
具體配置過程:
1、打開STM32CubeMX,並選擇好相應的晶元。文中的晶元為STM32F207VCT6,選擇後如下圖:
2、配置RCC時鍾、ETH、PA8以及使能LWIP;
由於此處我們的開發板硬體上為RMII方式,因此選擇ETH-RMII,若有同志的開發板為MII方式,請參考MII的配置方法,此處只針對RMII;
RCC選擇外部時鍾源,另外勾選MCO1,軟體會自動將PA8配置為MCO1模式,該引腳對於RMII方式很重要,用於為PHY晶元提供50MHz時鍾;
使能LWIP;
3、時鍾樹的相關配置,必須保證MCO1輸出為50Mhz,如果這個頻率不對會導致PHY晶元無法工作;
我這里因為晶元為207VCT6,為了使MCO1輸出為50Mhz,做了PLL倍頻參數的一些調整,總體如下:(同志們配置時可根據自己的晶元靈活配置,但需保證MCO1的輸出為50Mhz)
4、ETH、LWIP、RCC相關參數設置;
至此,比較重要的都在前面了,但是還有一點仍需要注意,即PA8引腳輸出速度,幾次不成功都是因為這個引腳沒注意。
後續的參數設置可以根據同志們自己的需求分別設置,這里給出我的設置供參考;
ETH參數保持默認,但中斷勾選一下;
LWIP參數設置如下:(因為我這里是配置UDP伺服器,IP選擇靜態分配)
5、生成工程,做最後的函數修改;
給生成的工程添加UDP伺服器的初始化以及埠綁定等相關函數;
我這里直接將之前的官方常式中的UDP伺服器文件加進來,如下:
之後將.c文件添加到用戶程序,主函數添加Udp的.h頭文件;如下:(udp文件的具體內容在後面給出)
6、主函數還需要添加一下幾個函數,在這里不對函數作用及實現原理講解,僅做添加說明。
附:udp_echoserver相關文件內容(該文件為官方的示常式序,版權歸官方,此處做轉載)
udp_echoserver.c的內容如下:
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "lwip/pbuf.h"
#include "lwip/udp.h"
#include "lwip/tcp.h"
#include <string.h>
#include <stdio.h>
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define UDP_SERVER_PORT 7 /* define the UDP local connection port */
#define UDP_CLIENT_PORT 7 /* define the UDP remote connection port */
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Initialize the server application.
* @param None
* @retval None
*/
void udp_echoserver_init(void)
{
struct udp_pcb *upcb;
err_t err;
/* Create a new UDP control block */
upcb = udp_new();
if (upcb)
{
/* Bind the upcb to the UDP_PORT port */
/* Using IP_ADDR_ANY allow the upcb to be used by any local interface */
err = udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);
if(err == ERR_OK)
{
/* Set a receive callback for the upcb */
udp_recv(upcb, udp_echoserver_receive_callback, NULL);
}
}
}
/**
* @brief This function is called when an UDP datagrm has been received on the port UDP_PORT.
* @param arg user supplied argument (udp_pcb.recv_arg)
* @param pcb the udp_pcb which received data
* @param p the packet buffer that was received
* @param addr the remote IP address from which the packet was received
* @param port the remote port from which the packet was received
* @retval None
*/
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
/* Connect to the remote client */
udp_connect(upcb, addr, UDP_CLIENT_PORT);
/* Tell the client that we have accepted it */
udp_send(upcb, p);
/* free the UDP connection, so we can accept new clients */
udp_disconnect(upcb);
/* Free the p buffer */
pbuf_free(p);
}
udp_echoserver.h的內容如下:
#ifndef __ECHO_H__
#define __ECHO_H__
void udp_echoserver_init(void);
#endif /* __MINIMAL_ECHO_H */
7、至此,所有的工作完成,編譯工程,下載至開發板。由於udp_echoserver中綁定的埠號為7,這里我們通過測試工具測試網路的功能,
4. STM32與軟體通過乙太網通信的問題
都可以用 ,只要STM32移植好TCP/IP協議棧就行。UDP操作簡單, 可靠性要求高的話用TCP。
5. stm32與stm32之間可以通過乙太網連接嗎
stm32之間的互相連接,要看你是用在什麼場合。
如果是實驗室,直接用串口是最簡單的方式。
如果是遠程需要聯網的話,使用乙太網或者wifi,通過網路的方式進行數據通信也可以。
如果是小型場合,還可以使用485、CAN等方式相互連接。
6. stm32和光敏感測器通信方式
方式有全雙工和單工。
1、全雙工:在同一時刻,兩個設備之間可以同時收發數據。
2、半雙工:兩個設備之間可以收發數據,但不能在同一時刻進行還。
3、單工:在任何時候都只能進行同一個方向的通信,即一個固定位發送設備,另一固定位接收設備。
STM32系列專為要求高性能、低成本、低功耗的嵌入式應用設計的ARMCortex?-M0,M0+,M3,M4和M7內核。
7. 兩塊STM32F429實現實時快速通信,用什麼方式
一般採用串口(uart)通信,買個USB轉TTL的模塊,連接起來使用串口調試助手就能通訊了。當然,你手裡要是有對應的模塊,正確模塊後也可以連上後也可以通過RS232/RS248(使用串口助手),網口(使用網口調試助手),USB(使用USB調試工具)等等。一般開發板上會集成有串口RS232通訊口,你也可以使用USB轉232模塊進行通訊。
8. 關於stm32與伺服器通信的問題
你是想用web遠程監控單片機的運行,但是不知道怎麼把單片機的信息上傳到伺服器,轉化成web頁面展示出來,我做過一個是通過阿里雲IOT實現的
單片機內加入MQTT協議,與阿里雲伺服器通信,可以通過IOT studio快速配置生成web
官方給到歷程是都是通過ESP的WiFi來聯網。我做的是通過W5500聯網的
把C語言Link Kit SDK移植到stm32單片機中,web由IOT studio生成。
9. 如何讓兩塊stm32進行串口通信
1)TX接RX,RX接TX
2)時鍾配置、GPIO配置、USART初始化、中斷優先順序初始化、使能中斷
3)寫發送函數、接收函數
10. STM32 網路Ethernet)介面中ETH_PPS_OUT管腳的作用是什麼
STM32神舟IV號是RMII的,你可以找一下他的原理圖,網卡晶元是DM9161AE