gd32f303rct6,烧录后,只有在debug模式下,程序才能正常运行

[复制链接]
9481|19
 楼主| 194490490 发表于 2023-2-28 14:30 | 显示全部楼层 |阅读模式
本帖最后由 194490490 于 2023-3-3 08:25 编辑

1,芯片:gd32f303rct62,boot0和boot1都接地。
3,同样的程序stm32f103rct6没有问题。
4,实验内容:通过dma+pwm,控制pb3,输出波形,从而控制rgb灯的点亮,熄灭和颜色。但是程序烧录后,只有在debug模式下程序才能正常运行(点击魔术棒,然后点debug,再点setting不做任何设置,直接退出,程序能自动正确运行)。如果拔除jlink与开发板连线,直接重启电源或按复位都不能正确运行程序。请哪位大佬能不能帮忙看看,我写的配置程序有没有问题,帮忙分析一下原因。
5,void vLED_init(void),为驱动配置程序。
6,void vSetLED(uint8_t (*color)[3],uint16_t len),为通过dma+pwm向rgb灯芯片发送数据


问题已经解决了,配置gpio remap时不仔细一个参数配置错了,正确的是(GPIO_SWJ_SWDPENABLE_REMAP)。
      \arg        GPIO_SWJ_NONJTRST_REMAP: full SWJ(JTAG-DP + SW-DP),but without NJTRST
      \arg        GPIO_SWJ_SWDPENABLE_REMAP: JTAG-DP disabled and SW-DP enabled
      \arg        GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled and SW-DP disabled
  1. <div class="blockcode"><blockquote>/**************************************
  2. /**************************************
  3. 功能描述:LED初始化,gpio,pwm,dma
  4. 入口参数:无
  5. 返回值:无
  6. ***************************************/

  7. void vLED_init(void)
  8. {         
  9.     timer_oc_parameter_struct timer_ocintpara;
  10.     timer_parameter_struct timer_initpara;
  11.                
  12.     /* PWM_DMA_channel configuration */
  13.     dma_parameter_struct dma_data_parameter;               
  14.         
  15.     rcu_periph_clock_enable(RCU_TIMER1);//使能定时器1时钟
  16.         
  17.     rcu_periph_clock_enable(RCU_GPIOB);//使能GPIOB时钟
  18.     gpio_pin_remap_config(GPIO_TIMER1_FULL_REMAP, ENABLE);//TIMER1 full remapping
  19.     gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP, ENABLE);//下载口NJTRST引脚当做普通I/O口        
  20.     /*Configure PB3(TIMER1  CH1) as remap function*/
  21.     gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);//PB3配置成复用推挽输出
  22.         
  23.     timer_deinit(TIMER1);//复位定时器1
  24.         
  25.     /* TIMER1 configuration */
  26.     timer_initpara.prescaler            = 0;                //0
  27.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  28.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  29.     timer_initpara.period                = 150-1;                //800kHz频率  150-1
  30.     timer_initpara.clockdivision       = TIMER_CKDIV_DIV1;
  31.     timer_initpara.repetitioncounter  = 0;               
  32.     timer_init(TIMER1,&timer_initpara);
  33.                
  34.     /* CH1 configuration in PWM mode0 */
  35.     timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;
  36.     timer_ocintpara.outputnstate= TIMER_CCXN_DISABLE;
  37.     timer_ocintpara.ocpolarity    = TIMER_OC_POLARITY_HIGH;
  38.     timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;
  39.     timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;
  40.     timer_ocintpara.ocnidlestate= TIMER_OCN_IDLE_STATE_LOW;

  41.     timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);                //20230227

  42.     /* CH1 configuration in PWM mode1,duty cycle 0% */
  43.     timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,0);               
  44.     timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
  45.     timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_ENABLE);

  46.     /* enable DMA0 clock */
  47.     rcu_periph_clock_enable(RCU_DMA0);        
  48.         
  49.     /* ADC DMA_channel configuration */
  50.     dma_deinit(DMA0, DMA_CH1);
  51.    
  52.     /* initialize DMA single data mode */
  53.     dma_data_parameter.periph_addr  = (uint32_t)(&TIMER_CH1CV(TIMER1));
  54.     dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
  55.     dma_data_parameter.memory_addr  = (uint32_t)(LED_BYTE_Buffer);        
  56.     dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
  57.     dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  58.     dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
  59.     dma_data_parameter.direction    = DMA_MEMORY_TO_PERIPHERAL;
  60.     dma_data_parameter.number       = 4 * 3 * 8;  //4个RGB灯珠,3*8个数位
  61.     dma_data_parameter.priority     = DMA_PRIORITY_ULTRA_HIGH;
  62.     dma_init(DMA0, DMA_CH1, &dma_data_parameter);               

  63.     /* TIMER0 primary output enable */
  64.     timer_primary_output_config(TIMER1,ENABLE);
  65. }

  1. <div class="blockcode"><blockquote>/**************************************
  2. 功能描述:发送RGB数据
  3. 入口参数:(*color)[3]颜色RGB值   len灯珠个数
  4. 返回值:无
  5. ***************************************/
  6. void vSetLED(uint8_t (*color)[3],uint16_t len)        
  7. {
  8.         uint8_t i,j;
  9.         uint16_t memaddr;
  10.         uint16_t buffersize;
  11.         buffersize = len*24+225;                 // number of bytes needed is #LEDs * 24 bytes + 42 trailing bytes
  12.         memaddr = 0;                                // reset buffer memory index

  13.         for(j=0;j<len;j++)
  14.         {        
  15.                 for(i=0; i<8; i++) // RED data
  16.                 {
  17.                         LED_BYTE_Buffer[memaddr] = ((color[j][1]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  18.                         memaddr++;
  19.                 }
  20.                 for(i=0; i<8; i++) // GREEN
  21.                 {
  22.                         LED_BYTE_Buffer[memaddr] = ((color[j][0]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  23.                         memaddr++;
  24.                 }
  25.                 for(i=0; i<8; i++) // BLUE
  26.                 {
  27.                         LED_BYTE_Buffer[memaddr] = ((color[j][2]<<i) & 0x0080) ? TIMING_ONE:TIMING_ZERO;
  28.                         memaddr++;
  29.                 }
  30.         }        
  31.         while(memaddr < buffersize)
  32.         {
  33.            LED_BYTE_Buffer[memaddr] = 0;
  34.            memaddr++;
  35.         }
  36.                 dma_transfer_number_config(DMA0, DMA_CH1, buffersize);
  37.         
  38.                 /* enable the TIMER DMA */
  39.                 timer_dma_enable(TIMER1, TIMER_DMA_UPD);        //更新时请求DMA,注意对应的DMA0通道为CH1 -> TIMER1_UP                       
  40.                 timer_counter_value_config(TIMER1, 0x0000);
  41.                 timer_flag_clear(TIMER1,TIMER_FLAG_UP);         
  42.                 /* auto-reload preload enable */
  43.                 timer_auto_reload_shadow_enable(TIMER1);
  44.                 timer_enable(TIMER1);                                
  45.                 /* enable DMA channel */
  46.                 dma_channel_enable(DMA0, DMA_CH1);                                
  47.                 while(!dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF));
  48.                 dma_channel_disable(DMA0, DMA_CH1);        
  49.                 dma_flag_clear(DMA0, DMA_CH1, DMA_FLAG_FTF);
  50.                 timer_dma_disable(TIMER1, TIMER_DMA_UPD);        //更新时请求DMA,注意对应的DMA0通道为CH1 -> TIMER1_UP               
  51.                 timer_disable(TIMER1);
  52.                 timer_flag_clear(TIMER1,TIMER_FLAG_UP);               
  53. }





sagade 发表于 2023-2-28 21:24 来自手机 | 显示全部楼层
感觉设置或电路哪里不对吧,其实可以百度stm32只能仿真运行找找相关的问题
zchong 发表于 2023-3-1 07:03 来自手机 | 显示全部楼层
别搞那么复杂,从基本的入手,比如仅仅点个灯看看是否正常运行,排除一些基本的问题,然后再结合自己的程序看看上电过程可能出现哪些问题。
玄德 发表于 2023-3-1 09:24 | 显示全部楼层

这问题有难度。关键是没法观察现场。
想办法解决这个问题,利用 LED、显示屏,针对“不正常”的具体情况,把要查看的内容显示出来,或者指示出来,一步一步查。
这一步没问题,再查下一步。




 楼主| 194490490 发表于 2023-3-1 09:26 | 显示全部楼层
sagade 发表于 2023-2-28 21:24
感觉设置或电路哪里不对吧,其实可以百度stm32只能仿真运行找找相关的问题 ...

同样的板,只是把gd芯片换成stm芯片,stm程序能正常运行,与需求匹配。但是gd芯片上电灯不能直接启动,点不亮。但是把stm程序直接下载到gd芯片,上电自动能点亮,但是有一个灯颜色不对。所有判断电路没有问题,应该是配置程序有问题。
 楼主| 194490490 发表于 2023-3-1 09:27 | 显示全部楼层
本帖最后由 194490490 于 2023-3-1 09:30 编辑
zchong 发表于 2023-3-1 07:03
别搞那么复杂,从基本的入手,比如仅仅点个灯看看是否正常运行,排除一些基本的问题,然后再结合自己的程序 ...

这个灯是rgb自带芯片,需要用pwm+dma才能点亮。同样的板,只是把gd芯片换成stm芯片,stm程序能正常运行,与需求匹配。但是gd芯片上电灯不能直接启动,点不亮。如果把stm程序直接下载到gd芯片,上电自动能点亮,但是有一个灯颜色不对。所有判断电路没有问题,应该是配置程序有问题。如果大佬有gd芯片pwm+dma的示例程序,就给一个呗。
 楼主| 194490490 发表于 2023-3-1 11:02 | 显示全部楼层
本帖最后由 194490490 于 2023-3-1 11:25 编辑
玄德 发表于 2023-3-1 09:24
这问题有难度。关键是没法观察现场。
想办法解决这个问题,利用 LED、显示屏,针对“不正常”的具体情况, ...

大佬,这方面有没有经验,可否帮我们看看这个问题,可付费。我可以把stm和gd板都发给你,程序也给你。咋样?刚才把stm的程序改了一下,直接烧录到gd里,运行完全正常。
simon0000 发表于 2023-3-1 14:36 | 显示全部楼层
楼主是哪里的?
simon0000 发表于 2023-3-1 14:38 | 显示全部楼层
我们从st切换到gd,目前用的都正常的,中间出现过一次类似情况,模糊记得是时钟相关的,时间久了忘了,你这个情况不知道是不是差不多?
 楼主| 194490490 发表于 2023-3-1 15:40 | 显示全部楼层
 楼主| 194490490 发表于 2023-3-1 15:41 | 显示全部楼层
本帖最后由 194490490 于 2023-3-1 15:51 编辑
simon0000 发表于 2023-3-1 14:38
我们从st切换到gd,目前用的都正常的,中间出现过一次类似情况,模糊记得是时钟相关的,时间久了忘了,你这 ...

能不能回忆一下具体情况?帮我做个参考。时钟怎么个相关法?目前我还没有找到具体问题点,能想到的一个笨办法是,把stm库函数配置文件,转成寄存器配置,再一条一条用相同的gd寄存器配置替换,因为我怀疑还是哪个地方配置错了,但是这个寄存器的方法耗时,容易出错。请大佬帮我想想有没有更具体简单一点的方法解决问题。
aguijie 发表于 2023-3-1 20:38 | 显示全部楼层
只能在debug模式运行,网上搜索了下,可能有如下原因:
1. boot模式不对,boot0应该外部接地。 楼主说已经接地,最好是用表测下。
2. 程序中如果使用了printf,就需要MicroLib的支持,在MDK中需要勾选Use MicroLib
3. 没有正确烧录
aguijie 发表于 2023-3-1 20:43 | 显示全部楼层
GD32/STM32的一些差异点:
https://www.findic.com/article/96472.html
 楼主| 194490490 发表于 2023-3-1 22:25 | 显示全部楼层
aguijie 发表于 2023-3-1 20:38
只能在debug模式运行,网上搜索了下,可能有如下原因:
1. boot模式不对,boot0应该外部接地。 楼主说已经 ...

1点,用表笔测了都是0V。
2点,代码后面有把printf删除也没有用。
3点,确定烧录成功。

我用寄存器的方法把配置做得跟stm配置信息一样,也没有用。
aguijie 发表于 2023-3-1 23:03 来自手机 | 显示全部楼层
7楼说改一下就正常了?
 楼主| 194490490 发表于 2023-3-1 23:43 | 显示全部楼层
aguijie 发表于 2023-3-1 23:03
7楼说改一下就正常了?

7楼是把stm程序直接烧录到gd芯片,程序能正常运行。但是用gd自己的库函数,写的程序,运行不正常。
 楼主| 194490490 发表于 2023-3-1 23:45 | 显示全部楼层
本帖最后由 194490490 于 2023-3-1 23:50 编辑
aguijie 发表于 2023-3-1 20:43
GD32/STM32的一些差异点:
https://www.findic.com/article/96472.html

这个差异点好像对没有看到可能与我的问题点相关。头疼。
1,现在能确定的是电路肯定没有问题,因为把gd芯片换成stm芯片程序能正常跑起来。
2,我还做了一个事情,把stm配置程序用寄存器重写,然后把gd配置程序参照stm寄存器配置程序一一对应重写。stm的也能正常在gd上跑,但是用gd自己寄存器写的跑不起来。我可以确定相关对应的寄存器配置是一样的。我的判断是配置好像也没有问题,所有有点莫名其妙。。

 楼主| 194490490 发表于 2023-3-2 08:43 | 显示全部楼层
aguijie 发表于 2023-3-1 20:43
GD32/STM32的一些差异点:
https://www.findic.com/article/96472.html

我刚看到你的好友请求,但是我级别不够加不了。
aguijie 发表于 2023-3-2 09:17 | 显示全部楼层
楼主,在私信里讨论吧,方便点
 楼主| 194490490 发表于 2023-3-2 09:46 | 显示全部楼层
本帖最后由 194490490 于 2023-3-3 17:54 编辑
aguijie 发表于 2023-3-2 09:17
楼主,在私信里讨论吧,方便点

还是级别不够,发不了私信。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部