rt-thread 5.2.1 基于at-start-f437開發過程記錄

基于rt-thread 5.2.1 bsp/at/at32f437-start進行開發,記錄詳細過程,包括中間遇到的各種坑。

at32f437-start原理圖

自己設計的電路板主要換了一塊小封裝的同系列芯片, 目標是移植opENer。

1. 開發環境

env長時間不用,有點忘了。這次新下載了個2.0新版本。

軟件包列表更新,現在新加入的包很多,會出現和服務器不同步的情況。本次開發想用的opENer在iot里找不到,就需要更新。

軟件包更新和下載

pkgs --upgrade 命令更新軟件包列表

項目menuconfig選中相應的包后,需要下載。

pkgs --update 命令會自動更新/下載/刪除相關軟件包

2.項目配置

啟動ENV,進入bsp目錄,這兒選擇/bsp/at32/at32f437-start。menuconfig配置,項目硬件有uart,emac,pin,內部falsh,軟件包選了opENer。

從rt-thread 5.2.0起,硬件sdk包和以前版本稍有不同,需要通過on packages/peripheral libraries and drivers/HAL & SDK Drivers/AT32HAL & SDK Drivers中選擇對應的單片機型號。

保存配置,scons --update, 下載軟件包。scons --target==mdk5 生成項目文件。編譯項目,有幾個錯誤,提示找不到 fal_cfg.h文件。

因為選擇了fal,還需定義內部flash分區表,文件fal_cfg.h內容如下:

#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_#include <rtthread.h>
#include <board.h>#include "drv_flash.h"
#include "fal.h"#ifdef __cplusplus
extern "C" {
#endifextern const struct fal_flash_dev at32_onchip_flash;
extern struct fal_flash_dev nor_flash0;/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \&at32_onchip_flash,                                              \
}/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG/* partition table */
#define FAL_PART_TABLE                                                                       \
{                                                                                            \{FAL_PART_MAGIC_WROD,        "app",   "onchip_flash",       0,           1000 * 1024, 0}, \{FAL_PART_MAGIC_WROD,        "param", "onchip_flash",       1000 * 1024,    6 * 1024, 0}, \
}#endif /* FAL_PART_HAS_TABLE_CFG */#ifdef __cplusplus
extern "C" {
#endif#endif /* _FAL_CFG_H_ */

AT32F435RG有1M flash, 把最后boot rom/user option前面的6K作為參數存儲區。

把fal_cfg.h文件存在bsp包中board/inc目錄下。重新編譯,完美通過!

執行?scons --dist?將配置好的項目生成獨立分發版本,只要把dist目錄復制出來就可以獨立開發了。需要注意的是,每次運行scons --dist命令,會把dist目錄里的內容清空,如有修改要做好備份!!!

完整命令為:scons --dist [--target=xxx] [--project-name="xxx"] [--project-path="xxx"]

3.修改硬件配置

由于項目用到了emac和uart1,uart3,管腳配置和at32f437-start的配置不一樣,有幾個地方還需要修改。

emac 采用RMII,節省資源。用到的引腳有PA1、PA2、PA7、PC1、PC4、PC5、PB11、PB12、PB13。phy芯片yt8512復位腳為PB1。

uart1使用PA9、PA10,uart3使用PC10、PC11。

除yt8512復位腳外,其它都在at32_msp.c文件中。

at32_msp.c中的修改部分。

#ifdef BSP_USING_UART3if(usart_x == USART3){crm_periph_clock_enable(CRM_USART3_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);gpio_init_struct.gpio_mode = GPIO_MODE_MUX;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init_struct.gpio_pins = GPIO_PINS_10 | GPIO_PINS_11;gpio_init(GPIOC, &gpio_init_struct);gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE10, GPIO_MUX_7);gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE11, GPIO_MUX_7);}
#endif#ifdef BSP_USING_EMAC
void at32_msp_emac_init(void *instance)
{gpio_init_type gpio_init_struct;crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE);crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);//lggpio_default_para_init(&gpio_init_struct);gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init_struct.gpio_mode = GPIO_MODE_MUX;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init_struct.gpio_pins = GPIO_PINS_1 | GPIO_PINS_2;gpio_init(GPIOA, &gpio_init_struct);gpio_init_struct.gpio_pins = GPIO_PINS_1;gpio_init(GPIOC, &gpio_init_struct);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_11);gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE4, GPIO_MUX_11);gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE5, GPIO_MUX_11);gpio_init_struct.gpio_pins = GPIO_PINS_7;gpio_init(GPIOA, &gpio_init_struct);gpio_init_struct.gpio_pins = GPIO_PINS_4 | GPIO_PINS_5;gpio_init(GPIOC, &gpio_init_struct);gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_12 | GPIO_PINS_13;//lggpio_init(GPIOB, &gpio_init_struct);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE1, GPIO_MUX_11);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_11);gpio_pin_mux_config(GPIOC, GPIO_PINS_SOURCE1, GPIO_MUX_11);gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE11, GPIO_MUX_11);//lggpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE12, GPIO_MUX_11);gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE13, GPIO_MUX_11);
}
#endif /* BSP_USING_EMAC */

