stm32f4手动添加HAL库模块

发布者:声慢慢最新更新时间:2019-07-30 来源: eefocus关键字:stm32f4  手动添加  HAL库模块 手机看文章 扫描二维码
随时随地手机看文章

以uart为例


首先打开stm32f4xx_hal_conf.h中的define:

然后在工程中添加相关的.c文件

定义模块初始化函数,并在main中调用


/* USART3 init function */

static void MX_USART3_UART_Init(void)

{

 

  huart3.Instance = USART3;

  huart3.Init.BaudRate = 19200;//9600;//

  huart3.Init.WordLength = UART_WORDLENGTH_8B;

  huart3.Init.StopBits = UART_STOPBITS_1;

  huart3.Init.Parity = UART_PARITY_NONE;

  huart3.Init.Mode = UART_MODE_TX_RX;

  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart3.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart3) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }

 

}


在stm32f4xx_hal_msp.c中定义模块的MspInit和Deinit(一般没啥用,主要是Init)设置gpio,dma及中断等配置


void HAL_UART_MspInit(UART_HandleTypeDef* huart)

{

 

  GPIO_InitTypeDef GPIO_InitStruct;

  if(huart->Instance==USART3)

  {

  /* USER CODE BEGIN USART3_MspInit 0 */

 

  /* USER CODE END USART3_MspInit 0 */

    /* Peripheral clock enable */

    __HAL_RCC_USART3_CLK_ENABLE();

  

    /**USART3 GPIO Configuration    

    PC10     ------> USART3_TX

    PC11     ------> USART3_RX 

    */

    GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Pull = GPIO_PULLUP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

    GPIO_InitStruct.Alternate = GPIO_AF7_USART3;

    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

 

    /* USART3 DMA Init */

    /* USART3_TX Init */

    hdma_usart3_tx.Instance = DMA1_Stream3;

    hdma_usart3_tx.Init.Channel = DMA_CHANNEL_4;

    hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;

    hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;

    hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;

    hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

    hdma_usart3_tx.Init.Mode = DMA_NORMAL;

    hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;

    hdma_usart3_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

    if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK)

    {

      _Error_Handler(__FILE__, __LINE__);

    }

 

    __HAL_LINKDMA(huart,hdmatx,hdma_usart3_tx);

 

    /* USART3_RX Init */

    hdma_usart3_rx.Instance = DMA1_Stream1;

    hdma_usart3_rx.Init.Channel = DMA_CHANNEL_4;

    hdma_usart3_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;

    hdma_usart3_rx.Init.PeriphInc = DMA_PINC_DISABLE;

    hdma_usart3_rx.Init.MemInc = DMA_MINC_ENABLE;

    hdma_usart3_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;

    hdma_usart3_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

    hdma_usart3_rx.Init.Mode = DMA_NORMAL;

    hdma_usart3_rx.Init.Priority = DMA_PRIORITY_LOW;

    hdma_usart3_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;

    if (HAL_DMA_Init(&hdma_usart3_rx) != HAL_OK)

    {

      _Error_Handler(__FILE__, __LINE__);

    }

 

    __HAL_LINKDMA(huart,hdmarx,hdma_usart3_rx);

 

/* USART3 interrupt Init */

HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(USART3_IRQn);

 

  /* USER CODE BEGIN USART3_MspInit 1 */

 

  /* USER CODE END USART3_MspInit 1 */

  }

 

}

如果使能了中断,在stm32f4xx_it.c中定义模块中断句柄,这个文件中缺少中断句柄会导致hardfault


extern uint8_t recv_end_flag;

extern uint8_t Rx_len;

void USART3_IRQHandler(void)

{

/* USER CODE BEGIN USART3_IRQn 0 */

 

/* USER CODE END USART3_IRQn 0 */

HAL_UART_IRQHandler(&huart3);

/* USER CODE BEGIN USART3_IRQn 1 */

uint32_t temp;

/* 如果是串口3中断   */

if(USART3 == huart3.Instance)

{    

/* 如果是串口3IDLE中断 */

if(RESET != __HAL_UART_GET_FLAG(&huart3,UART_FLAG_IDLE))

{

/* 清除中断标志   */

__HAL_UART_CLEAR_IDLEFLAG(&huart3);

/* 停止DMA接收 */

HAL_UART_DMAStop(&huart3);

/* 获取DMA当前还有多少未填充       */

temp = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);

/* 计算串口接收到的数据个数 */

Rx_len = 100 - temp; 

recv_end_flag = 1;

}

}

 

  /* USER CODE END USART3_IRQn 1 */

}

在相应的位置包含stm32f4xx_hal.h文件,就可以调用模块stm32f4xx_hal_uart.h中的接口了


/* IO operation functions *******************************************************/

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart);

HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart);

HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart);



关键字:stm32f4  手动添加  HAL库模块 引用地址:stm32f4手动添加HAL库模块

上一篇:STM32驱动LCD12864显示屏
下一篇:学习笔记∣stm32l0xx时钟系统详解与代码配置

推荐阅读最新更新时间:2024-11-13 05:54

