STM32 hal库USART1重映像功能调试记录

今天移植了一个通过蓝牙无线烧录程序的代码,本意是想加到我的平衡车里,使之能无线地调试PID.这个无线烧录程序的代码呢简单的说就是把单片机正常工作的内存分成两半,前面一半来放无线烧录程序的代码(作者称为bootloader),后面一半用来存放用户自己的代码,即我的平衡车代码。

然而bootloader默认使用的蓝牙串口是usart1的复用(即PA9PA10),而该io我的平衡车PCB没有引出,就想重映射到PB6和PB7(串口1重映射的引脚)。

由于嫖代码太久了,忘记怎么写代码了,而且以前学的时候是使用的标准库,根据思路cv相关代码,虽然没有报错但是一直没成功,今晚痛下决心查了正点原子的资料还有芯片手册数据手册hal库手册,很简单就解决了。

以下是试错经历:

1.(失败)直接从stm32cubemx生成的代码中复制过来usart1的初始化代码(重映射到PB6,7的),尝试了,不行。

stm32cubemx的配置
stm32cubemx的串口配置

stm32cubemx的串口GPIO配置

就很奇怪,这个在原程序可以用串口1的重映像到PB6,7的,但是移植过去,也编译成功无报错,但就不生效,有大佬知道的球球教教我。

2.(失败)基于上述的失败,我以为肯定是移植少了什么,所以!我把整个stm32cubemx生成的usart.c和usart.h移植到了bootloader的工程中,结果同上,还是不行,有大佬知道的球球教教我。

3.(成功)参考资料,写。首先捏,准备了正点原子的hal库开发手册

 

依葫芦画瓢,参考其gpio配置(usart的配置不用改,重映射只和gpio有关,串口功能正常就不用动它),查hal库手册

 写了一个USART1的重映像配置,如下:

但是捏 还是不行。我绝望了(假的)

遇事不决,CSDN,我就又查!!结果查到了一篇标准库的usart1串口重映像的博客,贴子在此:

(40条消息) STM32 端口复用&重映射(USART Remap)_MARS_Turing的博客-CSDN博客

 经过对比,发现了这个帖子,和当前的代码有一点点差别,差别在于

 纳尼,还有AFIO时钟要使能,正点原子那个定时器io重映射怎么不用,我半信半疑,然后又查了一下hal库手册,还真有

 添加上去

ok了,完成了,解决了,解放了,PB6和PB7正常实现了串口1的功能,能够通过蓝牙(串口1重映射引脚)无线烧录代码了。

 下面是关于usart1重映射的完整代码:

在main函数中:

  usart_init(115200);

usart_init()函数实现:

void usart_init(int baud_rate)
{
  GPIO_InitTypeDef gpio;
  
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_USART1_CLK_ENABLE();
  __HAL_RCC_AFIO_CLK_ENABLE () ;

  __HAL_AFIO_REMAP_USART1_ENABLE(); 
  
  gpio.Mode = GPIO_MODE_AF_PP;
  gpio.Pin = GPIO_PIN_6;
  gpio.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &gpio);
  
  gpio.Mode = GPIO_MODE_AF_PP;
  gpio.Pin = GPIO_PIN_7;
  gpio.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &gpio);
  
  huart1.Instance = USART1;
  huart1.Init.BaudRate = baud_rate;
  huart1.Init.Mode = UART_MODE_TX_RX;
  HAL_UART_Init(&huart1);

}

(完)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32HAL中,可以通过射printf函数来实现串口输出。引用\[1\]中的代码示例展示了如何射fputc函数,以使用HAL_UART_Transmit函数将字符发送到串口。具体步骤如下: 1. 在usart.h文件中定义一个FILE结构体,用于射fputc函数。 2. 在usart.c文件中写fputc函数,将字符通过HAL_UART_Transmit函数发送到指定的串口。在示例中,使用了USART2作为示例串口。 3. 在代码中使用printf函数进行输出,可以像引用\[2\]中的示例一样,输出字符串、整数、浮点数和十六进制数据。 4. 如果需要射其他串口,可以参考引用\[3\]中的代码示例,写fputc函数并使用相应的串口。 需要注意的是,射printf函数需要在初始化串口之前完成,以确保射生效。另外,还需要在代码中包含相应的头文件和定义相关的变量。 #### 引用[.reference_title] - *1* [printf在stm32中的串口射](https://blog.csdn.net/m0_64072315/article/details/130496363)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32的HAL开发系列 - 串口定向printf](https://blog.csdn.net/sorcererr/article/details/128689613)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值