硬汉嵌入式论坛

 找回密码
 立即注册
查看: 845|回复: 5
收起左侧

[有问必答] UART_FIFO移植问题

[复制链接]

6

主题

21

回帖

39

积分

新手上路

积分
39
发表于 2022-5-4 21:56:18 | 显示全部楼层 |阅读模式
本帖最后由 PYL4869 于 2022-5-4 21:59 编辑

小白提问,我在移植UART_FIFO的时候,出现了这个问题,(我使用cubemx的生成,只是初始化SYS的(Serial Wire)和 RCC的(Crystal/Ceramic Resonator))    然后再导入了stm32f4xx_hal_uart.c这个头文件  ,再在stm32f4xx_hal_conf.h 中取消了 HAL_UART_MODULE_ENABLED 的注释  

屏幕截图 2022-05-04 213007.png 屏幕截图 2022-05-04 212918.png 出现了这个错误   




请问怎么解决


如下是我在bsp_uart_fifo.c的配置


屏幕截图 2022-05-04 215802.png
[C] 纯文本查看 复制代码
#include "bsp.h"  

#define UART_GPIO_CLK_ALLENABLE(){\
        __HAL_RCC_GPIOA_CLK_ENABLE();\
        __HAL_RCC_GPIOB_CLK_ENABLE();\
        __HAL_RCC_GPIOG_CLK_ENABLE();\
}

#define UART_UART1_UART6_CLK_ALLENABLE(){\
        __HAL_RCC_USART1_CLK_ENABLE();\
        __HAL_RCC_USART6_CLK_ENABLE();\
}

UART_HandleTypeDef  huart_x;
static void Bsp_Uart_X_Mode_Init(USART_TypeDef *Instance,  uint32_t BaudRate, uint32_t Parity, uint32_t Mode);
static void Bsp_Uart_Gpio_Mode_Init(void);


static void Bsp_Uart_Fifo_Init_Mode(void)
{
   Bsp_Uart_Gpio_Mode_Init();
   Bsp_Uart_X_Mode_Init( USART1, 115200 , UART_PARITY_NONE , UART_MODE_TX_RX ); 
}


static void Bsp_Uart_Fifo_Init_Variable(void)
{

}

static void Bsp_Uart_X_Mode_Init(USART_TypeDef *Instance,  uint32_t BaudRate, uint32_t Parity, uint32_t Mode)
{ 

  
  UART_UART1_UART6_CLK_ALLENABLE();

  huart_x.Instance = Instance;
  huart_x.Init.BaudRate = BaudRate;
  huart_x.Init.WordLength = UART_WORDLENGTH_8B;
  huart_x.Init.StopBits = UART_STOPBITS_1;
  huart_x.Init.Parity = Parity;
  huart_x.Init.Mode = Mode;
  huart_x.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart_x.Init.OverSampling = UART_OVERSAMPLING_16;
	
  if (HAL_UART_Init(&huart_x)!= HAL_OK)
  {
    Error_Handler();
  }

}


static void Bsp_Uart_Gpio_Mode_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    UART_GPIO_CLK_ALLENABLE();
   

    GPIO_InitStruct.Pin = GPIO_PIN_7;
    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_USART1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    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_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);

    
    CLEAR_BIT(USART1->SR, USART_SR_TC);   /* 清除TC发送完成标志 */
    CLEAR_BIT(USART1->SR, USART_SR_RXNE); /* 清除RXNE接收标志    当用户使用了 TC 或者 RX 中断后,就会进入一次中断服务程序*/	
    // USART_CR1_PEIE | USART_CR1_RXNEIE
    SET_BIT(USART1->CR1, USART_CR1_RXNEIE);	/* 使能PE. RX接受中断 ,使能串口的发送空中断。*/

}


void Bsp_Uart_Fifo_Init(void)
{   
    Bsp_Uart_Fifo_Init_Variable();
    Bsp_Uart_Fifo_Init_Mode();
}





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107338
QQ
发表于 2022-5-5 08:43:25 | 显示全部楼层
image.png
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-5-5 10:34:13 | 显示全部楼层

是的,我尝试把这一段直接放进去v5-006串口与pc通信的main.c里,会出现相类似的错误(使用AC6 编译)
[C] 纯文本查看 复制代码
uint8_t Tx_str1[] = "hello world!\r\n";
uint8_t Tx_str2[] = "LED1 Open!\r\n";
uint8_t Tx_str3[] = "LED1 Closed!\r\n";
uint8_t Rx_dat = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        if(Rx_dat == 0xa1)
        {

	    HAL_UART_Transmit(&huart1,Tx_str2,sizeof(Tx_str2),10000);

	    HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
        }
        else if(Rx_dat == 0xa2)
        {

	    HAL_UART_Transmit(&huart1,Tx_str3,sizeof(Tx_str3),10000);

	    HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
        }
    }
}


但是在cubemx生成的代码(配置了UART相关的参数)不会出现错误,你推荐我选择这种(使用cubemx只是为了生成库(获取那些.c和.h文件)(只是配置SYS的(Serial Wire)和RCC的(Crystal/Ceramic Resonator))),其他外设的配置靠自己写的方式吗),还是说参考你的手册上自己搭建环境(.c和。h)的方式
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107338
QQ
发表于 2022-5-6 09:00:00 | 显示全部楼层
PYL4869 发表于 2022-5-5 10:34
是的,我尝试把这一段直接放进去v5-006串口与pc通信的main.c里,会出现相类似的错误(使用AC6 编译)[mw_ ...

你这个设计太多不合理的地方,最明显的就是你在中断回调里面调用阻塞函数HAL_UART_Transmit
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2022-5-6 11:47:29 | 显示全部楼层
eric2013 发表于 2022-5-6 09:00
你这个设计太多不合理的地方,最明显的就是你在中断回调里面调用阻塞函数HAL_UART_Transmit

哈哈哈,确实,毕竟是新手,我也只是参考其他人的学习的,这个问题已经解决了,继续向安富莱学习,不过还是冒昧问一问,你推荐我选择这种(使用cubemx只是为了生成库(获取那些.c和.h文件)(只是配置SYS的(Serial Wire)和RCC的(Crystal/Ceramic Resonator))),其他外设的配置靠自己写的方式吗),还是说参考你的手册上自己搭建环境(.c和。h)的方式吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107338
QQ
发表于 2022-5-7 00:56:47 | 显示全部楼层
PYL4869 发表于 2022-5-6 11:47
哈哈哈,确实,毕竟是新手,我也只是参考其他人的学习的,这个问题已经解决了,继续向安富莱学习,不过还 ...

1、一个玩法是全部都CubeMX管理。
2、还有有一种是各种外设的配置,含RCC等,使用CubeMX生成,然后整理到自己做的工程里面。CubeMX最大的作用也在这里了,方便生成外设配置,但是它不能生成AD7606,DAC8563等各种外设的驱动,所以我们的玩法基本主要是这种。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-27 08:42 , Processed in 0.417379 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表