STM32F429 如何使用LCD
(1)硬件接口 ①要明白RGB888控制LCD 和8080控制方式的区别: TFT液晶显示器使用的是RGB接口,RGB接口包含24根RGB信号线、像素同步信号线、水平同步信号线、垂直同步信号线和数据使能信号线。 性能一般的芯片,通常不会自带液晶控制器,需要使用自带液晶控制器器的液晶屏,这类触摸屏通常使用ILI9341型号的液晶控制芯片。 STM32可以 通过 8080 接口发送命令编码控制 ILI9341 的工作方式,例如复位指令、设置光标指令、睡眠模式指令等等,具体的指令在ILI9341数据手册均有详细说明 ②RGB:https://blog.csdn.net/ctthuangcheng/article/details/
[单片机]
<font color='red'>STM32F4</font>29 如何使用LCD
关于STM32F407开发板的几种内存总结,SRAM,FLASH,EEPROM
常见存储器概念:RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器可以分为很多种类,其中根据掉电数据是否丢失可以分为RAM(随机存取存储器)和ROM(只读存储器),其中RAM的访问速度比较快,但掉电后数据会丢失,而ROM掉电后数据不会丢失。 可以知道SRAM属于RAM,掉电后数据丢失;FLASH和EEPROM属于ROM,掉电后数据不丢失。 FLASH和EEPROM的区别在于:Flash存储器,适用于速度要求高,容量要求大,掉电时要求数据不丢失的场合;EEPROM适用于速度不高,容量不大,掉电时要求数据不丢失的场合。 了解这些之后,翻看开发板的开发手册统计一下用到了哪些内存。 1.芯片自
[单片机]
STM32F407总线存储框架及应用设计
曾有人在STMCU社区网站咨询如下问题: 由于实验需要,要用到STM32F407的两个DMA并用定时器触发,在使用过程中发现DMA1无法把GPIO的IDR数据传输到内存,调试过程中出现DMA1的数据流传输错误标志,但是使用DMA2没有问题。另外当把访问GPIO的IDR改成访问APB1下的tim5的ARR时,DMA1也能正常工作。请问这是怎么回事? 咨询者提到STM32F4系列中DMA1与DMA和另外两个外设GPIO和TIM5 。为了弄清这个问题,我们有必要先看看STM32F407的总线与存储框架图。 如下图所示: 整个系统架构由多层32位AHB总线矩阵及主从总线构成,并建立起各个主从模块间的互联访问。借助于总线矩阵,可以实
[单片机]
<font color='red'>STM32F4</font>07总线存储框架及应用设计
STM32F4_USART配置及细节描述
Ⅰ、概述 关于USART串口通信,可以说是MCU的标配。不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用。 在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添加RS232、RS485等对UART数据进行转换。 在开发过程中,我们常常用它来打印调试信息,我们购买的开发板基本上都有一个UART通信接口(DB9的接头),这个接口主要的一个作用就是用来开发时调试使用。 本文主要针对STM32初学者,使用STM32F4标准外设库、Keil集成IDE,对STM32F4的USART进行配置及描述。1.详细描述使用自定义打印数据、自定义中断接收数据;2.重定义打印数据printf; 关于本文的
[单片机]
<font color='red'>STM32F4</font>_USART配置及细节描述
STM32F4的IO设置测试
环境: 主机:WIN7 开发环境:MDK4.72 MCU:STM32F407VGT6 说明: 目标板上有一个LED,有一个按键,按键实现LED状态翻转. LED:PE2,低电平亮,高电平灯灭 按键:PC13,低电平按下,高电平松开 源代码: main.c /********************************************************************* * 主文件 * (c)copyright 2014,jdh * All Right Reserved *新建日期:2014/3/2
[单片机]
STM32F4时钟系统初探(二)
上次了解了STM32F4时钟系统中PLL的基本状况, 现在我打算自已动手配置一下STM32的时钟, 使用PLL将STM32F429的主频倍到168MHz去, Let’s go. 名词注解: RCC: Reset Clock Config, 复位时钟配置. 下面直接上代码, 但有有一点要注意: 在使能PLL之前PLL所有的参数都要配置完毕, 等PLL使能后PLL是不可以再进行配置的. 代码: void RCC_Config(void) { ErrorStatus status = ERROR; // 复位RCC寄存器 RCC_DeInit(); // 打开外部高速晶振 RCC_HSEConfig(RCC_HSE_
[单片机]
stm32f407】轮序方式的按键应用
1. 硬件原理图: 可以看到user button是PA0 2. 程序步骤 1) 使能按键对应IO口时钟。 PA0在AHB1总线上 调用函数:RCC_AHB1PeriphClockCmd (); 2) 初始化IO模式:上拉/下拉输入。 3) 扫描IO口电平 3. 程序原码 key.h #ifndef _KEY_H_H_H #define _KEY_H_H_H #include stm32f4xx_gpio.h #include stm32f4xx_rcc.h #define KEY_ON 0 #define KEY_OFF 1 void KEY_Init(void); ui
[单片机]
【<font color='red'>stm32f4</font>07】轮序方式的按键应用
STM32F4半生不熟的DMA/USART发送数据
半生:是因为发出了数据 不熟:是因为不太理解。只是用了简单的几个东西 配置DMA操作步骤如下: 1、打开时钟。 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); 2、配置DMA数据结构 有几点明确的:通过USART1发送数据,ST的F4参考手册里边可以找打USART1说对应的通道:DMA2-Channel4-Stream7。 数据传递方向是Memory2Peripheral。即内存到外设。 不使用FIFO,要传输的数据位于数组usart_tx_buf 中,USART1发送数据寄存器的地址是:USART1_BASE+0x04,内存和
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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