#include "stm32f10x.h"

/* RCC时钟配置 */
void RCC_config(void)

ErrorStatus HSEStartUpStatus;

/* RCC寄存器设置为默认配置 */
RCC_DeInit();
/* 打开外部高速时钟 */
RCC_HSEConfig(RCC_HSE_ON);
/* 等待外部高速时钟稳定 */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS) 

/* 设置HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* 设置PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* 设置PCLK1 = HCLK / 2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
// /* 设置FLASH代码延时 */
// FLASH_SetLatency(FLASH_Latency_2);
// /* 使能预取址缓存 */
// FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* 设置PLL时钟源为HSE倍频9 72MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* 使能PLL */
RCC_PLLCmd(ENABLE);
/* 等待PLL稳定 */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
/* 设置PLL为系统时钟源 */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* 等待系统时钟源切换到PLL */
while(RCC_GetSYSCLKSource() != 0x08);
}
}

/* GPIO配置 */
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* 时钟配置 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* MISO配置为浮空输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* SCK和MOSI配置为复用推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* NSS配置为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/* SPI配置 */
void SPI_config(void)
{
SPI_InitTypeDef SPI_InitStructure;

/* 时钟配置 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_SPI1, ENABLE);

/* 配置SPI模式 */
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

/* 打开SPI1 */
SPI_Cmd(SPI1, ENABLE);
}

/* 毫秒延时函数 */
void delay_ms(uint16_t time)
{    
uint16_t i = 0;

while(time--)
{
i = 12000;
while(i--);    
}
}

/* SPI发送一个数据 */
uint8_t SPI_SendByte(uint8_t data)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}

/* 主函数 */
int main(void)
{
volatile uint8_t i = 0, j;

/* RCC时钟配置 */
RCC_config();

/* GPIO配置 */
GPIO_config();

/* SPI配置 */
SPI_config();

while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
j = SPI_SendByte(i++);
GPIO_SetBits(GPIOA, GPIO_Pin_4);

/* 1秒延时 */
delay_ms(500);
}
}

STM32之SPI主机例程相关推荐

  1. STM32做SPI主机用得多,SPI从机玩过吗?

    STM32如何配置为SPI从机? 前言 在平常的开发中,很多时候我们使用SPI都是使用主机模式去驱动一些传感器.存储器等等,很少会用到SPI从机.有时候,我们又需要STM32的SPI配置为从机去接收数 ...

  2. stm32作为spi的从机使用例程

    STM32的SPI可以作为master,也可以作为slave,作为slave的例程比较少,今天经过几个小时的折腾,终于把数据获取出来了,经验证和元数据是一致的.现将源代码贴在这里,供有需要的人参考. ...

  3. 基于stm32、spi协议的Fatfs文件系统移植(附完整代码下载)

    开发环境:Window 7 32bit 开发工具:Keil uVision4 硬件:stm32f103vct6 目录 1.硬件设计: 2.软件设计 1.SPI收发数据 2.向SD卡发送的命令格式: 3 ...

  4. STM32利用SPI读写SD卡的程序详解

    STM32利用SPI读写SD卡的一些程序详解 关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明. ...

  5. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  6. stm32中spi可以随便接吗_STM32的SPI模式读写FLASH芯片全面讲解

    例程完整代码: SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,S ...

  7. 实验 STM32 基于SPI的OLED屏显示

    STM32 基于SPI的OLED屏显示 一.任务要求 二.显示自己的学号和姓名 1.例子程序的改写 (1)下载资料 (2)解压后找到文件,并用KEIL打开. (3)改写程序 2.连接硬件 3.运行结果 ...

  8. STM32的SPI模式读写FLASH芯片全面讲解

    SPI协议简介 SPI协议,即串行外围设备接口,是一种告诉全双工的通信总线,它被广泛地使用在ADC,LCD等设备与MCU间通信的场合. SPI信号线 SPI包含4条总线,分别为SS,SCK,MOSI, ...

  9. 基于STM32的SPI基本介绍

    STM32---SPI(DMA)通信的总结(库函数操作) 本文主要由7项内容介绍SPI并会在最后附上测试源码供参考: 1.     SPI的通信协议 2.     SPI通信初始化(以STM32为从机 ...

最新文章

  1. 计算机组成原理-第一章
  2. 使用ML.NET + Azure DevOps + Azure Container Instances打造机器学习生产化
  3. 在EXE和DLL中,FindResource的区别
  4. 物联网听起来像是一个和互联网不同的网,万物互联又把网给弄丢了,正向我们扑面而来的是万物互联网。...
  5. 贪心算法之取手套问题(牛客)
  6. Python学习笔记:利用timeit计算函数调用耗时
  7. 2020项目商机_营销“心”思维,赢得“新”商机 ——2020年第二期军师项目顺利落幕...
  8. 计算机网络rip 图片,计算机网络-RIP协议
  9. apache poi使用例_Apache POI使用详解
  10. NumPy的详细教程(官网手册翻译)
  11. jenkins打包后文件通过ssh上传linux服务器配置
  12. matlab 使用.m文件,matlab 编写M文件(函数)
  13. HTTP代理与DNS
  14. VS2008假死点击无反应解决办法
  15. TensorFlow.jsd的优势
  16. 网贷风控体系之-系统架构
  17. firewall添加白名单_详解firewall的规则设置与命令(白名单设置)
  18. 数据结构排序-7-1 统计工龄 (20 分)
  19. C#System.NullReferenceException:未将对象引用设置到对象的实例
  20. ISO26262解析(九)——系统部分

热门文章

  1. Qt文档阅读笔记-QGraphicsEffect::draw(QPainter *painter)官方解析与实例
  2. Java高级语法笔记-语法支持的异常
  3. HTML期末作业-旅游网页
  4. 6 volist双层数组_Javascript算法 — 数组排序
  5. android 数据回传代码,安卓向.net core api传输图片,执行保存到数据库命令后返回400错误代码,用postman测试没有问题安卓程序不行...
  6. rdd数据存内存 数据量_大数据开发-Spark调优常用手段
  7. 高内聚低耦合通俗理解_带你从入门到精通——「高内聚低耦合」
  8. qq空间登陆 cookie_把这篇 Session、Cookie、Token看完,和面试官随便谈人生
  9. (王道408考研操作系统)第三章内存管理-第一节8:非连续分配管理方式之段页式管理方式
  10. 【C语言重点难点精讲】C语言预处理