8334|40

828

帖子

8

TA的资源

一粒金砂(高级)

楼主
 

(已解决)单步调试能亮灭,run就不行 [复制链接]

 
 今天用cube配置了一个GPIO12闪灯程序,下载到板子上不起作用,后面把datalog的例程改了一下能用,多余的都注释了,一样的main,一样的hal_init,一样的 SystemClock_Config,一样的GPIO_Init,怎么就是不起作用?就是没引用sensortile.h,这个头文件也只是一些二次预定义,有漏掉什么?而且单步调试(没用HAL_Delay,用的是自己写的软延时)没问题能进入主循环亮灭,怪了,是什么问题?
  1. int main(void)
  2. {
  3.     HAL_Init();
  4.     SystemClock_Config();
  5.     MX_GPIO_Init();
  6.       
  7.   while (1)
  8.   {
  9.         HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12, GPIO_PIN_SET);
  10.         HAL_Delay(1000);
  11.        HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12, GPIO_PIN_RESET);
  12. HAL_Delay(1000);
  13. }
  14. }

  15. void SystemClock_Config(void)
  16. {
  17.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  18.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  19.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  20.   
  21.   __HAL_RCC_PWR_CLK_ENABLE();
  22.   HAL_PWR_EnableBkUpAccess();
  23.   
  24.   /* Enable the LSE Oscilator */
  25.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
  26.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  27.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   
  32.   /* Enable the CSS interrupt in case LSE signal is corrupted or not present */
  33.   HAL_RCCEx_DisableLSECSS();
  34.   
  35.   /* Enable MSI Oscillator and activate PLL with MSI as source */
  36.   RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_MSI;
  37.   RCC_OscInitStruct.MSIState            = RCC_MSI_ON;
  38.   RCC_OscInitStruct.HSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  39.   RCC_OscInitStruct.MSIClockRange       = RCC_MSIRANGE_11;
  40.   RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;
  41.   RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_MSI;
  42.   RCC_OscInitStruct.PLL.PLLM            = 6;
  43.   RCC_OscInitStruct.PLL.PLLN            = 40;
  44.   RCC_OscInitStruct.PLL.PLLP            = 7;
  45.   RCC_OscInitStruct.PLL.PLLQ            = 4;
  46.   RCC_OscInitStruct.PLL.PLLR            = 4;
  47.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  48.   {
  49.     Error_Handler();
  50.   }

  51.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  52.   PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  53.   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  54.   {
  55.     Error_Handler();
  56.   }
  57.   
  58.   /* Enable MSI Auto-calibration through LSE */
  59.   HAL_RCCEx_EnableMSIPLLMode();

  60.   /* Select MSI output as USB clock source */
  61.   PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
  62.   PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI;
  63.   HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);

  64.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2
  65.   clocks dividers */
  66.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  67.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  68.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  69.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  70.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; //2
  71.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  72.   {
  73.     Error_Handler();
  74.   }
  75. }

  76. static void MX_GPIO_Init(void)
  77. {

  78.   GPIO_InitTypeDef GPIO_InitStruct;

  79.   /* GPIO Ports Clock Enable */
  80.         __HAL_RCC_PWR_CLK_ENABLE();
  81.   HAL_PWREx_EnableVddIO2();
  82.   __GPIOG_CLK_ENABLE();
  83.   /*Configure GPIO pin Output Level */

  84.   /*Configure GPIO pin : PG12 */
  85.   GPIO_InitStruct.Pin = GPIO_PIN_12;
  86.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  87.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  88.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  89.   HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

  90. }
复制代码



2.zip

13.31 MB, 下载次数: 447

最新回复

对,这个中断不需要手动清除  详情 回复 发表于 2017-3-16 21:49
点赞 关注
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 

回复
举报

9795

帖子

24

TA的资源

版主

推荐
 
wugx 发表于 2017-3-15 23:01
但也没看到那个地方开启这个中断,这个函数又是怎么被main调用的?

通过core_cm4.h文件中的__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)函数设置的

main函数->HAL_Init();->HAL_InitTick(TICK_INT_PRIORITY);->HAL_SYSTICK_Config(SystemCoreClock/1000);->SysTick_Config(TicksNumb);


