现在我通过CubeMX生成了STM32H743ZITx的RT-Thread工程。
然后开启了如下的功能:
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Basic Configuration
// <o>Maximal level of thread priority <8-256>
// <i>Default: 32
#define RT_THREAD_PRIORITY_MAX 32
// <o>OS tick per second
// <i>Default: 1000 (1ms)
#define RT_TICK_PER_SECOND 1000
// <o>Alignment size for CPU architecture data access
// <i>Default: 4
#define RT_ALIGN_SIZE 4
// <o>the max length of object name<2-16>
// <i>Default: 8
#define RT_NAME_MAX 8
// <c1>Using RT-Thread components initialization
// <i>Using RT-Thread components initialization
#define RT_USING_COMPONENTS_INIT
// </c>
// <c1>Using user main
// <i>Using user main
#define RT_USING_USER_MAIN
// </c>
// <o>the size of main thread<1-4086>
// <i>Default: 512
#define RT_MAIN_THREAD_STACK_SIZE 1024
// </h>
// <h>Debug Configuration
// <c1>enable kernel debug configuration
// <i>Default: enable kernel debug configuration
#define RT_DEBUG
// </c>
// <o>enable components initialization debug configuration<0-1>
// <i>Default: 0
#define RT_DEBUG_INIT 1
// <c1>thread stack over flow detect
// <i> Diable Thread stack over flow detect
#define RT_USING_OVERFLOW_CHECK
// </c>
// </h>
// <h>Hook Configuration
// <c1>using hook
// <i>using hook
#define RT_USING_HOOK
// </c>
// <c1>using idle hook
// <i>using idle hook
#define RT_USING_IDLE_HOOK
// </c>
// </h>
// <h>Software timers Configuration
// <c1> Enables user timers
// <i> Enables user timers
#define RT_USING_TIMER_SOFT
// </c>
// <o>The priority level of timer thread <0-31>
// <i>Default: 4
#define RT_TIMER_THREAD_PRIO 4
// <o>The stack size of timer thread <0-8192>
// <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE 512
// </h>
// <h>IPC(Inter-process communication) Configuration
// <c1>Using Semaphore
// <i>Using Semaphore
#define RT_USING_SEMAPHORE
// </c>
// <c1>Using Mutex
// <i>Using Mutex
#define RT_USING_MUTEX
// </c>
// <c1>Using Event
// <i>Using Event
#define RT_USING_EVENT
// </c>
// <c1>Using MailBox
// <i>Using MailBox
#define RT_USING_MAILBOX
// </c>
// <c1>Using Message Queue
// <i>Using Message Queue
#define RT_USING_MESSAGEQUEUE
// </c>
// </h>
// <h>Memory Management Configuration
// <c1>Using Mempool Management
// <i>Using Mempool Management
#define RT_USING_MEMPOOL
// </c>
// <c1>Dynamic Heap Management
// <i>Dynamic Heap Management
#define RT_USING_HEAP
// </c>
// <c1>using small memory
// <i>using small memory
#define RT_USING_SMALL_MEM
// </c>
// <c1>using tiny size of memory
// <i>using tiny size of memory
#define RT_USING_TINY_SIZE
// </c>
// </h>
// <h>Console Configuration
// <c1>Using console
// <i>Using console
#define RT_USING_CONSOLE
// </c>
// <o>the buffer size of console <1-1024>
// <i>the buffer size of console
// <i>Default: 128 (128Byte)
#define RT_CONSOLEBUF_SIZE 128
// </h>
// <h>Enable FinSH Configuration
// <c1>include shell config
// <i> Select this choice if you using FinSH
#include "finsh_config.h"
// </c>
// </h>
// <h>Device Configuration
// <c1>using device framework
// <i>using device framework
#define RT_USING_DEVICE
// </c>
// </h>
// <<< end of configuration section >>>
#endif
系统进入的时候可以正常进入MSH命令行,但是当输入中文字符或使用上下左右键的时候,命令行卡死,无法输入或输出数据。但是程序我通过打断点发现没有挂掉。这个是什么原因啊?
同时,我发现,生成的工程中没有如下函数:
static int stm32_getc(struct rt_serial_device *serial)
{
int ch;
struct stm32_uart *uart;
RT_ASSERT(serial != RT_NULL);
uart = rt_container_of(serial, struct stm32_uart, serial);
ch = -1;
if (USART_GetITStatus(uart->handleInstance, USART_IT_RXNE) != RESET)
{
#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \
|| defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) \
|| defined(SOC_SERIES_STM32G4)
ch = uart->config->Instance->RDR & 0xff;
#else
ch = uart->config->Instance->DR & 0xff;
#endif
}
return ch;
}
但是系统可以正常进入命令行。代码因为涉及到一些加密的东西,所以不能全部上传。
RT-Thread的版本是RT-Thread 3.1.5,有哪位大佬可以帮忙解决一下该问题吗?万分感谢!!!!
后来发现是串口出现了ORE情况导致的,请问下这个ORE问题怎么进行解决呢?目前我的解决方法是在这个函数中进行了如下的修改:
#ifdef RT_USING_FINSH
char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
//TODO
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE) != RESET)
{
rt_kprintf("UART ORE error occurred.Operation not permitted,please retry....\n");
__HAL_UART_CLEAR_OREFLAG(&UartHandle);
}
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET)
{
ch = UartHandle.Instance->RDR & 0xff;
}
else
{
rt_thread_mdelay(10);
}
return ch;
}
这样的话,即使输入出现错误也能够及时清除标志位,让后面的接收正常进行。
但是我试了一下,在中断中使用该清除标志位的操作,连中断都进不去,没有办法清除该标志位。
请问哪位大佬能够有更好的解决方法?小弟先拜为敬。