找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 681|回复: 1
打印 上一主题 下一主题
收起左侧

STVD Debug时出现报错flash memory not accessible while core is running

[复制链接]
跳转到指定楼层
楼主


如图,使用STVD编写一个比较简单的程序,发现按键无法完成KEY_Count计数,跳转不到下一步。
进入Debug后,发现执行程序后会跳出这样的错误,网上找了没有解决方法,Vcap电容已经核对过是1uF没有问题。
全部代码在这里,很乱各位大佬将就看,顺便求教哪里写的不好我改一改!

单片机源程序如下:
  1. //main.c


  2. #include "stm8s.h"
  3. #include "gpio.h"

  4. //定义LED_1引脚
  5. #define LED1_ON                                GPIOC->ODR &= ~(1<<7)
  6. #define LED1_OFF                        GPIOC->ODR |= (1<<7)

  7. //定义LED_2引脚
  8. #define LED2_ON                                GPIOC->ODR &= ~(1<<6)
  9. #define LED2_OFF                        GPIOC->ODR |= (1<<6)

  10. //定义LED_3 引脚
  11. #define LED3_ON                                GPIOC->ODR &= ~(1<<5)
  12. #define LED3_OFF                        GPIOC->ODR |= (1<<5)

  13. //按键
  14. #define KEY1                                 (GPIOD->IDR & GPIO_PIN_4)
  15. #define KEY2                                 (GPIOD->IDR & GPIO_PIN_5)

  16.         //定义UV_LED紫外灯引脚
  17. #define UV_LED_ON                  GPIOC->ODR |= (0x01<<4)
  18. #define UV_LED_OFF                    GPIOC->ODR &= ~(0x01<<4)

  19. #define u8  uint8_t
  20. #define u16 uint16_t

  21. u8         Flag =0 ,
  22.         Key1_Flag = 0,
  23.         Mode_Work = 0,
  24.         PWR = 0;
  25. u8 UV_PWR = 0 ;

  26. void Key1_Working(void);

  27. void GPIO_init(void)
  28. {
  29.         //LED1 引脚 PC7 配置
  30.         GPIOC->DDR |= (0x01<<7);//PC7为输出模式
  31.         GPIOC->CR1 |= (0x01<<7);//PC7推挽输出
  32.         
  33.         //LED2 引脚 PC6 配置
  34.         GPIOC->DDR |= (0x01<<6);//PC6为输出模式
  35.         GPIOC->CR1 |= (0x01<<6);//PC6推挽输出
  36.         
  37.         //LED3 引脚 PC5 配置
  38.         GPIOC->DDR |= (0x01<<5);//PC5为输出模式
  39.         GPIOC->CR1 |= (0x01<<5);//PC5推挽输出
  40.         
  41.         GPIOD->DDR |= (0x01<<2);//PD2为输出模式
  42.         GPIOD->CR1 |= (0x01<<2);//PD2推挽输出
  43.         
  44.         GPIOD->DDR |= (0x01<<3);//PD2为输出模式
  45.         GPIOD->CR1 |= (0x01<<3);//PD2推挽输出
  46.                
  47.         //UV_LED紫外灯引脚 PC4 配置
  48.         GPIOC->DDR |= (0x01<<4);//PC4为输出模式
  49.         GPIOC->CR1 |= (0x01<<4);//PC4推挽输出
  50.         
  51.         //LIGHT_LED照明灯引脚 PC3 配置
  52.         GPIOC->DDR |= (0x01<<3);//PC3为输出模式
  53.         GPIOC->CR1 |= (0x01<<3);//PC3推挽输出
  54.         
  55.         //开机定时按键KEY1 引脚 PD4 配置
  56.         GPIOD->DDR &= ~(1<<4);//PD4为输CHU模式
  57.         GPIOD->CR1 |= (0x00<<4);//PD4为上拉模式
  58.         GPIOD->CR2 |= (0x01<<4);//开外部中断
  59.         
  60. }

  61. void SysClkInit( void )
  62. {
  63.   //  CLK->SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率
  64.     CLK->CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
  65. }

  66. void Delay(u16 Count)//延时1*Conut ms
  67. {
  68.         u8 i,j;
  69.         while(Count--)
  70.         {
  71.                 for(i=0;i<100;i++);
  72.                 for(j=0;j<50 ;j++);
  73.         }
  74. }


  75. void Res_Ctrl(void)
  76. {
  77.         UV_LED_OFF;
  78.         LED1_OFF;
  79.         LED2_OFF;
  80.         LED3_OFF;
  81. }


  82. //PWM输出设置
  83. /***********************************************************
  84. 函 数 名:        TIM1_PWM_SET  
  85. 函数描述:  TIM1输出比较功能初始化。
  86. ***********************************************************/
  87. void TIM1_PWM_SET(void)
  88. {
  89.         TIM1->ARRH = 16000/256;
  90.         TIM1->ARRL = 16000%256;
  91.         TIM1->CR1  &= 0x8F;                        //向上计数模式边沿对齐        
  92.         TIM1->CR1  |= 0x01;                        //使能TIM1计数器功能CEN=1
  93.         TIM1->BKR   = 0x80;                        //打开主输出开关输出PWM信号MOE=1               
  94. }

  95. /***********************************************************
  96. 函 数 名:        CHx_PWM_SET  
  97. 函数描述:  TIM1_CHx通道PWM信号输出配置〉调节频率占空比。
  98. 参    数:  unsigned long F_CHx,        频率
  99.                         float Duty_CHx                        占空比*100
  100. 备    注:        正常占空比参数计算公式为c = Duty_CH3 * F_CH3,
  101.                         占空比为小数,如0.1、0.2。为线性点亮,占空比扩大100倍,
  102.                         计算公式改为c = Duty_CH3 * F_CH3 / 100;        
  103. ***********************************************************/
  104.         
  105. void CH4_PWM_SET(unsigned long F_CH4,float Duty_CH4)
  106. {
  107.         float d;
  108.         d = Duty_CH4 * F_CH4 / 100;                                        //计算占空比参数
  109.         TIM1->CCR4H = ((u16)(d))/256;
  110.         TIM1->CCR4L = ((u16)(d))%256;
  111.         TIM1->CCMR4   = 0x60;                                                //配置PWM为模式1
  112.         TIM1->CCER2  &= 0x1F;                                                //CC3P=0,OC3信号高电平有效
  113.         TIM1->CCER2  |= 0x10;                                                //CC3E=1,使能OC3输出
  114.         TIM1->OISR   |= 0x40;                                                //空闲状态时OC3为高电平
  115. }