点评

哦,对,在硬件初始化里面就配置了点滴中断, [attachimg]289314[/attachimg] SysTick_Handler这个函数的地址果然在中断向量表里,它就是中断服务程序,郁闷啊,刚发现keil可以搜索所有文件,茅塞顿开啊,感谢感  详情 回复 发表于 2017-3-16 20:47

赞赏

1

查看全部赞赏

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

1305

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
也许速度太快,亮灯时间太短。加个延时试试。

点评

不是吧,一开始用的是Hal_Delay(1000),和datalog里一样,后面写了个软延时,时钟周期4Mhz的话,要看指令周期是几个时钟周期了,里外层循环都调过大小,还是不行,到底那个地方出错了,我把工程传上来大家看看  详情 回复 发表于 2017-3-12 11:32
 
 
 

回复

2774

帖子

8

TA的资源

版主

板凳
 
首先,你得把你的程序上传一下吧!我猜可能是bootloader被清除了,你可能需要刷下bootloader ,参考https://bbs.eeworld.com.cn/thread-522018-1-1.html 希望对你有帮助。如果你的是全速调试不行?那就不是bootloader的问题

点评

不是这个问题,我把工程传一个上来  详情 回复 发表于 2017-3-12 11:33
 
 
 

回复

664

帖子

104

TA的资源

纯净的硅(中级)

4
 
同意沙发。
看下你灯的亮度,或者可以量一下电压。
比如正常亮的时候电压是5V,两下量的是2.5V,那么就是占空比50%的方波,只是频率过快。

点评

我把程序传上来看看  详情 回复 发表于 2017-3-12 11:33
 
 
 

回复

9795

帖子

24

TA的资源

版主

5
 
怎么样了 是二楼说的问题吗

点评

因该不是,传个程序大家看看  详情 回复 发表于 2017-3-12 11:34
 
 
 

回复

1297

帖子

2

TA的资源

纯净的硅(中级)

6
 
闪的太快,亮灭间加上延时吧。或者配置一个定时器,然后在中断里面亮灭

点评

我也多希望是这个问题啊,应该不是,用HAL_Delay一样的  详情 回复 发表于 2017-3-12 11:57
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

7
 
yang_alex 发表于 2017-3-11 22:08
也许速度太快,亮灯时间太短。加个延时试试。

不是吧,一开始用的是Hal_Delay(1000),和datalog里一样,后面写了个软延时,时钟周期4Mhz的话,要看指令周期是几个时钟周期了,里外层循环都调过大小,还是不行,到底那个地方出错了,我把工程传上来大家看看
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

8
 
strong161 发表于 2017-3-11 22:16
首先,你得把你的程序上传一下吧!我猜可能是bootloader被清除了,你可能需要刷下bootloader ,参考http:// ...

不是这个问题,我把工程传一个上来
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

9
 
gs001588 发表于 2017-3-11 22:17
同意沙发。
看下你灯的亮度,或者可以量一下电压。
比如正常亮的时候电压是5V,两下量的是2.5V,那么就是 ...

我把程序传上来看看

点评

解压开看了你的程序,设置有问题呀。 [attachimg]288206[/attachimg] 默认的bootloader是从flash地址0x0800000开始跑程序的,你设置不对自然程序跑不起来,因为你的0x08000000地址内没有东西。  详情 回复 发表于 2017-3-12 12:51
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

10
 
littleshrimp 发表于 2017-3-11 22:31
怎么样了 是二楼说的问题吗

因该不是,传个程序大家看看
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

11
 
johnrey 发表于 2017-3-12 11:27
闪的太快,亮灭间加上延时吧。或者配置一个定时器,然后在中断里面亮灭

我也多希望是这个问题啊,应该不是,用HAL_Delay一样的
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

664

帖子

104

TA的资源

纯净的硅(中级)

12
 
wugx 发表于 2017-3-12 11:33
我把程序传上来看看

解压开看了你的程序,设置有问题呀。


默认的bootloader是从flash地址0x0800000开始跑程序的,你设置不对自然程序跑不起来,因为你的0x08000000地址内没有东西。

