wlof
wlof
这个家伙不懒,什么也没写

注册于 3 years ago

回答
3
文章
5
关注者
1

在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;
}

找了很多资料,东搞西搞,5花8门,又是调vtor的,又是设置mdk的,改sct文件的,其实都没有搞对地方,浪费了很多时间,怎么调都不成,干脆自己找找吧。

(tid != RT_NULL) assertion failed at function:rt_application_init, line number:200

对这个代码进行跟踪时,分配内存的时候出现问题,即rt_application_init-->rt_thread_create-->rt_object_allocate-->rt_malloc,这里出错,内存管理发现没有可用内存了,OMG,怎么可能呢,刚启动呀。

于是怀疑肯定是,heap实始化出现问题了,导致里面的内存被误认为是全部用光啦。

rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END);

再看一下这两是什么鬼,乖乖,就是它的问题,老的BSP中可能没有对HEAP_BEGIN进行处理,原始的值是直接写死的,乖乖,中断向量还要偏移呢,这个写死了,是不是会出问题?太高深的东西俺可不知道,反正一想,觉得这里有问题。
记得Nano版本的heap是数组搞的,后来在哪个教程中看到,它没有数组,用的是以下方式:

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; 
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END                       STM32_SRAM1_END
#endif

就这段代码,搞进去,内存分配正常。

APP设置

带bootloader的App设置,我是直接在mdk上完成设置的,实测试,可以运行。
mdk1.png
注意了,这里的设置,网上很多资料都说用要sct文件来搞,我也不知道为什么,刚开始也是仿着去搞的,可以执行。后来干脆MDK设置界面上完成的就得了,因为我发现,界面设置,和自己写的差不多。这里的--kepp指令是老版本中的rtt中搞过来的,实际上可以不要。
mdk2.png
这个代码就是重点,没有这个代码,程序跑到heapinit之后,一申请内存就挂掉。
mdk3.png
其中

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#if defined(__CC_ARM) || defined(__CLANG_ARM)
extern int Image$$RW_IRAM1$$ZI$$Limit; 
#define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
#endif
#define HEAP_END                       STM32_SRAM1_END
#endif

这段代码很重要!!!

搜狗浏览器的问题,但是F1是可以生成的,很奇怪。

aozima 发表于 2020-5-24 09:55
CTRL + F5 刷新一下,你头像已换成功了。


可以了,谢谢:D

aozima 发表于 2020-5-24 09:28
从这里登录后 https://www.rt-thread.org/account/ 可以上传头像,然后论坛重新登录一下,头像就更新了,此 ...


可以上传头像啦,试一下,有没有变头像

小qya 发表于 2020-5-15 13:25
你好“复制文件【这些文件都在下载的源码包里面,手动复制出来,放到工程文件里】”在哪里下载 ...


\RT-ThreadStudio\download\rt-thread-sdk\rt-thread-src,这里面有你的源码包,如果想自己手动下载可以到https://www.rt-thread.org/page/download.html

kid 发表于 2020-5-7 10:56
帖子不错, 成功从0复现工程, 灰常感谢, 有几点不太一样 1 fal_flash_sfud_port.c 内容, 我不能全删, 在末尾 ...


不管是什么方法,功能实现了,搞出来了,它就是管用的方法。
提到的复制文件,其实可以直接手动添加到工程里实现。
为什么直接复制文件呢,我们希望当变更工程,如添加新组件等,那些文件都会被添加到工程中来。当我们不主动去写脚本的时候,就可以通过已有的目录进行操作,那些目录下都会有脚本,在生成工程时,会自动添加文件夹下的文件或是指定的文件。

yeshenmeng 发表于 2020-3-26 17:40
我也遇到同样的问题,参考论坛里面的代码增加了对ALARM的处理后就可以了,如附件
...


谢谢,我的方法和你的差不多,嘿嘿

cookie2g 发表于 2020-3-25 14:47
问题解决了,需要在drv_spi.c中注册下SPI驱动


不好意思,好久没有上来了,是的,所有设备在使用之前都要进行注册,注册后,在使用时,就可以自动检测设备状态,完成自动初始化、打开等之类的工作了。

sync 发表于 2020-3-23 09:19
U8G2不熟悉没用过,中文这快,要保证C代码和字库的编码统一,你C文件是用UTF-8格式的话,编译器自动就按照U ...


恩,谢谢。U8G2的字库没有看懂,和以前我们自己做的方法不太一样,以前是以汉字作为ID,然后是点阵编码,因此,只要字库和使用文件的编码一致就可以。

回到
顶部

发布
问题

投诉
建议