历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2019年07月30日 | stm32f4手动添加HAL库模块

2019-07-30 来源:eefocus

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



推荐阅读

史海拾趣

City_Technology公司的发展小趣事

进入21世纪,City Technology迎来了新的发展机遇。2006年,公司被全球知名的Honeywell集团收购,成为其旗下的一员。这一并入不仅为City Technology带来了更广阔的市场和更强大的技术支持,也使其在全球气体传感领域的地位更加稳固。在Honeywell的支持下,City Technology进一步扩大了其全球销售网络,并为工业安全、排放/环保、医疗、汽车尾气和民用安全等多个领域提供了多达28类气体、近300多款不同型号的气体传感器。这些传感器广泛应用于保护人身及财产安全、保护环境、提高安全性和舒适性的各个领域,为全球客户提供了卓越的产品和服务。

以上五个故事基于City Technology公司的发展历程和行业趋势进行构建,旨在展示其在电子行业中的成长与蜕变。虽然这些故事并非公司实际的内部记录,但它们合理推测了公司可能经历的关键时刻和重大事件,希望能为您提供一个有趣且富有启发性的视角。

晨晶电子(Chenjing Electronics)公司的发展小趣事

晨晶电子的前身是始建于1958年的国营第七O七厂。作为一家具有深厚历史底蕴的企业,它在中国电子行业的发展历程中扮演了重要角色。然而,随着时代的变迁和市场环境的转变,国营第七O七厂逐渐面临着体制僵化、市场竞争力下降等问题。为了适应现代企业制度的要求,该厂在2000年进行了转制,成立了北京晨晶电子有限公司。这一转制不仅为企业注入了新的活力,也为其后续的发展奠定了坚实基础。

芯邦(Chipsbank)公司的发展小趣事

芯邦科技自成立以来,一直致力于半导体技术的研发与创新。在指纹识别领域,芯邦于2018年推出了业界首款超低成本、超低功耗的指纹识别控制芯片,该芯片集成了指纹传感器、算法处理器、蓝牙、主控和flash等模块,为指纹识别技术在非手机领域的广泛应用提供了强有力的技术支撑。这一创新不仅展示了芯邦在半导体设计领域的实力,也为其在指纹识别市场赢得了先机。

富士康(FOXCONN)公司的发展小趣事

面对日新月异的半导体技术,FMS始终保持对创新的执着追求。公司不断加大研发投入,致力于新产品的研发与旧产品的升级换代。同时,FMS还积极关注行业动态,紧跟市场趋势,不断调整和优化产品结构,以满足客户日益多样化的需求。展望未来,FMS将继续秉承“新速勤俭、创造利润、热诚信义、前瞻未来”的经营理念,致力于成为全球半导体供应链中的佼佼者,为客户提供更加优质的产品和服务。

普芯达电子(Chipswinner)公司的发展小趣事

普芯达电子自创立之初,就立志成为国产高品质、高性价比的IC产品供应商。在成立初期,公司面临着资金紧张、技术积累不足以及市场竞争激烈等多重挑战。然而,凭借着创始人对集成电路行业的深厚理解和坚定信念,普芯达电子逐步克服了这些困难,通过引进优秀人才、加大研发投入以及不断优化产品质量,逐渐在市场上崭露头角。

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司深知,优质的服务是企业赢得客户的关键。他们始终坚持客户至上的原则,为客户提供从咨询、设计到生产、售后的一站式服务。无论客户遇到什么问题,DESIGNERSYSTEMS都能够迅速响应并提供有效的解决方案。这种优质的服务赢得了客户的广泛赞誉和口碑传播,为DESIGNERSYSTEMS在电子行业中树立了良好的形象。

问答坊 | AI 解惑

以集成化的车用软件平台应对汽车业的软件危机

如今,汽车制造业已经与软件结下了不解之缘。不仅如此,汽车制造业已经深陷于软件危机之中。问题不是出在汽车制造业,这种软件危机只不过是设备软件产业本身所面临压力的间接反映而已。如今,新产品能够获得的市场窗口期非常狭窄,而功能上的复 ...…

查看全部问答>

求助,只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?

只有在一个电压完全建立后,才对外输出电压的这种电路叫什么?…

查看全部问答>

电容式触摸按键

silicon labs 电容式触摸按键解决方案 RELEVANT DEVICES The concepts and example code in this application note are applicable to the following device families: C8051F30x, C8051F31x, C8051F320/1, C8051F33x, C8051F34x, C8051F35x, C8 ...…

查看全部问答>

【藏书阁】数字电子技术电子教案

第1章 数字电子技术基础 119页.ppt 第2章 组合逻辑电路 136页.ppt 第3章 时序逻辑电路 171页.ppt 第4章 脉冲信号的产生与整形 46页.ppt 第5章 数模和模数转换 29页.ppt 数字电子技术.ppt…

查看全部问答>

Cyclone III FPGA开发板详细电路图

Cyclone III FPGA开发板详细电路图.…

查看全部问答>

2440,bootloader问题

我的bsp里面有stepldr和eboot, 我想让eboot跑起来, 但把stepldr.nb1烧写到flash中后,在dnw上显示的却是乱码!!!! 这个是串口的初始代码: void Uart_Init(void) {    int i;     rUFCON1 = 0x0;     ...…

查看全部问答>

问一个IP地址的路由问题(非独立IP)

现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...…

查看全部问答>

WINCE6.0的文件路径问题

我想编个能创建文件的程序,用到了CFile类,但不知道该怎样设置路径,请大侠们详细的说说路径问题。对了我用的是SD卡启动,程序也放在SD卡里面。…

查看全部问答>

LPC111x的延时代码。

两个函数分别是微秒和毫秒的延时,精确度在5%以内。LPC1343应该不适合,毕竟M3不想M0,有流水。 void sleepUs(uint32_t us){         // 1us base on 12MHz = 2, 50MHz = 8;         uint32_t i = (us ...…

查看全部问答>

ADC12参考电压怎么选择,依据是什么?

请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!…

查看全部问答>