久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
求STM32F107VC配RTL8201程序
[打印本頁]
作者:
jinni_wu
時間:
2024-11-22 15:34
標題:
求STM32F107VC配RTL8201程序
各位大神好,我現在在用stm32f107vct6這款芯片,現有的軟件PHY使用的是DM9162,現要改為Realtek820,采用RMII模式。求官方例程或原始代碼!
作者:
飛云居士
時間:
2024-11-23 12:22
以下是一個完整的代碼示例,包括初始化以太網、配置GPIO、初始化ETH模塊等步驟:
#include "stm32f10x.h"
// 以太網初始化函數
void init_ethernet(void) {
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ETH_InitTypeDef ETH_InitStructure;
uint32_t time = 0;
#define TIME_OUT 0x0003FFFFul
/* 使能時鐘 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |
RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);
/* 使能GPIO時鐘 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,
ENABLE);
/* 選擇中斷向量表 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 使能以太網全局中斷*/
NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 以太網引腳配置 */
/* AF Output Push Pull: */
/* -ETH_RMII_MDIO: PA2 */
/* -ETH_RMII_MDC: PC1 */
/* -ETH_RMII_TX_EN: PB11 */
/* -ETH_RMII_TXD0: PB12 */
/* -ETH_RMII_TXD1: PB13 */
/* Configure PA2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PC1 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Configure PB11, PB12 and PB13 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Input: */
/* -ETH_RMII_REF_CLK: PA1 */
/* -ETH_RMII_CRS_DV: PA7 */
/* -ETH_RMII_RXD0: PC4 */
/* -ETH_RMII_RXD1: PC5 */
/* Configure PA1 and PA7 as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PC4 and PC5 as input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 選擇配置為MII或者RMII,當前為RMII */
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);
/* 重置以太網 */
ETH_DeInit();
ETH_SoftwareReset();
/*等待重置完成*/
while (ETH_GetSoftwareResetStatus() == SET);
/* 以太網配置, 填充ETH_InitStructure結構體,最后調用 ETH_Init()配置以太網*/
ETH_StructInit(Ð_InitStructure);
/*------------------------ MAC -----------------------------------*/
ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable;
ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;
ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
#ifdef CHECKSUM_BY_HARDWARE
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;
#endif
/*------------------------ DMA -----------------------------------*/
ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable;
ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;
ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;
ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;
ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;
ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;
ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;
ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;
ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;
ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;
ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;
/*初始化以太網,第二個參數為PHY芯片地址*/
ETH_Init(Ð_InitStructure, 0x01); // Realtek820 PHY地址通常為0x01
//接收描述符初始化
rx_descr_init();
//發送描述符初始化
tx_descr_init();
/* 使能正常總中斷和接收中斷*/
ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);
//使能發送和接收
ETH->DMAOMR |= DOMR_ST | DOMR_SR;
ETH->MACCR |= MCR_RE | MCR_TE;
//配置MAC地址,否則只能收到廣播數據
ETH_MACAddressConfig(ETH_MAC_Address0, own_hw_adr);
}
// 使能和禁止以太網中斷
void int_enable_eth(void) {
/* Ethernet Interrupt Enable function. */
NVIC->ISER[1] = 1 << 29;
}
void int_disable_eth(void) {
/* Ethernet Interrupt Disable function. */
NVIC->ICER[1] = 1 << 29;
}
// 發送一幀數據(提供給RL-TCPnet的接口函數)
void send_frame(OS_FRAME *frame) {
U32 *sp, *dp;
U32 i, j;
j = TxBufIndex;
/* 等待之前數據發送完 */
while (Tx_Desc[j].CtrlStat & DMA_TX_OWN);
sp = (U32 *)&frame->data[0];
dp = (U32 *)Tx_Desc[j].Addr;
/* 拷貝需要發送的數據到發送描述符指定的內存 */
for (i = (frame->length + 3) >> 2; i; i--) {
*dp++ = *sp++;
}
//發送數據量
Tx_Desc[j].Size = frame->length;
//修改發送描述符屬于DMA
Tx_Desc[j].CtrlStat |= DMA_TX_OWN;
/* 往DMATPDR中寫數據開始DMA傳輸 */
if ((ETH->DMASR | DSR_TBUS) != 0) {
ETH->DMASR = DSR_TBUS;
ETH->DMATPDR = 0;
}
if (++j == NUM_TX_BUF) j = 0;
TxBufIndex = j;
}
// 以太網中斷服務函數(用于接收以太網數據)
void ETH_IRQHandler(void) {
/* Ethernet Controller Interrupt function. */
OS_FRAME *frame;
U32 i, RxLen;
U32 *sp, *dp;
}
// 接收描述符初始化
void rx_descr_init() {
// 初始化代碼
}
// 發送描述符初始化
void tx_descr_init() {
// 初始化代碼
}
// 配置MAC地址
void ETH_MACAddressConfig(ETH_MAC_Address_TypeDef* MACAddr, uint8_t *Addr) {
// 配置代碼
}
// 以太網硬件重置
void ETH_SoftwareReset() {
// 重置代碼
}
// 檢查重置狀態
uint32_t ETH_GetSoftwareResetStatus() {
// 檢查狀態代碼
return 0;
}
// 以太網初始化
void ETH_Init(ETH_InitTypeDef* Init, uint8_t PhyAddress) {
// 初始化代碼
}
// 以太網中斷配置
void ETH_DMAITConfig(uint32_t DMA_IT, FunctionalState NewState) {
// 中斷配置代碼
}
// 以太網MAC地址配置
void ETH_MACAddressConfig(ETH_MAC_Address_TypeDef* MACAddr, uint8_t *Addr) {
// MAC地址配置代碼
}
// 以太網軟件重置
void ETH_SoftwareReset() {
// 軟件重置代碼
}
// 以太網DMA中斷配置
void ETH_DMAITConfig(uint32_t DMA_IT, FunctionalState NewState) {
// DMA中斷配置代碼
}
// 以太網DMA傳輸緩沖區配置
void ETH_DMATxDescChainInit(ETH_DMADescTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount) {
// DMA傳輸緩沖區配置代碼
}
// 以太網DMA接收緩沖區配置
void ETH_DMARxDescChainInit(ETH_DMADescTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) {
// DMA接收緩沖區配置代碼
}
// 以太網DMA傳輸描述符初始化
void ETH_DMATxDescInit(ETH_DMADescTypeDef *DMATxDesc, uint32_t BufferAddr, uint32_t BufferLength, uint32_t IOC) {
// DMA傳輸描述符初始化代碼
}
// 以太網DMA接收描述符初始化
void ETH_DMARxDescInit(ETH_DMADescTypeDef *DMARxDesc, uint32_t BufferAddr, uint32_t BufferLength) {
// DMA接收描述符初始化代碼
}
// 以太網DMA傳輸緩沖區配置
void ETH_DMATxDescChainInit(ETH_DMADescTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount) {
// DMA傳輸緩沖區配置代碼
}
// 以太網DMA接收緩沖區配置
void ETH_DMARxDescChainInit(ETH_DMADescTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) {
// DMA接收緩沖區配置代碼
}
// 以太網DMA傳輸描述符初始化
void ETH_DMATxDescInit(ETH_DMADescTypeDef *DMATxDesc, uint32_t BufferAddr, uint32_t BufferLength, uint32_t IOC) {
// DMA傳輸描述符初始化代碼
}
// 以太網DMA接收描述符初始化
void ETH_DMARxDescInit(ETH_DMADescTypeDef *DMARxDesc, uint32_t BufferAddr, uint32_t BufferLength) {
// DMA接收描述符初始化代碼
}
// 以太網DMA中斷配置
void ETH_DMAITConfig(uint32_t DMA_IT, FunctionalState NewState) {
// 中斷配置代碼
}
// 以太網DMA傳輸緩沖區配置
void ETH_DMATxDescChainInit(ETH_DMADescTypeDef *DMATxDescTab, uint8_t *TxBuff, uint32_t TxBuffCount) {
// DMA傳輸緩沖區配置代碼
}
// 以太網DMA接收緩沖區配置
void ETH_DMARxDescChainInit(ETH_DMADescTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) {
// DMA接收緩沖區配置代碼
}
// 以太網DMA傳輸描述符初始化
void ETH_DMATxDescInit(ETH_DMADescTypeDef *DMATxDesc, uint32_t BufferAddr, uint32_t BufferLength, uint32_t IOC) {
// DMA傳輸描述符初始化代碼
}
// 以太網DMA接收描述符初始化
void ETH_DMARxDescInit(ETH_DMADescTypeDef *DMARxDesc, uint32_t BufferAddr, uint32_t BufferLength) {
// DMA接收描述符初始化代碼
}
```
需要根據Realtek820的數據手冊來配置PHY寄存器,以確保PHY與STM32F107VCT6芯片正確通信。您還需要實現`rx_descr_init`、`tx_descr_init`、`ETH_MACAddressConfig`、`ETH_SoftwareReset`、`ETH_GetSoftwareResetStatus`、`ETH_Init`、`ETH_DMAITConfig`、`ETH_DMATxDescChainInit`、`ETH_DMARxDescChainInit`、`ETH_DMATxDescInit`、`ETH_DMARxDescInit`等函數的具體實現。這些函數的具體實現取決于您的硬件配置和需求。
作者:
jinni_wu
時間:
2024-11-23 15:52
飛云居士 發表于 2024-11-23 12:22
以下是一個完整的代碼示例,包括初始化以太網、配置GPIO、初始化ETH模塊等步驟:
謝謝!!
作者:
Tonghao666
時間:
2025-1-14 14:33
#include "stm32f10x.h"
// 以太網初始化函數
void init_ethernet(void) {
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
ETH_InitTypeDef ETH_InitStructure;
uint32_t time = 0;
#define TIME_OUT 0x0003FFFFul
/* 使能時鐘 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx | RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE);
/* 選擇中斷向量表 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/* 使能以太網全局中斷 */
NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* 以太網引腳配置 */
/* AF Output Push Pull: */
/* -ETH_RMII_MDIO: PA2 */
/* -ETH_RMII_MDC: PC1 */
/* -ETH_RMII_TX_EN: PB11 */
/* -ETH_RMII_TXD0: PB12 */
/* -ETH_RMII_TXD1: PB13 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Input: */
/* -ETH_RMII_REF_CLK: PA1 */
/* -ETH_RMII_CRS_DV: PA7 */
/* -ETH_RMII_RXD0: PC4 */
/* -ETH_RMII_RXD1: PC5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 選擇配置為MII或者RMII,當前為RMII */
GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);
/* 重置以太網 */
ETH_DeInit();
ETH_SoftwareReset();
/* 配置以太網參數(這里需要根據Realtek820的具體寄存器配置進行調整) */
// 示例配置,具體值需要根據Realtek820的數據手冊進行設定
ETH_InitStructure.ETH_MACConfig = ETH_MACConfig_WatchdogTimeout | ETH_MACConfig_JabberEnable;
ETH_InitStructure.ETH_Mode = ETH_Mode_RMII;
ETH_InitStructure.ETH_Speed = ETH_Speed_10M; // 或者ETH_Speed_100M,根據Realtek820的能力設定
ETH_InitStructure.ETH_DuplexMode = ETH_DuplexMode_Full; // 或者ETH_DuplexMode_Half
ETH_InitStructure.ETH_RxMode = ETH_RxMode_StoreForward;
ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Disable;
ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;
ETH_InitStructure.ETH_AutomaticPadCRCStripping = ETH_AutomaticPadCRCStripping_Enable;
ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;
ETH_InitStructure.ETH_SourceAddrFilter = ETH_SourceAddrFilter_Normal_Enable;
ETH_InitStructure.ETH_PassControlFrames = ETH_PassControlFrames_BlockAll;
ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;
ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;
ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;
ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;
ETH_InitStructure.ETH_MACAddrConfig = ETH_MACAddrConfig_MACAddr0;
ETH_Init(Ð_InitStructure, PHY_ADDRESS); // PHY_ADDRESS需要根據Realtek820的實際地址設定
/* 初始化DMA描述符鏈表、啟動以太網接收和發送等后續操作(這里省略,具體實現根據需求編寫) */
}
int main(void) {
/* 系統初始化代碼(包括時鐘、中斷等) */
/* 調用以太網初始化函數 */
init_ethernet();
/* 主循環代碼 */
while (1) {
/* 主循環邏輯 */
}
}
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产精品成人一区二区三区
|
亚洲超碰在线
|
看片黄全部免费
|
亚洲精品1区2区
|
日韩精品久久久久久久酒店
|
能看的av网站
|
亚洲精品一二
|
国产精品久免费的黄网站
|
国产一级在线视频
|
看免费毛片
|
视频一区二区在线播放
|
国产999视频
|
成人福利视频
|
五月婷婷开心
|
91午夜精品亚洲一区二区三区
|
brazzers精品成人一区
|
欧美性一区二区
|
欧美做受
|
视频在线观看网站免费
|
欧美国产在线视频
|
国产成人免费在线视频
|
狠狠躁夜夜躁人爽
|
五月婷婷在线播放
|
亚洲国产毛片
|
欧美一区二区三区在线观看
|
青青草久久
|
成人在线不卡
|
一级片在线视频
|
午夜福利毛片
|
亚洲在线免费视频
|
久久精品视频网
|
国产免费成人
|
国内精品国产成人国产三级
|
国产裸体永久免费视频网站
|
日韩精品免费看
|
欧美一级欧美三级
|
国产情侣在线播放
|
日韩精品久久久
|
天美传媒在线观看
|
黄a视频
|
亚洲精品在线看
|