ARM CMSIS Driver 学习 之 SPI

发布者:sheng44最新更新时间:2018-04-23 来源: eefocus关键字:ARM  CMSIS  Driver  SPI 手机看文章 扫描二维码
随时随地手机看文章

CMSIS Driver 都有着相似的 API 函数和相似的调用方法,它是在 ST HAL 库的基础上又进一步的封装,使用和配置起来都要比 ST HAL 库要方便和简单许多,并且还是跨平台的,非常有学习和使用的价值。今天学习 SPI API 的使用,详细介绍见 CMSIS Driver SPI API

SPI 发送与接收

/** 

  ****************************************************************************** 

  * @file    main.c 

  * @author  XinLi 

  * @version v1.0 

  * @date    20-March-2018 

  * @brief   Main program body. 

  ****************************************************************************** 

  * @attention 

  * 

  *

Copyright © 2018 XinLi

 

  * 

  * This program is free software: you can redistribute it and/or modify 

  * it under the terms of the GNU General Public License as published by 

  * the Free Software Foundation, either version 3 of the License, or 

  * (at your option) any later version. 

  * 

  * This program is distributed in the hope that it will be useful, 

  * but WITHOUT ANY WARRANTY; without even the implied warranty of 

  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 

  * GNU General Public License for more details. 

  * 

  * You should have received a copy of the GNU General Public License 

  * along with this program.  If not, see

  * 

  ****************************************************************************** 

  */  

  

/* Header includes -----------------------------------------------------------*/  

#include "stm32f4xx.h"  

#include "Driver_SPI.h"  

#include  

  

/* Macro definitions ---------------------------------------------------------*/  

/* Type definitions ----------------------------------------------------------*/  

/* Variable declarations -----------------------------------------------------*/  

extern ARM_DRIVER_SPI Driver_SPI1;  

  

/* Variable definitions ------------------------------------------------------*/  

static uint8_t txBuffer[5]   = {0xAB};  

static uint8_t rxBuffer[5]   = {0};  

static uint8_t dataBuffer[5] = {0};  

  

/* Function declarations -----------------------------------------------------*/  

static void SPI1_Callback(uint32_t event);  

static void SPI1_CS_Init(void);  

static void SPI1_CS_Low(void);  

static void SPI1_CS_High(void);  

static void SystemClock_Config(void);  

  

/* Function definitions ------------------------------------------------------*/  

  

/** 

  * @brief  Main program. 

  * @param  None. 

  * @return None. 

  */  

int main(void)  

{  

  /* STM32F4xx HAL library initialization: 

       - Configure the Flash prefetch, instruction and Data caches 

       - Configure the Systick to generate an interrupt each 1 msec 

       - Set NVIC Group Priority to 4 

       - Global MSP (MCU Support Package) initialization 

     */  

  HAL_Init();  

    

  /* Configure the system clock to 168 MHz */  

  SystemClock_Config();  

    

  SPI1_CS_Init();  

    

  Driver_SPI1.Initialize(SPI1_Callback);  

  Driver_SPI1.PowerControl(ARM_POWER_FULL);  

  Driver_SPI1.Control(ARM_SPI_MODE_MASTER |  

                      ARM_SPI_CPOL0_CPHA0 |  

                      ARM_SPI_MSB_LSB |  

                      ARM_SPI_SS_MASTER_UNUSED |  

                      ARM_SPI_DATA_BITS(8), 10000000);  

    

  SPI1_CS_Low();  

  Driver_SPI1.Transfer(txBuffer, rxBuffer, sizeof(txBuffer));  

    

  for(;;)  

  {  

      

  }  

}  

  

/** 

  * @brief  SPI1 callback function. 

  * @param  event: SPI events notification mask. 

  * @return None. 

  */  

static void SPI1_Callback(uint32_t event)  

{  

  if(event & ARM_SPI_EVENT_TRANSFER_COMPLETE)  

  {  

    SPI1_CS_High();  

    memcpy(dataBuffer, rxBuffer, sizeof(rxBuffer));  

  }  

}  

  

/** 

  * @brief  SPI1 CS pin initialize. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_Init(void)  

{  

  GPIO_InitTypeDef GPIO_InitStruct = {0};  

    

  /* GPIO Ports Clock Enable */  

  __HAL_RCC_GPIOB_CLK_ENABLE();  

    

  /* Configure GPIO pin : PtPin */  

  GPIO_InitStruct.Pin   = GPIO_PIN_14;  

  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  

  GPIO_InitStruct.Pull  = GPIO_PULLUP;  

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);  

    

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);  

}  

  