复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1047058 发表于 2022-11-7 17:32 | 只看该作者
  1. void LED_PWM(u16 LED_Flag)
  2. {
  3. int n = 0;
  4. if(LED_Flag==1)
  5. {
  6. for(n=0;n<91;n++)        //传递占空比参数,m从0~90缓慢点亮
  7. {
  8. CH4_PWM_SET(16000,n);
  9. Delay(500);        //为使点亮平缓线性,延迟500ms
  10. }
  11. LED_Flag = 0;
  12. }
  13. if(LED_Flag==2)
  14. {
  15. for(n=91;n>50;n--)        //传递占空比参数,m从0~90缓慢点亮
  16. {
  17. CH4_PWM_SET(16000,n);
  18. Delay(500);        //为使点亮平缓线性,延迟500ms
  19. }
  20. LED_Flag = 0;
  21. }

  22. if(LED_Flag==3)
  23. {
  24. for(n=51;n>20;n--)        //传递占空比参数,m从0~90缓慢点亮
  25. {
  26. CH4_PWM_SET(16000,n);
  27. Delay(500);        //为使点亮平缓线性,延迟500ms
  28. }
  29. LED_Flag = 0;
  30. }


  31. }


  32. void Level1(void)
  33. {
  34. LED1_ON;
  35. LED2_OFF;
  36. LED3_OFF;
  37. LED_PWM(1);
  38. }

  39. void Level2(void)
  40. {
  41. LED1_OFF;
  42. LED2_ON;
  43. LED3_OFF;

  44. LED_PWM(2);
  45. }

  46. void Level3(void)
  47. {
  48. LED1_OFF;
  49. LED2_OFF;
  50. LED3_ON;

  51. LED_PWM(3);
  52. }

  53. void Level4(void)
  54. {
  55. int t;
  56. while(1)
  57. {
  58. for(t=0;t<3;t++)
  59. {
  60. CH4_PWM_SET(16000,20);
  61. Delay(3000);
  62. }
  63. CH4_PWM_SET(0,0);
  64. Delay(30000);
  65. }
  66. }

  67. /***********************************************************
  68. 函 数 名:        Key1_Working
  69. 函数描述: 开机控制按键配置
  70. 参 数: LED_Count---------LED闪烁次数;
  71. Key1_Flag---------Key1按键计数,全局变量;
  72. Flag--------------开关机标志位,全局变量;
  73. 备 注: 1、按一次开机,蜂鸣器响两次,亮电源绿灯;
  74. 2、按键情况执行:
  75. 1)开机;
  76. 2)高档亮度;
  77. 3)中档亮度;
  78. 4)低档亮度;
  79. 5)爆闪SOS;
  80. 6)关机;
  81. ***********************************************************/
  82. void Key1_Working(void)
  83. {       
  84. u8 LED_Count = 0 ; //LED闪烁次数

  85. switch(Key1_Flag)
  86. {       
  87. case 1://开机,高档亮度;
  88. Level1();
  89. Flag=1;        //开关机标志位为1
  90. break;

  91. case 2://中档亮度;
  92. Level2();       
  93. break;

  94. case 3://低档亮度;
  95. Level3();
  96. break;

  97. case 4://爆闪SOS;
  98. Level4();
  99. break;

  100. case 5://关机;

  101. Res_Ctrl();        //复位,所有功能关闭
  102. Key1_Flag = 0;        //按键计数为0
  103. Delay(500);       
  104. Flag = 0 ;        //开关机标志位为0
  105. break;       
  106. default: break;       
  107. }
  108. }







  109. void main(void)
  110. {
  111. Res_Ctrl();
  112. GPIO_init();
  113. SysClkInit();
  114. TIM1_PWM_SET();
  115. //EXTI_Init();
  116. while(1)
  117. {
  118. if(KEY1==0)        //检测到KEY1按下
  119. {
  120. Delay(1000);        //消抖
  121. Key1_Flag++;        //开始按键计数
  122. Key1_Working(); //执行Key1控制函数
  123. while(KEY1==0); //若真,则一直进入死循环;若假,则跳过

  124. }
  125. }


  126. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表