历史上的今天
返回首页

历史上的今天

今天是:2025年03月08日(星期六)

2019年03月08日 | STM32之SPI主机例程

2019-03-08 来源:eefocus

#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);

}

}

推荐阅读

史海拾趣

广州奥松公司的发展小趣事

随着公司的不断发展,奥松电子陆续获得了多项荣誉资质,如“国家专精特新‘小巨人’企业”、“国家高新技术企业”等。这些荣誉的获得,不仅证明了公司在电子行业中的实力与地位,也为公司的品牌建设提供了有力的支撑。同时,这些荣誉也为公司的市场拓展和业务发展提供了更多的机遇和可能。

Clover Display Limited公司的发展小趣事

技术创新是Clover Display Limited得以持续发展的核心动力。公司高度重视研发团队的建设,不仅在香港设立了一支强大的研发团队,还不断引进国内外优秀人才。这些研发人员致力于开发液晶显示器(LCD)及液晶显示屏(LCM)的新应用,为公司带来了众多具有市场竞争力的产品。在他们的努力下,Clover Display Limited在液晶显示技术领域取得了多项突破,为公司的快速发展奠定了坚实基础。

DSP Group Inc公司的发展小趣事

在智能语音领域,DSP Group凭借其深厚的技术积累和创新能力,取得了显著的突破。公司推出了一系列智能语音处理技术和产品,如SmartVoice系列语音处理芯片和算法套件等。这些技术和产品不仅为用户提供了更加自然、智能的语音交互体验,还为智能家居、汽车电子等领域的发展提供了有力支持。

FRIWO公司的发展小趣事

FRIWO公司一直将创新视为企业发展的核心驱动力。公司不断投入研发资金,引进高端人才,致力于新技术、新产品的开发和应用。通过持续的技术创新,FRIWO在电源变换器、电源充电器、开关式电源供应器等领域取得了多项技术突破和专利成果。这些技术成果不仅提升了FRIWO产品的性能和品质,也为客户提供了更加高效、可靠的电源解决方案。

台湾致强(FORT)公司的发展小趣事

面对电子行业的快速发展和市场需求的不断变化,致强科技始终保持敏锐的市场洞察力。公司积极寻求与上下游企业的跨界合作,共同推动产业升级和技术创新。通过与知名电子厂商、科研机构及高校等建立紧密的合作关系,致强科技不断引入新技术、新工艺和新材料,为产品的升级换代提供了有力支持。同时,公司还积极拓展新业务领域,如车联网、物联网等新兴领域,为公司的未来发展开辟了更广阔的空间。

Asia Pacific Microsystems Inc公司的发展小趣事

为了进一步提升市场份额和品牌影响力,APM开始积极拓展国内外市场。公司不仅加强了与现有客户的合作关系,还积极参加各类行业展会和技术交流会,与潜在客户建立联系。同时,APM还加大了对品牌建设的投入,通过广告宣传、媒体报道等方式提升品牌知名度和美誉度。这些举措使得APM在电子行业中的影响力逐渐增强。

问答坊 | AI 解惑

概念车系列(一)

这是一款三菱的混合动力概念车。…

查看全部问答>

咨询一个问题关于mini2440驱动中的文件

IO口,寄存器是不是都定义在这个地方呢 mini2440驱动中的文件regs-gpio.h的位置在什么地方呢…

查看全部问答>

为什么LPC2103 ARM的IRQ中断无法使用

这是我写的timer1定时器IRQ中断程序:当定时器发生中断时,关闭LED 我用的开发工具是IAR Embedded Workbench(编译成ARM指令,不用THUMB指令) #include #define Fosc        11059200          ...…

查看全部问答>

Verilog 修正miller码编码

在做这个修正miller码的编码时,如何判定输入的序列是不是最后一位啊?我们讨论可能要用寄存器,不知道这样行不行,哪为大虾给点思路?如果能给写一小段VERILOG,更是感激不尽啊。。…

查看全部问答>

arm汇编实现YUV2RGB的问题

YUV2RGB时需要用到下面的公式: R = Y + 1.402 ( Cr - 128 ) G = Y - 0.34414 ( Cb - 128 )  -  0.71414 ( Cr - 128 ) B = Y + 1.772 ( Cb - 128 ) 为了避免浮点数运算,修改为 R = Y + ( 91881*( Cr - 128 ))>>16 当 ...…

查看全部问答>

P4 CPU中断控制器设置问题

我想将并口的中断模式从level触发改成edge触发,是不是得修改CPU的中断控制器相关寄存器值? 我的cpu是celeron D 347,有人知道它的中断控制器地址和相应寄存器偏移么? …

查看全部问答>

串口的中断会影响定时器A和B的中断。

485通讯和TIMER-A,TIMER-B单独运行时均正常。但加在一齐时,程序跑飞了。只要不写 IE2=URXIE1+UTXIE1;程序运行正常。一旦加上这句话,程序就跑飞。为什么呀?…

查看全部问答>

8*8led 点阵 24引脚???

我买了个8*8的点阵,是红色单色的,但是有24四个引脚,一般不是只有16个引脚吗,,跪求引脚定义。。。。…

查看全部问答>

tlv5616出不来数据,麻烦大家看看我的程序有没问题。。

#include \"msp430x14x.h\" #define uint  unsigned int #define uchar unsigned char #define CPU_F ((double)8000000) #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cy ...…

查看全部问答>