/** 

  * @brief  SPI1 CS pin level pull low. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_Low(void)  

{  

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);  

}  

  

/** 

  * @brief  SPI1 CS pin level pull high. 

  * @param  None. 

  * @return None. 

  */  

static void SPI1_CS_High(void)  

{  

  /* Configure GPIO pin Output Level */  

  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);  

}  

  

/** 

  * @brief  System Clock Configuration 

  *         The system Clock is configured as follow :  

  *            System Clock source            = PLL (HSE) 

  *            SYSCLK(Hz)                     = 168000000 

  *            HCLK(Hz)                       = 168000000 

  *            AHB Prescaler                  = 1 

  *            APB1 Prescaler                 = 4 

  *            APB2 Prescaler                 = 2 

  *            HSE Frequency(Hz)              = 8000000 

  *            PLL_M                          = 8 

  *            PLL_N                          = 336 

  *            PLL_P                          = 2 

  *            PLL_Q                          = 7 

  *            VDD(V)                         = 3.3 

  *            Main regulator output voltage  = Scale1 mode 

  *            Flash Latency(WS)              = 5 

  * @param  None 

  * @retval None 

  */  

static void SystemClock_Config(void)  

{  

  RCC_ClkInitTypeDef RCC_ClkInitStruct;  

  RCC_OscInitTypeDef RCC_OscInitStruct;  

  

  /* Enable Power Control clock */  

  __HAL_RCC_PWR_CLK_ENABLE();  

  

  /* The voltage scaling allows optimizing the power consumption when the device is  

     clocked below the maximum system frequency, to update the voltage scaling value  

     regarding system frequency refer to product datasheet.  */  

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);  

  

  /* Enable HSE Oscillator and activate PLL with HSE as source */  

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;  

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;  

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;  

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;  

  RCC_OscInitStruct.PLL.PLLM = 8;  

  RCC_OscInitStruct.PLL.PLLN = 336;  

  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;  

  RCC_OscInitStruct.PLL.PLLQ = 7;  

  HAL_RCC_OscConfig(&RCC_OscInitStruct);  

    

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2  

     clocks dividers */  

  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);  

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;  

  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  

  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;    

  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;    

  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);  

  

  /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */  

  if (HAL_GetREVID() == 0x1001)  

  {  

    /* Enable the Flash prefetch */  

    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();  

  }  

}  


关键字:ARM  CMSIS  Driver  SPI 引用地址:ARM CMSIS Driver 学习 之 SPI

上一篇:STM32F103C8T6通过MAX31865读取PT100电阻值
下一篇:ARM CMSIS Driver 学习 之 USART

推荐阅读最新更新时间:2024-03-16 16:00

解析LED驱动电源的隔离与非隔离设计
  目前在一般的LED照明市场上,存在非隔离设计和隔离型驱动 电源 之分。非隔离设计仅限于双绝缘产品,例如灯泡的替代产品,其中LED和整个产品都集成并密封在非导电塑料中,因此,最终用户并没有任何触电的危险。二级产品都是隔离型的,价格相对比较昂贵,但在用户可以接触到LED和输出接线的地方(通常在LED照明和路灯照明应用的情况下),这种产品必不可少。   带隔离 变压器 或者电气隔离的LED驱动电源意味着LED可以直接用手接触而不会触电。而无隔离变压器的LED驱动电源虽仍可以借助防护外壳实现部分机械绝缘,但此时的LED在工作时并不能直接接触。   绝缘型灯泡在今后将成为主流   物理设计决定着驱动器是隔离式还是非隔离式。安全规则通
