Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
tools-mirror
Micropython
提交
b4f814c9
M
Micropython
项目概览
tools-mirror
/
Micropython
12 个月 前同步成功
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
Micropython
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b4f814c9
编写于
3月 24, 2018
作者:
I
iabdalkader
提交者:
Damien George
3月 28, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
stm32/sdcard: Add H7 SD card support.
上级
9b9896b4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
29 addition
and
1 deletion
+29
-1
ports/stm32/sdcard.c
ports/stm32/sdcard.c
+29
-1
未找到文件。
ports/stm32/sdcard.c
浏览文件 @
b4f814c9
...
...
@@ -39,7 +39,7 @@
#if MICROPY_HW_HAS_SDCARD
#if defined(STM32F7) || defined(STM32L4)
#if defined(STM32F7) || defined(STM32
H7) || defined(STM32
L4)
// The F7 has 2 SDMMC units but at the moment we only support using one of them in
// a given build. If a boards config file defines MICROPY_HW_SDMMC2_CK then SDMMC2
...
...
@@ -80,7 +80,15 @@
#define SDIO_HARDWARE_FLOW_CONTROL_DISABLE SDMMC_HARDWARE_FLOW_CONTROL_DISABLE
#define SDIO_HARDWARE_FLOW_CONTROL_ENABLE SDMMC_HARDWARE_FLOW_CONTROL_ENABLE
#if defined(STM32H7)
#define GPIO_AF12_SDIO GPIO_AF12_SDIO1
#define SDIO_IRQHandler SDMMC1_IRQHandler
#define SDIO_TRANSFER_CLK_DIV SDMMC_NSpeed_CLK_DIV
#define SDIO_USE_GPDMA 0
#else
#define SDIO_TRANSFER_CLK_DIV SDMMC_TRANSFER_CLK_DIV
#define SDIO_USE_GPDMA 1
#endif
#else
...
...
@@ -91,6 +99,7 @@
#define SDMMC_IRQn SDIO_IRQn
#define SDMMC_TX_DMA dma_SDIO_0_TX
#define SDMMC_RX_DMA dma_SDIO_0_RX
#define SDIO_USE_GPDMA 1
#endif
...
...
@@ -116,7 +125,9 @@
// if an sd card is detected. This will save approx 260 bytes of RAM
// when no sdcard was being used.
static
SD_HandleTypeDef
sd_handle
;
#if SDIO_USE_GPDMA
static
DMA_HandleTypeDef
sd_rx_dma
,
sd_tx_dma
;
#endif
void
sdcard_init
(
void
)
{
// invalidate the sd_handle
...
...
@@ -155,6 +166,12 @@ void HAL_SD_MspInit(SD_HandleTypeDef *hsd) {
// enable SDIO clock
SDMMC_CLK_ENABLE
();
#if defined(STM32H7)
// Reset SDMMC
__HAL_RCC_SDMMC1_FORCE_RESET
();
__HAL_RCC_SDMMC1_RELEASE_RESET
();
#endif
// NVIC configuration for SDIO interrupts
HAL_NVIC_SetPriority
(
SDMMC_IRQn
,
IRQ_PRI_SDIO
,
IRQ_SUBPRI_SDIO
);
HAL_NVIC_EnableIRQ
(
SDMMC_IRQn
);
...
...
@@ -182,7 +199,9 @@ bool sdcard_power_on(void) {
// SD device interface configuration
sd_handle
.
Instance
=
SDIO
;
sd_handle
.
Init
.
ClockEdge
=
SDIO_CLOCK_EDGE_RISING
;
#ifndef STM32H7
sd_handle
.
Init
.
ClockBypass
=
SDIO_CLOCK_BYPASS_DISABLE
;
#endif
sd_handle
.
Init
.
ClockPowerSave
=
SDIO_CLOCK_POWER_SAVE_ENABLE
;
sd_handle
.
Init
.
BusWide
=
SDIO_BUS_WIDE_1B
;
sd_handle
.
Init
.
HardwareFlowControl
=
SDIO_HARDWARE_FLOW_CONTROL_DISABLE
;
...
...
@@ -310,8 +329,10 @@ mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blo
// we must disable USB irqs to prevent MSC contention with SD card
uint32_t
basepri
=
raise_irq_pri
(
IRQ_PRI_OTG_FS
);
#if SDIO_USE_GPDMA
dma_init
(
&
sd_rx_dma
,
&
SDMMC_RX_DMA
,
&
sd_handle
);
sd_handle
.
hdmarx
=
&
sd_rx_dma
;
#endif
// make sure cache is flushed and invalidated so when DMA updates the RAM
// from reading the peripheral the CPU then reads the new data
...
...
@@ -322,8 +343,10 @@ mp_uint_t sdcard_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blo
err
=
sdcard_wait_finished
(
&
sd_handle
,
60000
);
}
#if SDIO_USE_GPDMA
dma_deinit
(
&
SDMMC_RX_DMA
);
sd_handle
.
hdmarx
=
NULL
;
#endif
restore_irq_pri
(
basepri
);
}
else
{
...
...
@@ -372,8 +395,10 @@ mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t n
// we must disable USB irqs to prevent MSC contention with SD card
uint32_t
basepri
=
raise_irq_pri
(
IRQ_PRI_OTG_FS
);
#if SDIO_USE_GPDMA
dma_init
(
&
sd_tx_dma
,
&
SDMMC_TX_DMA
,
&
sd_handle
);
sd_handle
.
hdmatx
=
&
sd_tx_dma
;
#endif
// make sure cache is flushed to RAM so the DMA can read the correct data
MP_HAL_CLEAN_DCACHE
(
src
,
num_blocks
*
SDCARD_BLOCK_SIZE
);
...
...
@@ -382,8 +407,11 @@ mp_uint_t sdcard_write_blocks(const uint8_t *src, uint32_t block_num, uint32_t n
if
(
err
==
HAL_OK
)
{
err
=
sdcard_wait_finished
(
&
sd_handle
,
60000
);
}
#if SDIO_USE_GPDMA
dma_deinit
(
&
SDMMC_TX_DMA
);
sd_handle
.
hdmatx
=
NULL
;
#endif
restore_irq_pri
(
basepri
);
}
else
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录