123
123 - 认证专家
This guy hasn't written anything yet

注册于 1 year ago

回答
260
文章
4
关注者
4

@xquery 谢谢反馈,目前studio默认只烧写elf,图示位置应该是说输出文件可以选择输出为hex。
选择多格式烧录的功能暂时还未支持,后续根据用户这里配置烧写对应格式文件。

如果更新完SystemClock_Config没有变化,应该是cubemx的时钟部分没有改变,那么直接用就行,如果有改变是建议覆盖掉的。

  1. 增加抗干扰能力:软件上 检测下是不是串口没配置上拉,官网关于串口的配置目前都统一刷成了pull_up模式。硬件上 也可以增加上拉提升抗干扰性能。
  2. (该方法仅用于测试) 中断处理部分:可以试试这样,先检测你遇到的错误,先清除一下错误标志再进行继续操作或者直接返回(下面示例是清除错误标志后继续执行)。
static void uart_isr(struct rt_serial_device *serial)
{
    struct stm32_uart *uart;

    RT_ASSERT(serial != RT_NULL);
    uart = rt_container_of(serial, struct stm32_uart, serial);
    if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_ORE) != RESET)
    {
        LOG_E("(%s) serial device Overrun error!", serial->parent.parent.name);
        __HAL_UART_CLEAR_OREFLAG(&uart->handle);
    }
    if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_NE) != RESET)
    {
        LOG_E("(%s) serial device Noise error!", serial->parent.parent.name);
        __HAL_UART_CLEAR_NEFLAG(&uart->handle);
    }
    if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_FE) != RESET)
    {
        LOG_E("(%s) serial device Framing error!", serial->parent.parent.name);
        __HAL_UART_CLEAR_FEFLAG(&uart->handle);
    }
    if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_PE) != RESET)
    {
        LOG_E("(%s) serial device Parity error!", serial->parent.parent.name);
        __HAL_UART_CLEAR_PEFLAG(&uart->handle);
    }

    if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&
            (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_RXNE) != RESET))
    {
... ...

去新塘官网对应的pack包位置下载。而且好像高版本的mdk不支持arm9的开发了吧,得用低版本的能用。

@yc961213911 你的需求先不说啊,实现这样需求的方法倒是有,需要有一个 数字字符与整数 转换的函数,
看下图,一个是字符转数字,一个是数字转字符,应该能解决你的问题
image.png

@RongLiu 先表一表楼主,可以的,很细心。👍

首先这个不叫溢出,这个叫回环,环形buffer的回环属于正常操作。(而溢出是致命的错误,溢出有标准的解释和处理手段,不要乱起名字)。

然后是这个 情况1,分析的很有道理,write_index 回环的时候,read_index 不一定会触发回环,这个时候如果强行将 read_mirror 取反,则会导致 环形缓冲区的数据长度清空,而不是满。

最后是关于楼主修改的部分是有问题的,应该这样改

if (length > space_length)
{
    if(rb->write_index read_index)  /* 情况1 */
        rb->read_mirror = ~rb->read_mirror;

    rb->read_index = rb->write_index;      /* 情况2 */
}

应该充分考虑当length > space_length时候的情况,也就是情况1和情况2,显然楼主分析完之后,代码没有考虑情况2.

另外提供一份测试代码,方便测试:

void test(void)
{
    rt_uint8_t ring_buffer[64];  /* ringbuffer的缓冲区*/
    rt_memset(ring_buffer, -1, 64);   /* 先格式化为0xff */

    struct rt_ringbuffer test_rb;
    rt_ringbuffer_init(&test_rb, ring_buffer, 64);
    
    
    rt_uint8_t write_buffer[40], read_buffer[40]; /* 读buffer缓冲区和写buffer缓冲区 */
    rt_memset(write_buffer, 0, 40);
    rt_ringbuffer_put(&test_rb, write_buffer, 40);
    rt_ringbuffer_get(&test_rb, read_buffer, 5);
    
    rt_kprintf("rt_ringbuffer_data_len = [%d]\n", rt_ringbuffer_data_len(&test_rb));

    rt_uint8_t write_second_buffer[34];
    rt_memset(write_second_buffer, 1, 40);
    rt_ringbuffer_put_force(&test_rb, write_second_buffer, 34);
    rt_kprintf("rt_ringbuffer_data_len = [%d]\n", rt_ringbuffer_data_len(&test_rb));
}

image.png
studio找gcc的目录下的启动文件

@zssauu 如果是导入的lib库,你肯定是跳转不过去的啊,最多能看到声明。

应该是你CUBEMX没有使能SRAM吧,需要配置完就有了。不过也有简单的操作,就是把 stm32f7xx_hal_conf.h 里面的 HAL_SRAM_MODULE_ENABLED 给使能,

image.png

注释写的很清楚呀,让你把 OS_TICK_CFG() 放进去就行啦。😀

发布
问题