今天移植了一个通过蓝牙无线烧录程序的代码,本意是想加到我的平衡车里,使之能无线地调试PID.这个无线烧录程序的代码呢简单的说就是把单片机正常工作的内存分成两半,前面一半来放无线烧录程序的代码(作者称为bootloader),后面一半用来存放用户自己的代码,即我的平衡车代码。
然而bootloader默认使用的蓝牙串口是usart1的复用(即PA9PA10),而该io我的平衡车PCB没有引出,就想重映射到PB6和PB7(串口1重映射的引脚)。
由于嫖代码太久了,忘记怎么写代码了,而且以前学的时候是使用的标准库,根据思路cv相关代码,虽然没有报错但是一直没成功,今晚痛下决心查了正点原子的资料还有芯片手册数据手册hal库手册,很简单就解决了。
以下是试错经历:
1.(失败)直接从stm32cubemx生成的代码中复制过来usart1的初始化代码(重映射到PB6,7的),尝试了,不行。
就很奇怪,这个在原程序可以用串口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);
}
(完)