2023.09.07
问题解决,主要原因:对CubeMX不够熟悉,自行添加的gpio重新初始化了io导致首字符乱码。
其他细节,详见 #21楼
因为是第一次用STM32CubeMX,所以,即使是以往很简单很基础的东西,都是百度搜索,跟着来。
一般一款MCU到手,我第一件事都是调通串口,方便打印调试。
这次也不例外。
比方说这个,STM32G030F6P6,USART1 为 20 和 1 脚,分别为 PB7 PB6
生成代码加入打印,先单个字符,三次打印 "def"
然而接入串口,并没有,蒙蔽。
中间,因为这是一块新板子,并且也是很久之后第一次用Cube的HAL库,所以做过一些其他的初步验证,例如gpio点亮LED,一切正常。
逐个打开 HAL的一系列初始化函数,惊讶地发现没有对 UART1_TX UART1_RX的引脚初始化——
其实一开始也怀疑,是不是HAL函数里已经有了。
但现在怀疑就是这个问题。
所以单独加入
先只处理TX脚
GPIOB的RCC时钟,HAL的初始化函数里还是有的,所以不管,只是少了io的配置而已。
然后就可以了。
当然,还有个问题,第一个字符是乱码。
检查了一下十六进制,的的确确多了一个F8
本帖最后由 辛昕 于 2023-9-7 10:48 编辑
这里,其实是两个问题
1、为什么CubeMX生成的代码,没有初始化RX TX的引脚,很奇怪。
2、第一个字符是乱码的问题。
关于这个,查了一下,试过什么改 TXE为TC——这个话说以前标准库时我也遇到过
还有什么调换 UART_GPIO初始化和UART初始化的,但这个我完全不行,因为我一改就完全发不出。
相对来说,其实我更担心第一个问题。
因为第二个问题是代码问题,是个老问题。
第一个问题却是这个工具的问题。
HAL库的问题多,这个早有耳闻,但没想到这么基础的都有问题,实在让人操心——
当然,我现在不那么纠结了,毕竟是体现自己存在的价值,如果例程拿来就能用——
当然,这也不是说 ST提供的HAL库确实混账得很。
引用: 辛昕 发表于 2023-9-3 23:17 这里,其实是两个问题 1、为什么CubeMX生成的代码,没有初始化RX TX的引脚,很奇怪。 2、第一个字符 ...
CubeMX生成的代码,是有对外设进行初始化的,在uart.c或者main.c有初始化函数,它会在初始化UART的时候调用的。
引用: damiaa 发表于 2023-9-4 14:52 应该有上面的出来,自己要加入输入输出中断允许上图的后面那句 还有回调函数:这个回调函数 ...
我上传了一个,你可以看看,我也想知道设置少了哪里才导致这个问题
引用: wangerxian 发表于 2023-9-4 14:04 CubeMX生成的代码,是有对外设进行初始化的,在uart.c或者main.c有初始化函数,它会在初始化UART的时候调 ...
main.c里是肯定没有的,只有uart1的初始化,没涉及到uart1的rx tx的gpio
至于uart1.c没这个文件。
只有hal_uart.c 和 hal_uart_ex.c
我刚才用stm32cubeide生成了一个:
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
本帖最后由 damiaa 于 2023-9-4 15:00 编辑
引用: damiaa 发表于 2023-9-4 14:58 我刚才用stm32cubeide生成了一个: static void MX_USART2_UART_Init(void) { /* USER CODE BEG ...
对啊,只有这个,莫有rx tx的gpio初始化
引用: 辛昕 发表于 2023-9-4 14:56 main.c里是肯定没有的,只有uart1的初始化,没涉及到uart1的rx tx的gpio 至于uart1.c没这个文件。 ...
工程有吗?我看看,我倒没有遇到这种问题。用的是哪个版本的CubeMX?
引用: wangerxian 发表于 2023-9-4 15:37 工程有吗?我看看,我倒没有遇到这种问题。用的是哪个版本的CubeMX?
有的,工程我发在7楼了。
版本是最新在ST官方下载的,6.9.1
辛昕 发表于 2023-9-4 16:40 刚看了,确实有,可是为什么就不行呢,真奇怪。 加了就行
是不是你生成的和你手动写的不一样?你可以对照一下。而且你的只是设置了一下这个引脚为输出,好像没设置位串口IO。可能问题不是在这里。
发送函数数据缓冲搞个全局变量数组看看如何。
本帖最后由 damiaa 于 2023-9-4 17:23 编辑引用: 秦天qintian0303 发表于 2023-9-6 16:09 CubeMX生成的代码,是有对外设进行初始化的,例如定时器你还需要自己打开
确实如此。
我对CubeMX还不够熟悉,在慢慢熟悉