Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
串口
STM32L0
STM32L0 drv_usart.c的BUG及解决【已解决】
发布于 2020-08-18 17:25:28 浏览:2031
订阅该版
[tocm] ### **操作过程** 1. 使用RT-studio基于芯片 **STM32L071RB** 建立工程 2. 选择 **lpuart1** 作为输出口, **TXD=pc1 RXD=pc0** 3. 编译,没有错,下载,没有输出。 据官方[文档](https://www.rt-thread.org/document/site/rtthread-studio/drivers/uart/v4.0.2/rtthread-studio-uart-v4.0.2/)介绍,使用完整版的rtt是不用修改就可以使用uart等资源的。 ### **先说两个问题:** 1、不支持 **TXD=pc1 RXD=pc0** 2、串口号 **uart_num** 的提取算法存在bug,没考虑到 **lpuart** 串口号提取 ### **对drv_usart.c如下做修改:** ** 1.添加数据** 在数组 **uart_afs[]** 中添加TXD=pc1 RXD=pc0的数据【注意TX在前,与后头算法有关】 ``` { .pin_index = GET_PIN(C, 1), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 6}}, { .pin_index = GET_PIN(C, 0), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 6}}, ``` **2.修改串口号提取算法** 去除原始算法 **uart_num = config->name[4] - '0';** 使用以下代码替代,**【完整函数请转到1楼】** ``` uart_num = config->name[rt_strlen(config->name)-1] - '0'; ``` 或 ``` if(config->name[0]=='u') { uart_num = config->name[4] - '0'; } else { uart_num = config->name[6] - '0'; } ``` ### 对数组数据进行一下说明: **一、为什么是TX在前面呢?** 因为后面的for循环里面 **index = index + 2** 的方式去找tx引脚 **二、.uart_num是什么?** 其实我也不知道,猜的,肯定是串口几呗,我们的是 **lpuart1**,那就是1咯 **三、.af_num = 6 是为什么呢?** 使用cubemx生成代码,看初始化代码,宏定义 **GPIO_AF6_LPUART1** ,不用转到定义了,AFn就n啦 **四、串口号提取** 原始代码用了**config->name[4]**,对于uartx的串口是有效的,但是对于lp打头的就不对了。解决的方法就是把那个数字找出来,方法很多,直接转成数字,取最后一个字节,是不是又发现了就两种串口呀,不是4就是6呀,判断一下也可以。
查看更多
2
个回答
默认排序
按发布时间排序
wlof
2020-08-18
这个家伙不懒,什么也没写
在stm32L071RB上测试通过,其他的板子没有测试 ### 修改后的函数: ``` static rt_err_t stm32_gpio_configure(struct stm32_uart_config *config) { #define UART_IS_TX (1U<<7) #define UART_IS_RX (0U) rt_uint16_t tx_pin_num = 0; int index = 0, tx_af_num = 0, rx_af_num = 0; uint8_t uart_num = 0; GPIO_TypeDef *tx_port; GPIO_TypeDef *rx_port; uint16_t tx_pin; uint16_t rx_pin; get_pin_by_name(config->rx_pin_name, &rx_port, &rx_pin); get_pin_by_name(config->tx_pin_name, &tx_port, &tx_pin); struct gpio_uart_af { /* index get by GET_PIN */ uint16_t pin_index; struct { /* when is TX the bit7 is 1, bit6-bit0 is uart number (1-8) */ uint8_t uart_num; uint8_t af_num; } afs[1]; }; static const struct gpio_uart_af uart_afs[] = { { .pin_index = GET_PIN(A, 0), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(A, 1), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(A, 2), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 3), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 9), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 4}}, { .pin_index = GET_PIN(A, 10), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 4}}, { .pin_index = GET_PIN(A, 14), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 4}}, { .pin_index = GET_PIN(A, 15), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 4}}, { .pin_index = GET_PIN(B, 3), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 6}}, { .pin_index = GET_PIN(B, 4), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, { .pin_index = GET_PIN(B, 6), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 0}}, { .pin_index = GET_PIN(B, 7), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 0}}, { .pin_index = GET_PIN(C, 1), .afs[0] = {.uart_num = UART_IS_TX|1, .af_num = 6}}, { .pin_index = GET_PIN(C, 0), .afs[0] = {.uart_num = UART_IS_RX|1, .af_num = 6}}, { .pin_index = GET_PIN(C, 10), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(C, 11), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(C, 12), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 2}}, #ifdef GPIOD { .pin_index = GET_PIN(D, 2), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, { .pin_index = GET_PIN(D, 5), .afs[0] = {.uart_num = UART_IS_TX|2, .af_num = 0}}, { .pin_index = GET_PIN(D, 6), .afs[0] = {.uart_num = UART_IS_RX|2, .af_num = 0}}, #endif #ifdef GPIOE { .pin_index = GET_PIN(E, 8), .afs[0] = {.uart_num = UART_IS_TX|4, .af_num = 6}}, { .pin_index = GET_PIN(E, 9), .afs[0] = {.uart_num = UART_IS_RX|4, .af_num = 6}}, { .pin_index = GET_PIN(E, 10), .afs[0] = {.uart_num = UART_IS_TX|5, .af_num = 6}}, { .pin_index = GET_PIN(E, 11), .afs[0] = {.uart_num = UART_IS_RX|5, .af_num = 6}}, #endif }; /* get tx/rx pin index */ uart_num = config->name[rt_strlen(config->name)-1] - '0'; tx_pin_num = stm32_get_pin(tx_port, tx_pin); for (index = 0; index < sizeof(uart_afs) / sizeof(struct gpio_uart_af); index = index + 2) { if (uart_afs[index].pin_index == tx_pin_num) { if(uart_afs[index].afs[0].uart_num == (uart_num|UART_IS_TX)) { tx_af_num = uart_afs[index].afs[0].af_num; rx_af_num = uart_afs[index + 1].afs[0].af_num; } } } /* gpio Init */ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* gpio ports clock enable */ stm32_gpio_clk_enable(tx_port); if (tx_port != rx_port) { stm32_gpio_clk_enable(rx_port); } /* rx pin initialize */ GPIO_InitStruct.Pin = tx_pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; #if defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) GPIO_InitStruct.Alternate = tx_af_num; #endif HAL_GPIO_Init(tx_port, &GPIO_InitStruct); /* rx pin initialize */ GPIO_InitStruct.Pin = rx_pin; #if defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) GPIO_InitStruct.Alternate = rx_af_num; #endif HAL_GPIO_Init(rx_port, &GPIO_InitStruct); return RT_EOK; } ```
fengye
2023-05-10
这家伙很懒,什么也没写!
老铁你用的RT Threaad用的哪个版本,我也遇到了同样的问题,但是我的压根就没有你上面描述的代码段uart_afs[]组直接没有!!!
撰写答案
登录
注册新账号
关注者
0
被浏览
2k
关于作者
wlof
这个家伙不懒,什么也没写
提问
24
回答
64
被采纳
0
关注TA
发私信
相关问题
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
利用stm32f427实现usb转串口,电脑端什么也没有识别到
4
finsh 控制台 适配 RS 485请大神指点????
5
uart_sample.c 中,读串口设备时偏移量pos要设置为-1而不是0?
6
【结贴】at_device软件包中对串口接收数据缺少判断导致数据接收异常
7
串口无法接受数据,但可以发送
8
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
9
串口接收使用方式问题
10
雅特力FINSH问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部