点评

sensortile上的,也是,不是你说的问题,不知道是不是那个文件有改过[attachimg]288312[/attachimg]  详情 回复 发表于 2017-3-12 23:25
 
 
 

回复

664

帖子

104

TA的资源

纯净的硅(中级)

13
 


从.map文件可以看到,复位地址指向了0x08004000。
startup_stm32l476xx.o,正是startup_stm32l476xx.s编译生成的。
你的仿真调试时能实现,是因为你选了一个选项,“Load Application at startup”。强制先加载了startup_stm32l476xx.s,而把复位地址指向了0x08004000。

点评

你试了可以?你都没试,而且肯定不对,一开始已经下过bootloader了,以后下程序自然是从程序区起始地址0x08004000开始了,每次下bootloader多麻烦啊  详情 回复 发表于 2017-3-12 16:17
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

14
 
你试了可以?你都没试,而且肯定不对,一开始已经下过bootloader了,以后下程序自然是从程序区起始地址0x08004000开始了,每次下bootloader多麻烦啊
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

15
 
gs001588 发表于 2017-3-12 13:02
从.map文件可以看到,复位地址指向了0x08004000。
startup_stm32l476xx.o,正是startup_stm32l476xx.s ...


你试了可以?你都没试,而且肯定不对,一开始已经下过bootloader了,以后下程序自然是从程序区起始地址0x08004000开始了,每次下bootloader多麻烦啊

点评

你又没说你烧过bootloader,而且你给的程序中也没看到。 而且我也没有你的板,自然没法试。 那你看看,你的片上0x08000000开始的内容是不是正确的bootloader。  详情 回复 发表于 2017-3-12 23:29
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

16
 
gs001588 发表于 2017-3-12 12:51
解压开看了你的程序,设置有问题呀。


默认的bootloader是从flash地址0x0800000开始跑程序的,你设置 ...

sensortile上的,也是,不是你说的问题,不知道是不是那个文件有改过
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

664

帖子

104

TA的资源

纯净的硅(中级)

17
 
wugx 发表于 2017-3-12 16:17
你试了可以?你都没试,而且肯定不对,一开始已经下过bootloader了,以后下程序自然是从程序区起始地址 ...

你又没说你烧过bootloader,而且你给的程序中也没看到。
而且我也没有你的板,自然没法试。
那你看看,你的片上0x08000000开始的内容是不是正确的bootloader。

点评

因该是的,为了对比,前后两次烧过程序,没问题  详情 回复 发表于 2017-3-12 23:32
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

18
 
@nmg 让技术支持看看?几个意思
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

828

帖子

8

TA的资源

一粒金砂(高级)

19
 
本帖最后由 wugx 于 2017-3-12 23:34 编辑
gs001588 发表于 2017-3-12 23:29
你又没说你烧过bootloader,而且你给的程序中也没看到。
而且我也没有你的板,自然没法试。
那你看看, ...

因该是的,为了对比,前后两次烧过程序,没问题,那个文件是加载器吗?不太懂

点评

给个bootloader的hex文件,我导入工程看看程序跳转代码,和占用flash段情况  详情 回复 发表于 2017-3-12 23:38
个人签名人生有许多选项是灰色的、不可选的,但至少你可以选择生活的态度。。。韬光养晦,志存高远http://www.xzroad.com/
 
 
 

回复

664

帖子

104

TA的资源

纯净的硅(中级)

20
 
本帖最后由 gs001588 于 2017-3-12 23:43 编辑
wugx 发表于 2017-3-12 23:32
因该是的,为了对比,前后两次烧过程序,没问题,那个文件是加载器吗?不太懂

给个bootloader的hex文件,我导入工程看看程序跳转代码,和占用flash段情况。无论你什么时候烧写用户代码,自己烧写后的bootloader段内容一点都不能改变,这点可以读出来查看。
实在不行的话,你用串口ISP模式读出来程序看看。

点评

这个是自带的,用st-link utility软件可擦写  详情 回复 发表于 2017-3-13 08:33
没有hex,是bin文件,sensortile自带的  详情 回复 发表于 2017-3-13 08:25
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表