使用STM32F103构建基于SPI通信的SD卡读卡器:基于“Blue Pill”板的实践指南及代码示例

前言

在众多微控制器中,STM32F103是使用非常广泛的一种,其强大的性能和丰富的外设支持赢得了许多开发者的青睐。在此文中,我将为大家分享如何使用STM32F103(基于“Blue Pill”板)实现基于SPI的SD卡读卡器。

在开始阅读之前,我想提醒大家,此文可能并不能涵盖所有你想要了解的细节。我会尽我所能,以最简洁明了的方式讲解。如有不明之处,还请海涵,欢迎提问。

实战项目下载

一、工程环境配置

我们的项目在STM32的System Workbench中设置和测试。这是一个用于开发基于ARM Cortex-M微控制器的STM32嵌入式应用的开源、免费的IDE。它基于Eclipse平台,配备了GCC工具链、GDB和OpenOCD,可以运行在Windows、Linux和MacOS平台上。

首先,我们需要确保已经正确安装了STM32CubeMX以及System Workbench for STM32。若尚未安装,可参照STM32CubeMX官方手册以及System Workbench for STM32官方文档进行安装配置。

二、硬件连接

接下来,我们将讲解如何进行硬件连接。本项目中,我们将使用STM32F103作为主控,通过SPI通信协议来与SD卡进行通信。对于SPI的通信,STM32F103和SD卡需要通过四根线(CS、SCK、MISO、MOSI)进行连接。

我们的接线设置如下:

  • 标清 CS = PA4
  • SD SCK = PA5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在STM32F103RB上使用0.91英寸OLED屏幕,您需要连接SPI接口来控制它。以下是实现该功能的步骤: 1. 配置SPI接口 您需要使用STM32SPI接口来发送命令和数据到OLED屏幕。首先,您需要配置SPI接口的时钟、数据位、模式等参数。以下是基本的SPI配置代码: ``` SPI_HandleTypeDef hspi2; void MX_SPI2_Init(void) { hspi2.Instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_DIRECTION_2LINES; hspi2.Init.DataSize = SPI_DATASIZE_8BIT; hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } } ``` 2. 初始化OLED屏幕 在使用OLED屏幕之前,您需要初始化它。这涉及到向屏幕发送一系列的命令,以设置其工作模式、分辨率、亮度等参数。以下是基本的OLED初始化代码: ``` void OLED_Init(void) { OLED_Write_Command(0xAE); //display off OLED_Write_Command(0x20); //Set Memory Addressing Mode OLED_Write_Command(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid OLED_Write_Command(0xB0); //Set Page Start Address for Page Addressing Mode,0-7 OLED_Write_Command(0xC8); //Set COM Output Scan Direction OLED_Write_Command(0x00); //---set low column address OLED_Write_Command(0x10); //---set high column address OLED_Write_Command(0x40); //--set start line address OLED_Write_Command(0x81); //--set contrast control register OLED_Write_Command(0xFF); OLED_Write_Command(0xA1); //--set segment re-map 0 to 127 OLED_Write_Command(0xA6); //--set normal display OLED_Write_Command(0xA8); //--set multiplex ratio(1 to 64) OLED_Write_Command(0x3F); // OLED_Write_Command(0xA4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content OLED_Write_Command(0xD3); //-set display offset OLED_Write_Command(0x00); //-not offset OLED_Write_Command(0xD5); //--set display clock divide ratio/oscillator frequency OLED_Write_Command(0xF0); //--set divide ratio OLED_Write_Command(0xD9); //--set pre-charge period OLED_Write_Command(0x22); // OLED_Write_Command(0xDA); //--set com pins hardware configuration OLED_Write_Command(0x12); OLED_Write_Command(0xDB); //--set vcomh OLED_Write_Command(0x20); //0x20,0.77xVcc OLED_Write_Command(0x8D); //--set DC-DC enable OLED_Write_Command(0x14); // OLED_Write_Command(0xAF); //--turn on oled panel } ``` 3. 显示数字 一旦OLED屏幕初始化成功,您可以使用OLED_Write_Data()函数向屏幕发送数据,以显示数字。以下是示例代码: ``` void OLED_Show_Number(int x, int y, int num, int size) { char str[10]; sprintf(str, "%d", num); for (int i = 0; i < strlen(str); i++) { OLED_Show_Char(x + i * 8, y, str[i], size); } } void OLED_Show_Char(int x, int y, char chr, int size) { unsigned char c = chr - 32; if (x > OLED_WIDTH - 1 || y > OLED_HEIGHT - 1 || x < 0 || y < 0) { return; } for (int i = 0; i < 8; i++) { unsigned char line; if (size == 1) { line = ASCII[c][i]; } else { line = ASCII[c][i / 2] << 4 | ASCII[c][i / 2 + 1]; } for (int j = 0; j < 8; j++) { if (line & 0x80) { OLED_Draw_Pixel(x + i, y + j, 1); } else { OLED_Draw_Pixel(x + i, y + j, 0); } line <<= 1; } } } ``` 其中,OLED_Draw_Pixel()函数用于在(x,y)位置绘制一个像素点。ASCII数组包含了ASCII码表中的字符的字形数据,用于在屏幕上显示字符。 完整的代码示例可以参考以下链接:https://github.com/micropython/micropython/blob/master/ports/stm32/boards/BLUEPILL_F103RB/mains/oled.c

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快撑死的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值