[电源管理]
电动汽车驱动系统中的超级电容原理及应用
  超级电容是一种电化学装置,是介于电池和普通电容之间的过渡部件。其充放电过程高度可逆,可进行高效率(0.85~0.98)的快速(秒级)充放电。其优点还包括比功率高、循环寿命长、免维护等。   以前由于超级电容的比能量过低,放电时间太短,难以应用于汽车领域。随着超级电容技术的迅速发展,目前成为汽车领域研究和应用的新热点。超级电容不仅适合用作汽车发动机起动、动力转向等子系统的辅助能源,而且还可以与电池、燃料电池等结合用作电动汽车的辅助能源,从而提高电池寿命,弥补燃料电池比功率不足,最大限度的回收制动能量等。总之,其在汽车领域有十分广阔的应用前景。 超级电容的原理与分类   准确的说,超级电容应该叫做电化学电容器(Electro
[汽车电子]
电动汽车<font color='red'>驱动</font>系统中的超级电容原理及应用
由AI驱动的电动汽车云连接电池管理系统
由AI驱动的电动汽车云连接电池管理系统 由AI驱动的电池管理系统数字孪生云端模型可提高电动汽车的电池续航里程、能效、安全性和使用寿命,并预示着多种全新应用的出现 中国上海——2022年11月14日——恩智浦半导体(NXP Semiconductors N.V.,)宣布新开发的解决方案可通过S32G GoldBox汽车网络参考设计将其高压电池管理系统(HVBMS)连接到云端,以利用由人工智能(AI)驱动的电池数字孪生模型。恩智浦通过Electra Vehicles, Inc的EVE-Ai™ 360度自适应控制技术激发云端数字孪生模型的潜在优势,实现更优物理BMS实时预测和管理,提升电池性能,改善电池健康状态(提升高达1
[汽车电子]
由AI<font color='red'>驱动</font>的电动汽车云连接电池管理系统
基于ARM7 TDMI-S CPU的LPC2103的多功能电子钟
一、课程设计内容与要求 1)时钟显示功能,采用数码管的动态扫描工作方式,可通过键盘分别选择显示年或者月/日或者时/分或者分/秒, 2)在键盘电路中,第一次中断判断有无键按下,若有按下则实行定时一次,下一次中断开始扫描。 3)具有校准年、月、日、时、分的功能。 4)闹钟功能,可按设定的时间闹时,随时开启或关闭闹钟。 二、元器件的介绍 我在这次的课程设计中使用的主芯片是LPC2103,下面对其进行简要的介绍。 LPC2103是一个基于支持实时仿真的16/32位ARM7 TDMI-S CPU的微控制器,并带有32kB的嵌入高速Flash存储器,128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速
[单片机]
基于<font color='red'>ARM</font>7 TDMI-S CPU的LPC2103的多功能电子钟
高频电源模块的驱动电路的设计与研究
 一个理想的IGBT驱动电路应具有以下基本性能:   (1)动态驱动能力强,能为IGBT栅极提供具有陡峭前后沿的驱动电压脉冲;   (2)IGBT导通后,栅极驱动电路提供给IGBT的驱动电压和电流要有足够的幅度,使IGBT的功率输出级总处于饱和状态,瞬时过载时,栅极驱动电路提供的驱动功率要足以保证IGBT不退出饱和区而损坏;   (3)能向IGBT提供适当的正向栅压,一般取+15V为宜;   (4)能向IGBT提供足够的反向栅压,利于IGBT的快速关断,幅值一般为5V-15V;   (5)由于IGBT多用于高压场合,驱动电路必需有足够的输入输出电隔离能力且不影响驱动信号的正常传输;   (6)具有栅压限幅电路,保护栅极不被
[电源管理]
高频电源模块的<font color='red'>驱动</font>电路的设计与研究
Maxim的可调恒流源MAX16803具备PWM亮度调节功能
美信(Maxim Integrated Products)推出可调恒流源MAX16803,可提供高达350mA的电流来驱动一列或多列高亮度LED(HB LED)。6.5V至40V宽输入电压范围可有效避免甩负载和冷启动等大瞬态的危害。通过高电压(40V)PWM引脚可实现较宽的亮度调节范围。适用于汽车照明、LED显示器背光、工业和建筑物照明应用。 MAX16803调节器组合使用低电压(204mV)电流检测基准和差分LED电流检测技术,提供±3.5%的负载电流精度。该电流精度可使所有照明组件实现均匀亮度。器件内置低压差调整元件(典型值0.5V)和电流检测基准,可使系统的功耗降至最低。并联多片MAX16803 LED驱动器IC,能提供
[新品]
VMOS共源极组态的驱动及电路图
在VMOS管所有的工作方式中,共源极组态的驱动最简单。因为VMOS管是电压控制器件,输入阻抗极高,可以由多重逻辑电路直接驱动。
[电源管理]
VMOS共源极组态的<font color='red'>驱动</font>及电路图
基于ARM的综合测试仪设计
  我国的疆域广阔,时区分布不同,海拔以及温度,湿度等气候差异都很大,实时的了解我们所处位置的气候情况对工作和生活是很重要的。尤其对一些野外工作的科研人员来说,需要测试海拔,温度,湿度等物理量作为参考因素。为了测量这些物理量需要我们携带多种测试设备,这对野外工作很不方便。为了实时方便的了解我们所处的海拔高度和天气情况,我们需要有更便捷,功能更齐全的综合测量仪器。同时可以将现场的数据送到PC,以方便今后的进一步分析和处理。   2系统组成以及基本原理   整个综合测试仪主要由五个部分组成。分别是核心控制单元,湿度测量,海拔高度测量,温度测量,以及测量数据显示部分。湿度测量是通过湿度传感器将环境湿度物理量变换为电信号,最终将处
[单片机]
基于<font color='red'>ARM</font>的综合测试仪设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved