之前发了一个帖子求助串口打印,因为我是一直用的MDK+标准库,最近刚好学CUBE+HAL库那一套,所以刚好拿这块板子练手,这两天抽时间终于搞定了,下面我详细写一下过程:
先感谢一下在帖子里面帮助和鼓励我的小伙伴们
我用cubeMX里面的NUCLEO模板直接生成了CUBEIDE工程,之前试过L552ZE库里面的template,发现不好用,我将工程移出后文件路径不对,如果使用单个的sample例程,后面添加又太麻烦,就直接用了MX里面的工程直接生成,将用到的基础IO都配置好了,但是都没初始化,初始化代码在main.c和stm32l5xx_hal_msp.c这两个文件里, 我用的是USART2,PD5和PD6两只引脚
图1
上面图里面就是main.c初始化的一些函数,工程默认的
图3
图2和图3是stm32l5xx_hal_msp.c中的初始化函数,讲一点,在我们初始化main函数的时候,这里面的 函数是不需要放在main.c里面的,因为main.c里面的初始化函数会调用这里面的 然后我以为初始化之后,在main函数里面重写fput函数,main循环里面加入printf就可以打印了,搞了好久还是不行,最后没办法参照原子哥的F4的hal库例程,发现串口根本就没用初始化
上图中我画红色的部分是自己添加的,就是说mx生成的工程并没有帮我们初始化,这是关键的一点,然后我们还要添加两个函数void USART2_IRQHandler(void)和void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart),串口2的中断函数和接收回调函数,推荐大家看一下这篇文章,
讲的非常清楚【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解, 但是他里面有点不适用在我这边,我后面讲--就是重写fput这个函数
然后再结合原子哥的例程,我贴上关键部分的代码
图5和图6是中断函数里面的两段,到此为止,我以为可以了,但是还是不行,又搞了好久,关于重写fput这段函数,我参照了上面链接那位兄弟写的和原子哥里面的例程,发现都不行,
但是我用这个函数: HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); /发现我可以发送数据,板子也能讲数据返回,说明问题出现在了fput这段上面
首先记得要在main函数里先 #include "stdio.h",你的fput函数放在哪个.c文件里面,就要在哪个文件里面加上这句
上部分是原子哥的代码,我改了
//// while((USART2->ISR&0X40)==0);
//// USART2->RDR = (uint8_t) ch;这两段中的红色寄存器,我还没看仔细,具体对不对暂时还不清楚,大家可以帮忙看一下,这两个寄存器到底什么意思,该怎么用才对
最后我又找网上关于fput这段函数,找到一个能用的
//#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
//#else
// #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
//#endif
//
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,0xFFFF);//阻塞方式打印
return ch;
}
绿色部分是我注释掉的,效果没什么变化,终于可以打印出来了
很开心,搞了几天终于出结果了,而且还熟悉了cube和hal库,感觉越来越上手了,后面会加上ADC采集我做的一块荧光检测电路中的ad值
最后还有一个疑问,上面这个printf打印不了中文,中文出来是乱码,不知道怎么回事,希望各位兄弟大神帮忙指导指导,是否有错误和需要改进的地方,
谢谢大家,感谢各位伙伴们的帮助和鼓励
Print打印不出中文应该是编码的问题,IDE编码改一下。
引用: w494143467 发表于 2021-1-10 10:32 Print打印不出中文应该是编码的问题,IDE编码改一下。
ok,我今天再搞一搞