IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F407VGT6开发笔记 -> 正文阅读

[嵌入式]STM32F407VGT6开发笔记

作者:template-box

开发环境安装

1.点击mdk_xxx.exe,安装MDK软件;
2.点击Keil.STM32FXxx_DFP.x.x.x.pack,安装芯片支持包

仿真器连接

连线方式
主控板程序烧写接口如下图:
主控板程序烧写接口
ST-Link-V2各引脚定义:
在这里插入图片描述

  SWCLK--------------------------->SWCLK 
  SWDIO--------------------------->SWDIO 
  VCC  --------------------------->VCC
  GND  --------------------------->GND

Keil配置
USB通讯错误解决

时钟配置

STM32F4时钟树
在这里插入图片描述
时钟初始化代码

/*+------------时钟初始化----------------+*/

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  //Configure the main internal regulator output voltage
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  
	//Initializes the CPU, AHB and APB bus clocks 
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; //晶振
  RCC_OscInitStruct.HSIState = RCC_HSI_ON; //内部时钟,16MHz
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; //HSI校准值
  RCC_OscInitStruct.LSIState = RCC_LSI_ON; //32kHz,IWDG、AWU使用
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //主时钟,参考时钟树
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8; 
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //主时钟168MHz
  RCC_OscInitStruct.PLL.PLLQ = 7; //外设时钟48MHz
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
	
  //Initializes the CPU, AHB and APB bus clocks
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; //AHB总线
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; //APB外设
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    Error_Handler();
  }
}

GPIO配置

端口结构
在这里插入图片描述
施密特触发器
GPIO各种模式
此处部分gpio主要用作状态指示
gpio.h

#include "sys.h"

#define vbat_led1_GPIO_Port GPIOE
#define vbat_led2_GPIO_Port GPIOE
#define vbat_led3_GPIO_Port GPIOE
#define running_status_led_GPIO_Port GPIOF

#define vbat_led1_Pin GPIO_PIN_13
#define vbat_led2_Pin GPIO_PIN_14
#define vbat_led3_Pin GPIO_PIN_15
#define running_status_led0_Pin GPIO_PIN_9
#define LED0 PFout(9)//调试LED
void GPIO_Init(void);

gpio.c

#include "gpio.h"


void GPIO_Init()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	/* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
	__HAL_RCC_GPIOF_CLK_ENABLE();
	
	/*Configure GPIO pin Output Level */
	HAL_GPIO_WritePin(vbat_led1_GPIO_Port,vbat_led1_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(vbat_led2_GPIO_Port,vbat_led2_Pin, GPIO_PIN_SET);
	HAL_GPIO_WritePin(vbat_led3_GPIO_Port,vbat_led3_Pin, GPIO_PIN_SET);
	
	/*Configure GPIO pins */
	GPIO_InitStruct.Pin = vbat_led1_Pin|vbat_led2_Pin|vbat_led3_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
	
	GPIO_InitStruct.Pin = running_status_led0_Pin;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
	
	HAL_GPIO_WritePin(GPIOF,running_status_led0_Pin,GPIO_PIN_SET);
}

UART串口配置

UART_HandleTypeDef UART1_Handler; //UART句柄
//初始化IO 串口1 
//bound:波特率
void uart1Init(u32 bound)
{	
	//UART 初始化设置
	UART1_Handler.Instance=USART1;					    //USART1
	UART1_Handler.Init.BaudRate=bound;				    //波特率
	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	    //一个停止位
	UART1_Handler.Init.Parity=UART_PARITY_NONE;		    //无奇偶校验位
	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		    //收发模式
	UART1_Handler.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  	UART1_Handler.Init.OverSampling = UART_OVERSAMPLING_16;
	if(HAL_UART_Init(&UART1_Handler) != HAL_OK)
		Error_Handler();					    //HAL_UART_Init()会使能UART1
	
}