phy芯片復位卻PB1,需要在drv_emac.c中phy_reset()函數中修改:

static void phy_reset(void)
{gpio_init_type gpio_init_struct;#if defined (SOC_SERIES_AT32F437) || defined (SOC_SERIES_AT32F457)crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);gpio_default_para_init(&gpio_init_struct);gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init_struct.gpio_pins = GPIO_PINS_1;gpio_init(GPIOB, &gpio_init_struct);gpio_bits_reset(GPIOB, GPIO_PINS_1);rt_thread_mdelay(2);gpio_bits_set(GPIOB, GPIO_PINS_1);
#endif
#if defined (SOC_SERIES_AT32F407)crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);gpio_default_para_init(&gpio_init_struct);gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE;gpio_init_struct.gpio_pins = GPIO_PINS_8;gpio_init(GPIOC, &gpio_init_struct);gpio_bits_reset(GPIOC, GPIO_PINS_8);rt_thread_mdelay(2);gpio_bits_set(GPIOC, GPIO_PINS_8);
#endifrt_thread_mdelay(2000);
}

最后還要在項目屬性頁(Device和C/C++)中把單片機型號改成AT32F437RG.

4. 遇到的問題

程序跑起來后,發現網絡有問題。phy_linkchange函數沒被調用,導致網絡不能用。經分析,是phy_monitor_thread_entry函數中的rt_thread_mdelay()導致線程掛起后,時間到了也沒被喚醒,后續代碼就沒有執行到。

static void phy_monitor_thread_entry(void *parameter)
{uint8_t detected_count = 0;while(phy_addr == 0xFF){/* phy search */rt_uint32_t i, temp;for (i = 0; i <= 0x1F; i++){emac_phy_register_read(i, PHY_BASIC_STATUS_REG, (uint16_t *)&temp);if (temp != 0xFFFF && temp != 0x00){phy_addr = i;break;}}detected_count++;//rt_thread_mdelay(1000);if (detected_count > 10){LOG_E("No PHY device was detected, please check hardware!");}}LOG_D("Found a phy, address:0x%02X", phy_addr);/* reset phy */LOG_D("RESET PHY!");emac_phy_register_write(phy_addr, PHY_BASIC_CONTROL_REG, PHY_RESET_MASK);//rt_thread_mdelay(2000);emac_phy_register_write(phy_addr, PHY_BASIC_CONTROL_REG, PHY_AUTO_NEGOTIATION_MASK);phy_linkchange();
#ifdef PHY_USING_INTERRUPT_MODE/* configuration intterrupt pin */rt_pin_mode(PHY_INT_PIN, PIN_MODE_INPUT_PULLUP);rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, emac_phy_isr, (void *)"callbackargs");rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE);/* enable phy interrupt */emac_phy_register_write(phy_addr, PHY_INTERRUPT_MASK_REG, PHY_INT_MASK);
#if defined(PHY_INTERRUPT_CTRL_REG)emac_phy_register_write(phy_addr, PHY_INTERRUPT_CTRL_REG, PHY_INTERRUPT_EN);
#endif
#else /* PHY_USING_INTERRUPT_MODE */at32_emac_device.poll_link_timer = rt_timer_create("phylnk", (void (*)(void*))phy_linkchange,NULL, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC);if (!at32_emac_device.poll_link_timer || rt_timer_start(at32_emac_device.poll_link_timer) != RT_EOK){LOG_E("Start link change detection timer failed");}
#endif /* PHY_USING_INTERRUPT_MODE */
}

把兩個rt_thread_mdelay調用注釋掉,正常。延時估計是為兼容不同的Phy芯片,對于YT8512不延時沒有問題。

至于為什么delay會讓線程沒法喚醒,還沒有仔細分析!!!可能細節還在其它地方。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90659.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EMCCD相機與電可調變焦透鏡的同步控制系統設計與實現

EMCCD相機與電可調變焦透鏡的同步控制系統設計與實現 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家&#xff0c;覺得好請收藏。點擊跳轉到網站。 摘要 本文詳細介紹了基于Python的EMCCD相機&#xff0…

前綴和-560.和為k的子數組-力扣(LeetCode)

一、題目解析1.子數組是數組中元素的連續非空序列2.nums[i]范圍為[-1000,1000]&#xff0c;存在負數3.由于2的題目條件&#xff0c;該題不能用雙指針算法&#xff0c;不具備單調性 二、算法原理解法1&#xff1a;暴力解法->枚舉 O(N^2)固定一個值&#xff0c;向后枚舉數組和…

解決企業微信收集表沒有圖片、文件組件,不能收集圖片的問題

問題&#xff1a; 企業微信里面的收集表功能&#xff0c;有一個圖片收集的收集表&#xff0c;但是插入的組件沒有收集圖片的組件&#xff1f; 原因&#xff1a; 大概率是微盤未啟用 解決方法&#xff1a; 1、登陸企業微信管理后臺 企業微信 2、訪問微盤頁面&#xff0c;…

認識單片機

《認識單片機》課程內容 一、課程導入 在我們的日常生活中&#xff0c;有很多看似普通卻充滿智慧的小物件。比如家里的智能電飯煲&#xff0c;它能精準地控制煮飯的時間和溫度&#xff0c;讓米飯煮得香噴噴的&#xff1b;還有樓道里的聲控燈&#xff0c;當有人走過發出聲音時&a…

數據結構(2)順序表算法題

一、移除元素1、題目描述2、算法分析 思路1&#xff1a;查找val值對應的下標pos&#xff0c;執行刪除pos位置數據的操作。該方法時間復雜度為O&#xff08;n^2&#xff09;&#xff0c;因此不建議使用。思路2&#xff1a;創建新數組&#xff08;空間大小與原數組一致&#xff0…

汽車電子架構

本文試圖從Analog Devices官網中的汽車解決方案視角帶讀者構建起汽車電子的總體架構圖&#xff0c;為國內熱愛和從事汽車電子行業的伙伴們貢獻一份力量。 一 、汽車電子架構總覽 整個汽車電子包括四個部分&#xff1a;車身電子&#xff08;Body Electronics&#xff09;、座艙與…

pycharm 2025 專業版下載安裝教程【附安裝包】

安裝之前&#xff0c;請確保已經關閉所有安全軟件&#xff08;如殺毒軟件、防火墻等&#xff09;安裝包 &#x1f447;鏈接&#xff1a;https://pan.xunlei.com/s/VOU-5_L1KOH5j3zDaaCh-Z28A1# 提取碼&#xff1a;6bjy下載 PyCharm2025專業版 安裝包 并 進行解壓運行 pycharm-2…

在 Java 世界里讓對象“旅行”:序列化與反序列化

Java 生態里關于 JSON 的序列化與反序列化&#xff08;以下簡稱“序列化”&#xff09;是一個久經考驗的話題&#xff0c;卻常因框架繁多、配置瑣碎而讓初學者望而卻步。本文將圍繞一段極簡的 JsonUtils 工具類展開&#xff0c;以 FastJSON 與 Jackson 兩大主流實現為例&#x…

High Speed SelectIO Wizard ip使用記錄

本次實驗的目的是通過VU9P開發板的6個TG接口&#xff0c;采用固定連接的方式&#xff0c;即X和X-維度互聯&#xff0c;其框圖如下所示&#xff1a;IP參數配置通過調用High Speed SelectIO Wizard來實現數據通路&#xff0c;High Speed SelectIO Wizard ip有24對數據通道&#x…

Execel文檔批量替換標簽實現方案

問題背景需求&#xff1a;俺現網班級作為維度&#xff0c;批量導出每個班級學員的數據&#xff0c;excel的個數在1k左右&#xff0c;每一張表的人數在90左右。導出總耗時在10小時左右。代碼編寫完成并導出現網數據后&#xff0c;發現導出的標題錯了。解決方案1.通過修改代碼&am…

SpringBoot配置多數據源多數據庫

Springboot支持配置多數據源。默認情況&#xff0c;在yml文件中只會配置一個數據庫。如果涉及到操作多個數據庫的情況&#xff0c;在同實例中&#xff08;即同一個ip地址下的不同數據庫&#xff09;&#xff0c;可以采用數據庫名點數據庫表的方式&#xff0c;實現跨庫表的操作。…

Rocky9.4部署Zabbix7

一、配置安裝源 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-release-7.0-5.el9.noarch.rpm ? yum clean all 二、安裝Zabbix server&#xff0c;Web前端&#xff0c;agent yum install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf z…

【Java】對象類型轉換(ClassCastException)異常:從底層原理到架構級防御,老司機的實戰經驗

在開發中&#xff0c;ClassCastException&#xff08;類轉換異常&#xff09;就像一顆隱藏的定時炸彈&#xff0c;常常在代碼運行到類型轉換邏輯時突然爆發。線上排查問題時&#xff0c;這類異常往往因為類型關系復雜而難以定位。多數開發者習慣于在轉換前加個instanceof判斷就…

探路者:用 AI 面試加速人才集結,為戶外愛好者帶來更專業的服務

作為深耕戶外用品領域的知名品牌&#xff0c;探路者已構建起覆蓋全國的銷售服務網絡&#xff0c;上千品種的產品矩陣更是為品牌在市場中站穩腳跟提供了有力支撐。對探路者來說&#xff0c;要持續為戶外愛好者帶來專業且貼心的體驗&#xff0c;專業人才是核心支撐。然而&#xf…

LeetCode——面試題 05.01 插入

通過萬歲&#xff01;&#xff01;&#xff01; 題目&#xff1a;一共會給四個數&#xff0c;分別是N、M、i、j&#xff0c;然后希望我們把N和M抓怒換為2進制以后&#xff0c;將M的二進制放在i到j之間的區域&#xff0c;如果M的二進制長度小于i-j1&#xff0c;則前面補0即可。最…

前端設計中如何在鼠標懸浮時同步修改塊內樣式

雖然只是一個小問題&#xff0c;但這個解決問題的過程也深化了自己對盒子模型的理解問題緣起正在寫一個登錄注冊的小窗口&#xff0c;想要在鼠標懸浮階段讓按鈕和文字都變色&#xff0c;但是發現實操的時候按鈕和文字沒辦法同時變色鼠標懸停前鼠標懸停后問題分析仔細分析了下該…

航空發動機高速旋轉件的非接觸式信號傳輸系統

航空發動機是飛機動力系統的核心&#xff0c;各種關鍵部件如渦輪、壓氣機等&#xff0c;經常處于極端高溫、高速旋轉的工作環境中。航空發動機內的傳感器數據&#xff0c;如何能夠穩定可靠的通過無線的方式傳輸到檢測太&#xff0c;一直是業內的一個難點和痛點。在這個領域&…

【postgresql按照逗號分割字段,并統計數量和求和】

postgresql按照逗號分割字段&#xff0c;并統計數量和求和postgresql按照逗號分割字段&#xff0c;并統計數量和求和postgresql按照逗號分割字段&#xff0c;并統計數量和求和 SELECT ucd, p ,tm, step, unitcd, tm_end from resource_calc_scene_rain_bound_value_plus whe…

「iOS」————繼承鏈與對象的結構

iOS學習前言對象的底層結構isa的類型isa_tobjc_class & objc_object類信息的靜態與動態存儲&#xff08;ro、rw、rwe機制&#xff09;cachebits繼承鏈isKindOfClass和isMemberOfClassisKindOfClass:isMemberofClass前言 對 對象底層結構的相關信息有點遺忘&#xff0c;簡略…

代碼隨想錄day46dp13

647. 回文子串 題目鏈接 文章講解 回溯法 class Solution { public:int count 0;// 檢查字符串是否是回文bool isPalindrome(string& s, int start, int end) {while (start < end) {if (s[start] ! s[end]) return false;start;end--;}return true;}// 回溯法&#…