Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
雅特力AT32
BSP
国产MCU移植
【国产MCU移植】AT32 BSP 完善
发布于 2021-08-25 10:52:48 浏览:3452
订阅该版
[tocm] 近期完善了一下AT32 bsp 主要有 1,修复了使用`scons -- dist`生成工程后无法使用menuconfig问题 2,开启RT_USING_SDIO时同时开启`RT_USING_DFS`解决报错 3,工程默认使用板载ATLINK 4,RTC升级至2.0(之前rtc驱动已编译不过,升级后测试正常使用) 问题1很简单,AT32自己写了sdk_dist.py ```c # BSP dist function def dist_do_building(BSP_ROOT, dist_dir): from mkdist import bsp_copy_files import rtconfig print("=> copy at32 bsp library") library_dir = os.path.join(dist_dir, 'Libraries') library_path = os.path.join(os.path.dirname(BSP_ROOT), 'Libraries') bsp_copy_files(os.path.join(library_path, rtconfig.BSP_LIBRARY_TYPE), os.path.join(library_dir, rtconfig.BSP_LIBRARY_TYPE)) print("=> copy bsp drivers") bsp_copy_files(os.path.join(library_path, 'rt_drivers'), os.path.join(library_dir, 'rt_drivers')) shutil.copyfile(os.path.join(library_path, 'Kconfig'), os.path.join(library_dir, 'Kconfig')) ``` 但是复制library之后并没有更改Kconfig中Libraries/Kconfig目录, 导致使用scons -- dist之后Libraries/Kconfig找不到,解决办法就是在后面加上 ```c # change RTT_ROOT in Kconfig if not os.path.isfile(os.path.join(dist_dir, 'Kconfig')): return with open(os.path.join(dist_dir, 'Kconfig'), 'r') as f: data = f.readlines() with open(os.path.join(dist_dir, 'Kconfig'), 'w') as f: found = 0 for line in data: if line.find('RTT_ROOT') != -1: found = 1 if line.find('../Libraries') != -1 and found: position = line.find('../Libraries') line = line[0:position] + 'Libraries/Kconfig"\n' found = 0 f.write(line) ``` 问题2是我使用SDIO编译发现报错,原因是DFS未开启,修改bord/kconfig ``` menuconfig BSP_USING_SDIO bool "Enable SDIO" default n select RT_USING_SDIO select RT_USING_DFS if BSP_USING_SDIO config BSP_USING_SDIO1 bool "Enable SDIO1" default n endif ``` 使用SDIO也会开启DFS 问题3只是因为工程默认使用JLINK,但是板载ATLING很方便,顺便改了 问题4是由于rtt升级了rtc框架导致原有驱动无法编译, ```c static time_t get_rtc_timestamp(void) { #ifdef SOC_SERIES_AT32F415 struct tm tm_new; ERTC_TimeType ERTC_TimeStruct; ERTC_DateType ERTC_DateStruct; ERTC_GetTimeValue(ERTC_Format_BIN, &ERTC_TimeStruct); ERTC_GetDateValue(ERTC_Format_BIN, &ERTC_DateStruct); tm_new.tm_sec = ERTC_TimeStruct.ERTC_Seconds; tm_new.tm_min = ERTC_TimeStruct.ERTC_Minutes; tm_new.tm_hour = ERTC_TimeStruct.ERTC_Hours; tm_new.tm_mday = ERTC_DateStruct.ERTC_Date; tm_new.tm_mon = ERTC_DateStruct.ERTC_Month - 1; tm_new.tm_year = ERTC_DateStruct.ERTC_Year + 100; LOG_D("get rtc time."); return timegm(&tm_new); #else return RTC_GetCounter(); #endif } static rt_err_t set_rtc_time_stamp(time_t time_stamp) { #ifdef SOC_SERIES_AT32F415 ERTC_TimeType ERTC_TimeStructure; ERTC_DateType ERTC_DateStructure; struct tm *p_tm; p_tm = gmtime(&time_stamp); if (p_tm->tm_year < 100) { return -RT_ERROR; } ERTC_TimeStructure.ERTC_Seconds = p_tm->tm_sec ; ERTC_TimeStructure.ERTC_Minutes = p_tm->tm_min ; ERTC_TimeStructure.ERTC_Hours = p_tm->tm_hour; ERTC_DateStructure.ERTC_Date = p_tm->tm_mday; ERTC_DateStructure.ERTC_Month = p_tm->tm_mon + 1 ; ERTC_DateStructure.ERTC_Year = p_tm->tm_year - 100; ERTC_DateStructure.ERTC_WeekDay = p_tm->tm_wday + 1; if (ERTC_SetTimeValue(ERTC_Format_BIN, &ERTC_TimeStructure) != SUCCESS) { return -RT_ERROR; } if (ERTC_SetDateValue(ERTC_Format_BIN, &ERTC_DateStructure) != SUCCESS) { return -RT_ERROR; } #else /* Set the RTC counter value */ RTC_SetCounter(time_stamp); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #endif /* SOC_SERIES_AT32F415 */ LOG_D("set rtc time."); #ifdef SOC_SERIES_AT32F415 ERTC_WriteBackupRegister(ERTC_BKP_DT0, BKUP_REG_DATA); #else BKP_WriteBackupReg(BKP_DT1, BKUP_REG_DATA); #endif return RT_EOK; } static rt_err_t rt_rtc_config(void) { #if defined (SOC_SERIES_AT32F415) ERTC_InitType ERTC_InitStructure; #endif /* Allow access to BKP Domain */ PWR_BackupAccessCtrl(ENABLE); #ifdef SOC_SERIES_AT32F415 #ifdef BSP_RTC_USING_LSI RCC_ERTCCLKConfig(RCC_ERTCCLKSelection_LSI); RCC_ERTCCLKCmd(ENABLE); #else RCC_ERTCCLKConfig(RCC_ERTCCLKSelection_LSE); RCC_ERTCCLKCmd(ENABLE); #endif /* BSP_RTC_USING_LSI */ /* Wait for ERTC APB registers synchronisation */ ERTC_WaitForSynchro(); #else #ifdef BSP_RTC_USING_LSI RCC_RTCCLKConfig(RCC_RTCCLKSelection_LSI); RCC_RTCCLKCmd(ENABLE); #else RCC_RTCCLKConfig(RCC_RTCCLKSelection_LSE); RCC_RTCCLKCmd(ENABLE); #endif /* BSP_RTC_USING_LSI */ /* Wait for RTC registers synchronization */ RTC_WaitForSynchro(); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #endif /* SOC_SERIES_AT32F415 */ #ifdef SOC_SERIES_AT32F415 if (ERTC_ReadBackupRegister(BKP_DT1)!= BKUP_REG_DATA) #else if (BKP_ReadBackupReg(BKP_DT1) != BKUP_REG_DATA) #endif { LOG_I("RTC hasn't been configured, please use
command to config."); #ifdef SOC_SERIES_AT32F415 /* Configure the ERTC data register and ERTC prescaler */ ERTC_InitStructure.ERTC_AsynchPrediv = 0x7F; ERTC_InitStructure.ERTC_SynchPrediv = 0xFF; ERTC_InitStructure.ERTC_HourFormat = ERTC_HourFormat_24; ERTC_Init(&ERTC_InitStructure); #else /* Set RTC prescaler: set RTC period to 1sec */ RTC_SetDIV(32767); /* Wait until last write operation on RTC registers has finished */ RTC_WaitForLastTask(); #endif } return RT_EOK; } static rt_err_t at32_rtc_init(void) { #if defined (SOC_SERIES_AT32F415) RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR, ENABLE); #else RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR | RCC_APB1PERIPH_BKP, ENABLE); #endif #ifdef BSP_RTC_USING_LSI RCC_LSICmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSISTBL) == RESET); #else PWR_BackupAccessCtrl(ENABLE); RCC_LSEConfig(RCC_LSE_ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_LSESTBL) == RESET); #endif /* BSP_RTC_USING_LSI */ if (rt_rtc_config() != RT_EOK) { LOG_E("rtc init failed."); return -RT_ERROR; } return RT_EOK; } static rt_err_t at32_rtc_get_secs(void *args) { *(rt_uint32_t *)args = get_rtc_timestamp(); LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args); return RT_EOK; } static rt_err_t at32_rtc_set_secs(void *args) { rt_err_t result = RT_EOK; if (set_rtc_time_stamp(*(rt_uint32_t *)args)) { result = -RT_ERROR; } LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args); return result; } static const struct rt_rtc_ops at32_rtc_ops = { at32_rtc_init, at32_rtc_get_secs, at32_rtc_set_secs, RT_NULL, RT_NULL, RT_NULL, RT_NULL, }; static rt_rtc_dev_t at32_rtc_dev; int rt_hw_rtc_init(void) { rt_err_t result; at32_rtc_dev.ops = &at32_rtc_ops; result = rt_hw_rtc_register(&at32_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR,RT_NULL); if (result != RT_EOK) { LOG_E("rtc register err code: %d", result); return result; } LOG_D("rtc init success"); return RT_EOK; } INIT_DEVICE_EXPORT(rt_hw_rtc_init); ``` 按照2.0做一下修改即可,使用文档RTCdemo测试 ![image.png](https://oss-club.rt-thread.org/uploads/20210825/4c43fabd01c21aed5fe8437893e436fd.png) 可以看到状态正常
7
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
打盹的消防车
忙着打盹...
文章
3
回答
30
被采纳
1
关注TA
发私信
相关文章
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
8
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部