//UART底层初始化,时钟使能,引脚配置,中断配置
//此函数会被HAL_UART_Init()调用
//huart:串口句柄
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
	GPIO_InitTypeDef GPIO_Initure;
	
	/**USART1 GPIO Configuration    
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX 
    */
	if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
	{
		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
	
		GPIO_Initure.Pin=GPIO_PIN_9 | GPIO_PIN_10;			//PA9
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9
		
		#if EN_USART1_RX
			HAL_NVIC_EnableIRQ(USART1_IRQn);				//使能USART1中断通道
			HAL_NVIC_SetPriority(USART1_IRQn,2,0);			//抢占优先级3,子优先级3
		#endif	
	}
}

//串口失能
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
	
  if(huart->Instance==UART4)
  {
    __HAL_RCC_UART4_CLK_DISABLE();
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11);
    HAL_NVIC_DisableIRQ(UART4_IRQn);
  }
}

串口发送较为简洁:

HAL_UART_Transmit(&UART1_Handler,(uint8_t*)screenData,44,1000);	//发送接收到的数据

串口接收要用中断来实现,注意将EN_USART1_RX置1!!!

uint8_t SCREEN_RX_BUF[44];
uint8_t screenPoint = 0;
uint8_t screenData[44];
void USART1_IRQHandler(void)         	
{ 
	uint32_t tmp1 = 0U, tmp2 = 0U;
	tmp1 = __HAL_UART_GET_FLAG(&UART1_Handler, UART_FLAG_RXNE);
	tmp2 = __HAL_UART_GET_IT_SOURCE(&UART1_Handler, UART_IT_RXNE);
	if((tmp1 != RESET) && (tmp2 != RESET))
	{ 
		SCREEN_RX_BUF[screenPoint] = (uint8_t)(UART1_Handler.Instance -> DR & (uint8_t) 0x00FFU);
		screenPoint ++;
		if(SCREEN_RX_BUF[4] == 0x0d)
		{
			memset(screenData, 0, 44);
			memcpy(screenData, SCREEN_RX_BUF, 44);
			memset(SCREEN_RX_BUF, 0, 44);
		}
	}
	LED0=!LED0;
	HAL_UART_IRQHandler(&UART1_Handler);
}

SPI配置

SPI接口结构
在这里插入图片描述
主从机通信连接
在这里插入图片描述

SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄
//以下是SPI模块的初始化代码,配置成主机模式 						  
//SPI口初始化
//这里针是对SPI2的初始化
void SPI2_Init(void)
{
    SPI2_Handler.Instance=SPI2;                         //SPI2
    SPI2_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式,设置为主模式
    SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式
    SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT;       //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //串行同步时钟的空闲状态为高电平
    SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI2_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
    SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式
    SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
    SPI2_Handler.Init.CRCPolynomial=10;                  //CRC值计算的多项式
    if(HAL_SPI_Init(&SPI2_Handler) != HAL_OK)
			Error_Handler();//初始化
    
}
//SPI2底层驱动,时钟使能,引脚配置
//此函数会被HAL_SPI_Init()调用
//hspi:SPI句柄
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Initure;
		/**SPI2 GPIO Configuration    
			PB13     ------> SPI2_SCK
			PB14     ------> SPI2_MISO
			PB15     ------> SPI2_MOSI 
			*/
    if(hspi -> Instance == SPI2)
		{
			__HAL_RCC_GPIOB_CLK_ENABLE();       //使能GPIOB时钟
			__HAL_RCC_SPI2_CLK_ENABLE();        //使能SPI2时钟
			
			GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
			GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
			GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
			GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速            
			GPIO_Initure.Alternate=GPIO_AF5_SPI2;           //复用为SPI2
			HAL_GPIO_Init(GPIOB,&GPIO_Initure);
		}
}

//SPI失能
void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
{
	if(hspi->Instance==SPI2)
	{
		__HAL_RCC_SPI2_CLK_DISABLE();
		HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);
	}
}
  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:04:07  更:2021-11-27 10:06:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:59:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码